diff --git a/.hgtags b/.hgtags
index f9c707e0ac..92a6f5f93f 100644
--- a/.hgtags
+++ b/.hgtags
@@ -76,3 +76,4113 @@ d9b57e6f051b3cb02b50c296901d3541f405535a product_cost_history-5.8.0
006cf7af618bbbba88ec3a16b5f04af8043abea7 product_cost_history-6.0.0
0000000000000000000000000000000000000000 6.0.1
875a160abb2f93d7695478466f583306a74b2f32 product_cost_history-6.0.1
+e691d78975ca7ed1a4c564f661c3a9f3dba8b80e 6.0.0
+ba3972ec66c3dc4de587180901fc0b12f0284ef0 6.0.1
+670745940ef8a8a31dd6f9d5b2a2f594f4d8fac6 6.0.2
+6c446db11f23076b4d425c0093e6afebf8133d28 6.0.3
+a09cc46daac3ff43a23cb3904432c8494bce5ccf 6.0.4
+0000000000000000000000000000000000000000 6.0.0
+e691d78975ca7ed1a4c564f661c3a9f3dba8b80e product_cost_warehouse-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+ba3972ec66c3dc4de587180901fc0b12f0284ef0 product_cost_warehouse-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+670745940ef8a8a31dd6f9d5b2a2f594f4d8fac6 product_cost_warehouse-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+6c446db11f23076b4d425c0093e6afebf8133d28 product_cost_warehouse-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+a09cc46daac3ff43a23cb3904432c8494bce5ccf product_cost_warehouse-6.0.4
+5c700fb83cb0c30a562930216535350910ceeb9f 1.0.0
+5228559145e125737c473986973d4c8c474fc48b 1.2.0
+f842ba7aea91b52a34fe80ed0739f8e3cba80c7f 1.4.0
+0021ba35067abe399cfc84de2e87ac7687fa44c4 1.6.0
+69594771004e2cdf9544b66dfc0d5a573c733ca9 1.8.0
+07fd0bfc7e48a52f3a9298c016704dcfbbb002da 2.0.0
+6136f2cc33af280d251399d67399a2f6e854c9ca 2.2.0
+bbaadb49d3a2043d116d95bfe839a34ea4c39b3e 2.4.0
+13bb103b0c306546e04650df7ef220788815940d 2.6.0
+068ba300a88e92ba0006da1c3e4f38d55735d330 2.8.0
+f12b310c171a7db2ccc6b5ef8124b2226c43cd95 3.0.0
+33fe56cf3761d7218224b99b0d5f91c03a66d5f8 3.2.0
+3d5d38b4e1ffefc96d2f246a0a94f891954bfa2f 3.4.0
+88274ee63deab532817641c9ecb08ea64261994a 3.6.0
+a08cb664e6f2e8d08f82131cef9ad12680605bad 3.8.0
+72aaaea3ff8c1c6dc2525e487e2c03eeb5c315d1 4.0.0
+e7e236366a9170e2d85fce89cfe30a72486c7083 4.2.0
+286ab66032df8d2e64cce967733fd0277ee8bbb7 4.4.0
+a7f5ca3135909c239a8e965c5f1e367cc29e001b 4.6.0
+5e6f6ac7401c09065b6294146d14ca153a4a7bcb 4.8.0
+3bf4f180f9ebe292fb86ca1a8a09dbb30bfbe739 5.0.0
+72b5aa12a39ae4573ae1a046273510100262dac1 5.2.0
+cf6cb22c72cb9e19d2ea149c81fbf5bdcad9e062 5.4.0
+92554274ffe098b2b6181a89f3668a47aa50826c 5.6.0
+22de80c0f40fbc967c94a4a762153b62ce776948 5.8.0
+6dfd09007fb685c35f0dbc32d844e95a8c787a87 6.0.0
+1cf1007d7e5c91590ab21ea125f9f82fc718cf1c 6.0.1
+d0b8706d83d84269813b165f1b4b10b95d0ce768 6.0.2
+2957bb41ee4381dcb9187455663a314e9d021229 6.0.3
+0000000000000000000000000000000000000000 1.0.0
+5c700fb83cb0c30a562930216535350910ceeb9f product-1.0.0
+0000000000000000000000000000000000000000 1.2.0
+5228559145e125737c473986973d4c8c474fc48b product-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+f842ba7aea91b52a34fe80ed0739f8e3cba80c7f product-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+0021ba35067abe399cfc84de2e87ac7687fa44c4 product-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+69594771004e2cdf9544b66dfc0d5a573c733ca9 product-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+07fd0bfc7e48a52f3a9298c016704dcfbbb002da product-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+6136f2cc33af280d251399d67399a2f6e854c9ca product-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+bbaadb49d3a2043d116d95bfe839a34ea4c39b3e product-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+13bb103b0c306546e04650df7ef220788815940d product-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+068ba300a88e92ba0006da1c3e4f38d55735d330 product-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+f12b310c171a7db2ccc6b5ef8124b2226c43cd95 product-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+33fe56cf3761d7218224b99b0d5f91c03a66d5f8 product-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+3d5d38b4e1ffefc96d2f246a0a94f891954bfa2f product-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+88274ee63deab532817641c9ecb08ea64261994a product-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+a08cb664e6f2e8d08f82131cef9ad12680605bad product-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+72aaaea3ff8c1c6dc2525e487e2c03eeb5c315d1 product-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+e7e236366a9170e2d85fce89cfe30a72486c7083 product-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+286ab66032df8d2e64cce967733fd0277ee8bbb7 product-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+a7f5ca3135909c239a8e965c5f1e367cc29e001b product-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+5e6f6ac7401c09065b6294146d14ca153a4a7bcb product-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+3bf4f180f9ebe292fb86ca1a8a09dbb30bfbe739 product-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+72b5aa12a39ae4573ae1a046273510100262dac1 product-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+cf6cb22c72cb9e19d2ea149c81fbf5bdcad9e062 product-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+92554274ffe098b2b6181a89f3668a47aa50826c product-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+22de80c0f40fbc967c94a4a762153b62ce776948 product-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+6dfd09007fb685c35f0dbc32d844e95a8c787a87 product-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+1cf1007d7e5c91590ab21ea125f9f82fc718cf1c product-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+d0b8706d83d84269813b165f1b4b10b95d0ce768 product-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+2957bb41ee4381dcb9187455663a314e9d021229 product-6.0.3
+76447c0bdb29cefe5d24cd8fdeaa2c5af0f695e4 2.4.0
+7ef7e0f6fae5def5d7f2a7b698da1471c9d8ed0e 2.6.0
+88d443a8e2580f3272eb4700026513957ff9dec1 2.8.0
+eca495047f9d107105cabb5f9b0e437e0b068e31 3.0.0
+2420a18635224939f495d3ed32e695365766f21c 3.2.0
+99632131f152e452bf50334c58010e142f161800 3.4.0
+9e056cdb04b13c9d8785c4ef78a9a51493134763 3.6.0
+3fc8a8335f6e73de19c286bb62a68a1f59ebf3fe 3.8.0
+71b273a2b1d035d6ec4a1cb2174c7fef617dbdba 4.0.0
+4bc086a0c459567fb36b63f008ab28d08e9c0eb8 4.2.0
+5398a67a74091c04a6f3d2ebf5fcc20acd146e19 4.4.0
+609846f660a1f23dd4eee48ad2f2c97a60497fe7 4.6.0
+6f832a35853eb78276b4a637cfe1f33fd8ad0599 4.8.0
+1a1ebedf876f9e936c22a6db80f4e4bf2b5caafb 5.0.0
+61a3f3457663550c06c2a2a90f6948a4c239b364 5.2.0
+c607cad71e075145b7d634b0f39eb406244f819a 5.4.0
+e3be090ae5171a2430ae8374c123b7bba22662bb 5.6.0
+5bf7f5bafb9cef56c9e72ead15dc2637c19a0819 5.8.0
+68edcbd53832d64cff93cf1a06fd9e6e5d716b19 6.0.0
+023e6fe15a452590885675bf1027860ea2f89851 6.0.1
+356cd619c3b97d36d2b770a527f22128cc7fda6d 6.0.2
+201d7b402d4cc48ea5899659aa4572c7fa5db62c 6.0.3
+1ad5b29100e359572fa7f873a3430c967df0b3c5 6.0.4
+0000000000000000000000000000000000000000 2.4.0
+76447c0bdb29cefe5d24cd8fdeaa2c5af0f695e4 production-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+7ef7e0f6fae5def5d7f2a7b698da1471c9d8ed0e production-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+88d443a8e2580f3272eb4700026513957ff9dec1 production-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+eca495047f9d107105cabb5f9b0e437e0b068e31 production-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+2420a18635224939f495d3ed32e695365766f21c production-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+99632131f152e452bf50334c58010e142f161800 production-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+9e056cdb04b13c9d8785c4ef78a9a51493134763 production-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+3fc8a8335f6e73de19c286bb62a68a1f59ebf3fe production-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+71b273a2b1d035d6ec4a1cb2174c7fef617dbdba production-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+4bc086a0c459567fb36b63f008ab28d08e9c0eb8 production-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+5398a67a74091c04a6f3d2ebf5fcc20acd146e19 production-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+609846f660a1f23dd4eee48ad2f2c97a60497fe7 production-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+6f832a35853eb78276b4a637cfe1f33fd8ad0599 production-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+1a1ebedf876f9e936c22a6db80f4e4bf2b5caafb production-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+61a3f3457663550c06c2a2a90f6948a4c239b364 production-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+c607cad71e075145b7d634b0f39eb406244f819a production-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+e3be090ae5171a2430ae8374c123b7bba22662bb production-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+5bf7f5bafb9cef56c9e72ead15dc2637c19a0819 production-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+68edcbd53832d64cff93cf1a06fd9e6e5d716b19 production-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+023e6fe15a452590885675bf1027860ea2f89851 production-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+356cd619c3b97d36d2b770a527f22128cc7fda6d production-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+201d7b402d4cc48ea5899659aa4572c7fa5db62c production-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+1ad5b29100e359572fa7f873a3430c967df0b3c5 production-6.0.4
+784ac68b9768d82a6dd06732aee6627d588b7695 5.0.0
+7a17af440e5852c1dd13bcfa5eca58407c08aa91 5.2.0
+a665a605360aab19854a0ff5aa37eb249a8fac7b 5.4.0
+b9418132fd61d8a9dc13367231d413cc242dd017 5.6.0
+31496d5df63928ccdaeee65b0276caac4e702a93 5.8.0
+d581210b3d284f7541bbbe2017397633732a0f94 6.0.0
+0000000000000000000000000000000000000000 5.0.0
+784ac68b9768d82a6dd06732aee6627d588b7695 production_outsourcing-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+7a17af440e5852c1dd13bcfa5eca58407c08aa91 production_outsourcing-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+a665a605360aab19854a0ff5aa37eb249a8fac7b production_outsourcing-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+b9418132fd61d8a9dc13367231d413cc242dd017 production_outsourcing-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+31496d5df63928ccdaeee65b0276caac4e702a93 production_outsourcing-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+d581210b3d284f7541bbbe2017397633732a0f94 production_outsourcing-6.0.0
+7e8db653c6d6f7d09744d8ab3fa82e07f1537c4c 4.0.0
+de983ade84014cfa81a300a58b5c37f99b5f52a2 4.2.0
+cedad4d9697b9484133cd34c84de99a5411c0674 4.4.0
+326e72da9af7bdad72215829098191c86db744a5 4.6.0
+028b0358af9feb31aa72cfd4402ad1825be58eb2 4.8.0
+9cc342626006b205fb2b4f36c1971f69c683f9c4 5.0.0
+9f5b7feaacaae934a5fba88eb5b3108a286afc4c 5.2.0
+199c8dadffc7f3214c852adf1ebdd95b407ff366 5.4.0
+596f26e10ffb811d761786c23514a9f456b68f7a 5.6.0
+b4bad02103f36697dd0bf7584dc31c45a0445fe2 5.8.0
+fe25266ba1025a6eccece18d99f07d259aaa8bd5 6.0.0
+0000000000000000000000000000000000000000 4.0.0
+7e8db653c6d6f7d09744d8ab3fa82e07f1537c4c production_routing-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+de983ade84014cfa81a300a58b5c37f99b5f52a2 production_routing-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+cedad4d9697b9484133cd34c84de99a5411c0674 production_routing-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+326e72da9af7bdad72215829098191c86db744a5 production_routing-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+028b0358af9feb31aa72cfd4402ad1825be58eb2 production_routing-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+9cc342626006b205fb2b4f36c1971f69c683f9c4 production_routing-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+9f5b7feaacaae934a5fba88eb5b3108a286afc4c production_routing-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+199c8dadffc7f3214c852adf1ebdd95b407ff366 production_routing-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+596f26e10ffb811d761786c23514a9f456b68f7a production_routing-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+b4bad02103f36697dd0bf7584dc31c45a0445fe2 production_routing-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+fe25266ba1025a6eccece18d99f07d259aaa8bd5 production_routing-6.0.0
+9a3a8522f572a5609a0c837749b8b666e80e72d1 4.2.0
+fea55bcf6cb377df876097f25cc422da176e8c92 4.4.0
+4fbc768c548070d549b31a9edc5de2264da92f5f 4.6.0
+971465e7061a139808a914fbd3a4f4403e1923df 4.8.0
+83345963a283f9d5a98e9bc7987ef7f6b74dd9b0 5.0.0
+c5dcc857cdbc8bd6915fdb0ea31a487aaedfee65 5.2.0
+37ede33a72691d3ce95e7b91f381bd779cbbe0d8 5.4.0
+1803eedfbc0cc61143c7f97f83acec899a8b96f5 5.6.0
+5b26b9fcae3e392a99e35d8a274563e0009bcb7e 5.8.0
+44e28483ad6bc6de5d49255b1ba278f05f33132b 6.0.0
+0000000000000000000000000000000000000000 4.2.0
+9a3a8522f572a5609a0c837749b8b666e80e72d1 production_split-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+fea55bcf6cb377df876097f25cc422da176e8c92 production_split-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+4fbc768c548070d549b31a9edc5de2264da92f5f production_split-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+971465e7061a139808a914fbd3a4f4403e1923df production_split-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+83345963a283f9d5a98e9bc7987ef7f6b74dd9b0 production_split-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+c5dcc857cdbc8bd6915fdb0ea31a487aaedfee65 production_split-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+37ede33a72691d3ce95e7b91f381bd779cbbe0d8 production_split-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+1803eedfbc0cc61143c7f97f83acec899a8b96f5 production_split-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+5b26b9fcae3e392a99e35d8a274563e0009bcb7e production_split-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+44e28483ad6bc6de5d49255b1ba278f05f33132b production_split-6.0.0
+6ace1ede64e3898c024beaacb0a90c94a071b64f 4.0.0
+5f493aca74a59f1b226cb44df3684d29b21a7576 4.2.0
+1d94c7f3bccbbba7f7b732382ac3b39f65208592 4.4.0
+5ce64110634dbdb5cf17cf039b0d02a9e92f660a 4.6.0
+0144223350c807cc0088e5d93d6e462a26c2661b 4.8.0
+a0e9d9263bfaff0ae63db012fe822584b5102a2e 5.0.0
+730488adfacfedd7462a80452e8d1f22aa2e663b 5.2.0
+7700e04bb23f095e4311ce2773973dc2f7167353 5.4.0
+47d447fa9cd6d5b94ddf063ae9dca91a75ca3eca 5.6.0
+4a45a46f75d352e1f43032489b66d608d3e7ae37 5.8.0
+0dee91a5bba5a180da197b0d6814350395116cf5 6.0.0
+0000000000000000000000000000000000000000 4.0.0
+6ace1ede64e3898c024beaacb0a90c94a071b64f production_work-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+5f493aca74a59f1b226cb44df3684d29b21a7576 production_work-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+1d94c7f3bccbbba7f7b732382ac3b39f65208592 production_work-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+5ce64110634dbdb5cf17cf039b0d02a9e92f660a production_work-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+0144223350c807cc0088e5d93d6e462a26c2661b production_work-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+a0e9d9263bfaff0ae63db012fe822584b5102a2e production_work-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+730488adfacfedd7462a80452e8d1f22aa2e663b production_work-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+7700e04bb23f095e4311ce2773973dc2f7167353 production_work-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+47d447fa9cd6d5b94ddf063ae9dca91a75ca3eca production_work-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+4a45a46f75d352e1f43032489b66d608d3e7ae37 production_work-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+0dee91a5bba5a180da197b0d6814350395116cf5 production_work-6.0.0
+ec946e7b8c68c6c5c86a35c2b8f0c784396467b7 4.2.0
+052c6a2d44db1b03c07281d0a6fdc32a41eee618 4.4.0
+ac6f32502e0b4696f5186b1334314a81d95f98da 4.6.0
+f0855cba83819cb8105075c367bcee059887ce98 4.8.0
+d21380469b68453e70ef08029f3f33cfa66db74c 5.0.0
+b04874b0458222d2fdfcb03c2d4c1aa059eb32a5 5.2.0
+fd57f1b552bba3f7ac7f30fbfedf58b865997d6a 5.4.0
+cb829d41fa1ec4e3c8c3135120539fb76533510e 5.6.0
+e801e613b26aca5c8feddb0e0fcd0d3092dd90f7 5.8.0
+410cee9fabf8c97f0a8dbee25c3c0a057701b9c5 6.0.0
+0000000000000000000000000000000000000000 4.2.0
+ec946e7b8c68c6c5c86a35c2b8f0c784396467b7 production_work_timesheet-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+052c6a2d44db1b03c07281d0a6fdc32a41eee618 production_work_timesheet-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+ac6f32502e0b4696f5186b1334314a81d95f98da production_work_timesheet-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+f0855cba83819cb8105075c367bcee059887ce98 production_work_timesheet-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+d21380469b68453e70ef08029f3f33cfa66db74c production_work_timesheet-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+b04874b0458222d2fdfcb03c2d4c1aa059eb32a5 production_work_timesheet-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+fd57f1b552bba3f7ac7f30fbfedf58b865997d6a production_work_timesheet-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+cb829d41fa1ec4e3c8c3135120539fb76533510e production_work_timesheet-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+e801e613b26aca5c8feddb0e0fcd0d3092dd90f7 production_work_timesheet-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+410cee9fabf8c97f0a8dbee25c3c0a057701b9c5 production_work_timesheet-6.0.0
+d2c308a903901846cfb89a98aec690df78c00874 6.0.0
+1723e2aab431cb050e3cf6a3a84e5b3a7e8d19c1 6.0.1
+80eb6b2a5db5a6964fd03482150621925ccfc37d 6.0.2
+53de9080d164fb42345ee0a09df7a7771d35d8b7 6.0.3
+e51951d4695e0f644e428c55a1f874e2cd69dffb 6.0.4
+b21c2112045a96add09c70ff1a69d9c4e59252d6 6.0.5
+b2d174cea56fc4d263174bba9c7e4dbdb72ac547 6.0.6
+2acac20cf27e066d9a85f916abbacd47f44dc61b 6.0.7
+77bf738523d5f7e4077cf156bff7e8c347b0b0d2 6.0.8
+2c3c0e3c2516dd7eceedb4cd493b606f34237e2d 6.0.9
+08b2075af8111b81446fa1ce096511ea6c7872e4 6.0.10
+0000000000000000000000000000000000000000 6.0.0
+d2c308a903901846cfb89a98aec690df78c00874 product_kit-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+1723e2aab431cb050e3cf6a3a84e5b3a7e8d19c1 product_kit-6.0.1
+0000000000000000000000000000000000000000 6.0.10
+08b2075af8111b81446fa1ce096511ea6c7872e4 product_kit-6.0.10
+0000000000000000000000000000000000000000 6.0.2
+80eb6b2a5db5a6964fd03482150621925ccfc37d product_kit-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+53de9080d164fb42345ee0a09df7a7771d35d8b7 product_kit-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+e51951d4695e0f644e428c55a1f874e2cd69dffb product_kit-6.0.4
+0000000000000000000000000000000000000000 6.0.5
+b21c2112045a96add09c70ff1a69d9c4e59252d6 product_kit-6.0.5
+0000000000000000000000000000000000000000 6.0.6
+b2d174cea56fc4d263174bba9c7e4dbdb72ac547 product_kit-6.0.6
+0000000000000000000000000000000000000000 6.0.7
+2acac20cf27e066d9a85f916abbacd47f44dc61b product_kit-6.0.7
+0000000000000000000000000000000000000000 6.0.8
+77bf738523d5f7e4077cf156bff7e8c347b0b0d2 product_kit-6.0.8
+0000000000000000000000000000000000000000 6.0.9
+2c3c0e3c2516dd7eceedb4cd493b606f34237e2d product_kit-6.0.9
+f31e6d75598ca677557eb4471c555fefc4bc2abb 2.4.0
+ec998616abb5eadbac5b698dc247f92f4fd624b1 2.6.0
+b03a52bf71b06dceaf3a61ea369e2435876ba55b 2.8.0
+d8dc5496f0d865fa34b7ed1bcf9e99cd0b5ce843 3.0.0
+91c5f4f0c3977d8c6fe148c0f879f45cb8393908 3.2.0
+7eef66ae30b491840535a2ff0136d17d1a416c65 3.4.0
+b6a0f7bda1908f1d7612297c1dc8f590a6a2709c 3.6.0
+46ba244cd30ba2b3d8089cf67edcb6d033459cdc 3.8.0
+b3daf78dd30c7504a238e75cd5354f884b2ab409 4.0.0
+3aaf092f9e7a9d92379fdb1d52a45971b529d548 4.2.0
+c22b5b95ad82716dc13331b25eaf58ce091b94c1 4.4.0
+86a0f203093dfb2fd08c16c7645dfad33b4a70bc 4.6.0
+724e7983d2edd13be4bd77e75dd0fd4c04531a56 4.8.0
+a177f9ab1861d55d8655c6b6c1a153af7c7c47cb 5.0.0
+683b9a660ff35efac857fec1f54f5b4be4827d08 5.2.0
+bff0c9923e8e8b659c572163ced0619d2cfd249b 5.4.0
+848b8acd0b4d3c0fe1b858321bd1b1d623936a0f 5.6.0
+9bb7e13ad995e7b5b000d3f07ad59edd451701b3 5.8.0
+889d8706f279bfc2d02ce4e0cdefcefb749b1d63 6.0.0
+0000000000000000000000000000000000000000 2.4.0
+f31e6d75598ca677557eb4471c555fefc4bc2abb product_measurements-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+ec998616abb5eadbac5b698dc247f92f4fd624b1 product_measurements-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+b03a52bf71b06dceaf3a61ea369e2435876ba55b product_measurements-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+d8dc5496f0d865fa34b7ed1bcf9e99cd0b5ce843 product_measurements-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+91c5f4f0c3977d8c6fe148c0f879f45cb8393908 product_measurements-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+7eef66ae30b491840535a2ff0136d17d1a416c65 product_measurements-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+b6a0f7bda1908f1d7612297c1dc8f590a6a2709c product_measurements-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+46ba244cd30ba2b3d8089cf67edcb6d033459cdc product_measurements-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+b3daf78dd30c7504a238e75cd5354f884b2ab409 product_measurements-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+3aaf092f9e7a9d92379fdb1d52a45971b529d548 product_measurements-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+c22b5b95ad82716dc13331b25eaf58ce091b94c1 product_measurements-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+86a0f203093dfb2fd08c16c7645dfad33b4a70bc product_measurements-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+724e7983d2edd13be4bd77e75dd0fd4c04531a56 product_measurements-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+a177f9ab1861d55d8655c6b6c1a153af7c7c47cb product_measurements-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+683b9a660ff35efac857fec1f54f5b4be4827d08 product_measurements-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+bff0c9923e8e8b659c572163ced0619d2cfd249b product_measurements-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+848b8acd0b4d3c0fe1b858321bd1b1d623936a0f product_measurements-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+9bb7e13ad995e7b5b000d3f07ad59edd451701b3 product_measurements-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+889d8706f279bfc2d02ce4e0cdefcefb749b1d63 product_measurements-6.0.0
+bdb0595b514c5b2697819fe2970b20b1b385aef4 4.4.0
+15b852336776da6ced74da77186d1a198b5d2744 4.6.0
+a3d90a18097b8fb75a05dfbc36a58d203f63b922 4.8.0
+783c847401a64fbc5e02f6a53e0e5b98ea127259 5.0.0
+09d098f48543850ac85d4e32cb3860e78a176b86 5.2.0
+a1a6a82f29e5dd64eb98171605b65928a9665545 5.4.0
+19147ac896aa0471dd9083c03915022169c162d2 5.6.0
+a6770538fc965a9d969495821109ae4a557be8d2 5.8.0
+a715a010e9d49dcb76c93653b28002ab501b6c44 6.0.0
+cffb44afa9e1d75ef272559219095163abfd49a5 6.0.1
+0000000000000000000000000000000000000000 4.4.0
+bdb0595b514c5b2697819fe2970b20b1b385aef4 product_price_list_dates-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+15b852336776da6ced74da77186d1a198b5d2744 product_price_list_dates-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+a3d90a18097b8fb75a05dfbc36a58d203f63b922 product_price_list_dates-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+783c847401a64fbc5e02f6a53e0e5b98ea127259 product_price_list_dates-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+09d098f48543850ac85d4e32cb3860e78a176b86 product_price_list_dates-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+a1a6a82f29e5dd64eb98171605b65928a9665545 product_price_list_dates-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+19147ac896aa0471dd9083c03915022169c162d2 product_price_list_dates-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+a6770538fc965a9d969495821109ae4a557be8d2 product_price_list_dates-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+a715a010e9d49dcb76c93653b28002ab501b6c44 product_price_list_dates-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+cffb44afa9e1d75ef272559219095163abfd49a5 product_price_list_dates-6.0.1
+6b8a2acf88fc3b594b049d4cc9d988f90ea7d7c1 1.4.0
+0c2268414e42f760d201d503884ae4af4c1445c9 1.6.0
+f5dbbd2c4ac2c879d121cb3397d30ee247c79a87 1.8.0
+ae3ff42f1c532c3b855152cfd51d87b23c64466c 2.0.0
+308b18317737193a6208eda24f99a1ef7e8701f3 2.2.0
+17f53519fb48b5fd52096352d5383bab07d8a431 2.4.0
+f4cdb230282c7fe44f582837cb7df83f3ce900f4 2.6.0
+5d6d4ee50f961ed550d3e23bbbd4ddf194646583 2.8.0
+a9de22283047675ecc312f0a7982c9b7b848372d 3.0.0
+21d9e9d7da5f8975ee3c5097e590f693405cf72f 3.2.0
+7726573ef30ae7f80d34a375aca5df3781def3f9 3.4.0
+31f82bca7e6371061af32bd1c42837b214da882b 3.6.0
+a205d8d04f9098dc571961336e4dade49f8bfd81 3.8.0
+5d7ebe1aab9c3e7ef539a72b54dc2e8cde94ae07 4.0.0
+cb6d5202c6e77e4c2ea82eed1a893b3c251a3bb1 4.2.0
+31c930ddc3338258c6ae5b649ef6985137f3d3bb 4.4.0
+25c298b5464796da4ca4e27bf779d46834d06507 4.6.0
+c0fc6ee9b062d21eba99260a7233aed92dae7f67 4.8.0
+32ee69ddd528fb464907a8a34ae7bdf7514f8c8f 5.0.0
+905ec6c64da5676b279d300ec92f9b79304319ea 5.2.0
+4a915ea1dcb8283793fe7a7ee207897376ad82f5 5.4.0
+ca6cf2121b115188ca3af96578360379c5e036b8 5.6.0
+e9e6671a3d42396a786ca99bf49be2c9c5ee8580 5.8.0
+4810272d45a557c6b9e5beb316148e4a9ae9ee74 6.0.0
+0000000000000000000000000000000000000000 1.4.0
+6b8a2acf88fc3b594b049d4cc9d988f90ea7d7c1 product_price_list-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+0c2268414e42f760d201d503884ae4af4c1445c9 product_price_list-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+f5dbbd2c4ac2c879d121cb3397d30ee247c79a87 product_price_list-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+ae3ff42f1c532c3b855152cfd51d87b23c64466c product_price_list-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+308b18317737193a6208eda24f99a1ef7e8701f3 product_price_list-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+17f53519fb48b5fd52096352d5383bab07d8a431 product_price_list-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+f4cdb230282c7fe44f582837cb7df83f3ce900f4 product_price_list-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+5d6d4ee50f961ed550d3e23bbbd4ddf194646583 product_price_list-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+a9de22283047675ecc312f0a7982c9b7b848372d product_price_list-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+21d9e9d7da5f8975ee3c5097e590f693405cf72f product_price_list-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+7726573ef30ae7f80d34a375aca5df3781def3f9 product_price_list-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+31f82bca7e6371061af32bd1c42837b214da882b product_price_list-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+a205d8d04f9098dc571961336e4dade49f8bfd81 product_price_list-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+5d7ebe1aab9c3e7ef539a72b54dc2e8cde94ae07 product_price_list-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+cb6d5202c6e77e4c2ea82eed1a893b3c251a3bb1 product_price_list-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+31c930ddc3338258c6ae5b649ef6985137f3d3bb product_price_list-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+25c298b5464796da4ca4e27bf779d46834d06507 product_price_list-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+c0fc6ee9b062d21eba99260a7233aed92dae7f67 product_price_list-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+32ee69ddd528fb464907a8a34ae7bdf7514f8c8f product_price_list-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+905ec6c64da5676b279d300ec92f9b79304319ea product_price_list-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+4a915ea1dcb8283793fe7a7ee207897376ad82f5 product_price_list-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+ca6cf2121b115188ca3af96578360379c5e036b8 product_price_list-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+e9e6671a3d42396a786ca99bf49be2c9c5ee8580 product_price_list-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+4810272d45a557c6b9e5beb316148e4a9ae9ee74 product_price_list-6.0.0
+a41ab46325590d8a0dcde335fcb8293d7ecefdca 5.0.0
+8cf6513c6271e3b9fe13b87690b60147fd8fa1ad 5.2.0
+ec723638946e0b0d619ff4a398ecb14af7b85d3a 5.4.0
+12a429374c0d19ed1cd41d731e9290f300540de5 5.6.0
+f7be249077be1eaa6d10caffafb7f4fc623677ee 5.8.0
+b16658dcc04012a8b3f83267619f4fc7ea379c6f 6.0.0
+0000000000000000000000000000000000000000 5.0.0
+a41ab46325590d8a0dcde335fcb8293d7ecefdca product_price_list_parent-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+8cf6513c6271e3b9fe13b87690b60147fd8fa1ad product_price_list_parent-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+ec723638946e0b0d619ff4a398ecb14af7b85d3a product_price_list_parent-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+12a429374c0d19ed1cd41d731e9290f300540de5 product_price_list_parent-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+f7be249077be1eaa6d10caffafb7f4fc623677ee product_price_list_parent-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+b16658dcc04012a8b3f83267619f4fc7ea379c6f product_price_list_parent-6.0.0
+3021dcbbc79ad8ad44ae9dc9cfefcfad3a672c02 1.4.0
+995ccbdf6a1a7f18e8c9f792ac7f73aaf913c0cf 1.6.0
+83ef6ae1332ef699447299bdac2e30990adaa441 1.8.0
+a93fda9a96db2a49c2ba5e077e6572fc94b8b1de 2.0.0
+5ae9435cbd71b0097fff11938aa90662e298cef0 2.2.0
+f8a3764421ee95566a8a096ff19de32fe971da2f 2.4.0
+2c498052d09a8eea38664152f82ebff70440a47f 2.6.0
+4b46a058311b50f401883f781324951fa8494f91 2.8.0
+377617717cd3629856815588255e631787838b9a 3.0.0
+334be9323f9d9f438002fd3f9da03da4a71df799 3.2.0
+3df95645e34e5bcc23da8aa48c8e6d349e6b28f4 3.4.0
+ef0c05005b1c3d35bbc4ed9501d62b233cfefb66 3.6.0
+0e32a58f31e46fd31f8cd338e7c5f2c93ecf86f3 3.8.0
+7ffc47bc807c6f8fa474bf4a83217aef79a260b5 4.0.0
+f36250164782018c356416ba4cf1b6eedcca74d4 4.2.0
+49d8616786cb749ba2cb77185dcc0f52cb63901f 4.4.0
+6a21cf81788f58f235e073a7775d820a05916854 4.6.0
+64c25623e8224e50fcdc651c14d784448f36b583 4.8.0
+cbd3c7663824f8f2b4ca470b2f11dce5892802b7 5.0.0
+ef59ca9b0e9559c3e868bf7964c87e7adf66b118 5.2.0
+64e98af4a9efb52663bb814858a6b689b15b1a49 5.4.0
+75788729b9c809852d5d9949068fee7732cafcd5 5.6.0
+b6ef4c2e9e0ee2104b5889b8efd6eec5646f1628 5.8.0
+6a47015c7235d06b5b4ddec5ed8cd774d06f6e19 6.0.0
+0000000000000000000000000000000000000000 1.4.0
+3021dcbbc79ad8ad44ae9dc9cfefcfad3a672c02 project-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+995ccbdf6a1a7f18e8c9f792ac7f73aaf913c0cf project-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+83ef6ae1332ef699447299bdac2e30990adaa441 project-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+a93fda9a96db2a49c2ba5e077e6572fc94b8b1de project-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+5ae9435cbd71b0097fff11938aa90662e298cef0 project-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+f8a3764421ee95566a8a096ff19de32fe971da2f project-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+2c498052d09a8eea38664152f82ebff70440a47f project-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+4b46a058311b50f401883f781324951fa8494f91 project-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+377617717cd3629856815588255e631787838b9a project-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+334be9323f9d9f438002fd3f9da03da4a71df799 project-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+3df95645e34e5bcc23da8aa48c8e6d349e6b28f4 project-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+ef0c05005b1c3d35bbc4ed9501d62b233cfefb66 project-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+0e32a58f31e46fd31f8cd338e7c5f2c93ecf86f3 project-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+7ffc47bc807c6f8fa474bf4a83217aef79a260b5 project-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+f36250164782018c356416ba4cf1b6eedcca74d4 project-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+49d8616786cb749ba2cb77185dcc0f52cb63901f project-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+6a21cf81788f58f235e073a7775d820a05916854 project-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+64c25623e8224e50fcdc651c14d784448f36b583 project-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+cbd3c7663824f8f2b4ca470b2f11dce5892802b7 project-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+ef59ca9b0e9559c3e868bf7964c87e7adf66b118 project-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+64e98af4a9efb52663bb814858a6b689b15b1a49 project-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+75788729b9c809852d5d9949068fee7732cafcd5 project-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+b6ef4c2e9e0ee2104b5889b8efd6eec5646f1628 project-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+6a47015c7235d06b5b4ddec5ed8cd774d06f6e19 project-6.0.0
+08aa5f287c67315689098d9f9086fbf190c33126 2.8.0
+b4de2224bac74309d1b660c59175a08f2818db0b 3.0.0
+ce5fe97c1828f641881d61890855b0d782151d7c 3.2.0
+b2c58fa7986e9b27077a95f940a0a0b455be6dd9 3.4.0
+9f6239e6d23f966dec80f595fe43ceb24d349f23 3.6.0
+275428c3036ac24e330512c4027a9d0550cb9532 3.8.0
+13ea5a15248ad5e2ce038ce66bbf52c0279c270e 4.0.0
+59b0e37d8c1c88f6bc7594c3f16fd2f0ff8a7f71 4.2.0
+a072fdc672a5facc465477517986f05c2812a165 4.4.0
+41a6af61693e683a6b3e376f9aa9aa606b3c2bca 4.6.0
+e411cb53d4f12391b19ca869955912bcb76fd026 4.8.0
+691960f74e085ff9017b4396446b2c0c705fde22 5.0.0
+382915171d4b6d72660b94af8c1e8bd68ae6e9e0 5.2.0
+87d79985be61ee90eab04d1d9623aac9cc6c76f6 5.4.0
+7be702da88fbe62a406d1abde0b21e5169c13fc0 5.6.0
+9b5c20620a38f45387ecf6bf76c8dfb42cc6cee2 5.8.0
+a9878c1ea3357ffc3bd2704b7c464c9ca7c8a266 6.0.0
+e665289bc7ab8c7945a287ffcc20111129930cf9 6.0.1
+34e2741b8a4dcbc6376d6531445fe93e5046b7a9 6.0.2
+eed04896d39017f986858bad61b92e908354c68d 6.0.3
+84236fbe90527aa13bc3d048149846e4d0cb2b52 6.0.4
+0000000000000000000000000000000000000000 2.8.0
+08aa5f287c67315689098d9f9086fbf190c33126 project_invoice-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+b4de2224bac74309d1b660c59175a08f2818db0b project_invoice-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+ce5fe97c1828f641881d61890855b0d782151d7c project_invoice-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+b2c58fa7986e9b27077a95f940a0a0b455be6dd9 project_invoice-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+9f6239e6d23f966dec80f595fe43ceb24d349f23 project_invoice-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+275428c3036ac24e330512c4027a9d0550cb9532 project_invoice-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+13ea5a15248ad5e2ce038ce66bbf52c0279c270e project_invoice-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+59b0e37d8c1c88f6bc7594c3f16fd2f0ff8a7f71 project_invoice-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+a072fdc672a5facc465477517986f05c2812a165 project_invoice-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+41a6af61693e683a6b3e376f9aa9aa606b3c2bca project_invoice-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+e411cb53d4f12391b19ca869955912bcb76fd026 project_invoice-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+691960f74e085ff9017b4396446b2c0c705fde22 project_invoice-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+382915171d4b6d72660b94af8c1e8bd68ae6e9e0 project_invoice-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+87d79985be61ee90eab04d1d9623aac9cc6c76f6 project_invoice-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+7be702da88fbe62a406d1abde0b21e5169c13fc0 project_invoice-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+9b5c20620a38f45387ecf6bf76c8dfb42cc6cee2 project_invoice-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+a9878c1ea3357ffc3bd2704b7c464c9ca7c8a266 project_invoice-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+e665289bc7ab8c7945a287ffcc20111129930cf9 project_invoice-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+34e2741b8a4dcbc6376d6531445fe93e5046b7a9 project_invoice-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+eed04896d39017f986858bad61b92e908354c68d project_invoice-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+84236fbe90527aa13bc3d048149846e4d0cb2b52 project_invoice-6.0.4
+2f3087596765b0554b8c8f74e26cbd4bb9fe655a 1.6.0
+c45ec5ccc6fde4a739c85710cbf47d4b2e540b79 1.8.0
+63252c1e067021c0f3a79ad22774e63b6bdf4505 2.0.0
+a7f1fbbe39225f004b8414d4c6da362555b925e0 2.2.0
+1fef9fef1462aa62cec8b96a3c2190896e52c27d 2.4.0
+ff1148333f73fefead55cc6873396503510b4dfc 2.6.0
+7af69b0b362e05ea0cc87c307f4d0552bc84b253 2.8.0
+1c83b3a4fa9b0f957cafbcec731ead45abae2678 3.0.0
+41c82109614300f864cd09fd96dcadd262079315 3.2.0
+69a8caf66a6345ce11372cc9c2f734f38b01c2cf 3.4.0
+99eec84d54c39b05fac7a32cddba544468cfed13 3.6.0
+7340de0e82fecb74f5fc1f2de652e8b31075a99b 3.8.0
+ed8e0f4ef9c2afe9bfd5e6226f1d2fcd919ed77a 4.0.0
+61d2d33b25edf8780a156f8ba7345959104bdc59 4.2.0
+4856a52b3c4d21c7d847aecef4cf98ea86b0799a 4.4.0
+c50491c745dac44e25636f89a6b75801dbfab983 4.6.0
+906b814a6ebb4dfc1e013b1c5b1fd80ebc2cdb2f 4.8.0
+744abcf6ab86f8776ec15a142dd03e0bbe2ade14 5.0.0
+7985108dac1c9efcaabe9a4945139a9bfa4c160d 5.2.0
+360ffa8db8c4f2c99df49e834e1ed7c2b1b246a6 5.4.0
+2d9c879f22642ae8a5109803bc73a16e9ed03330 5.6.0
+ad94830752c16ecf640bac58da21dc04835eb2e3 5.8.0
+14cfe06539b67e240e4a23e8f78031c8b02f9a1e 6.0.0
+0000000000000000000000000000000000000000 1.6.0
+2f3087596765b0554b8c8f74e26cbd4bb9fe655a project_plan-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+c45ec5ccc6fde4a739c85710cbf47d4b2e540b79 project_plan-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+63252c1e067021c0f3a79ad22774e63b6bdf4505 project_plan-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+a7f1fbbe39225f004b8414d4c6da362555b925e0 project_plan-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+1fef9fef1462aa62cec8b96a3c2190896e52c27d project_plan-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+ff1148333f73fefead55cc6873396503510b4dfc project_plan-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+7af69b0b362e05ea0cc87c307f4d0552bc84b253 project_plan-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+1c83b3a4fa9b0f957cafbcec731ead45abae2678 project_plan-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+41c82109614300f864cd09fd96dcadd262079315 project_plan-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+69a8caf66a6345ce11372cc9c2f734f38b01c2cf project_plan-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+99eec84d54c39b05fac7a32cddba544468cfed13 project_plan-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+7340de0e82fecb74f5fc1f2de652e8b31075a99b project_plan-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+ed8e0f4ef9c2afe9bfd5e6226f1d2fcd919ed77a project_plan-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+61d2d33b25edf8780a156f8ba7345959104bdc59 project_plan-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+4856a52b3c4d21c7d847aecef4cf98ea86b0799a project_plan-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+c50491c745dac44e25636f89a6b75801dbfab983 project_plan-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+906b814a6ebb4dfc1e013b1c5b1fd80ebc2cdb2f project_plan-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+744abcf6ab86f8776ec15a142dd03e0bbe2ade14 project_plan-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+7985108dac1c9efcaabe9a4945139a9bfa4c160d project_plan-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+360ffa8db8c4f2c99df49e834e1ed7c2b1b246a6 project_plan-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+2d9c879f22642ae8a5109803bc73a16e9ed03330 project_plan-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+ad94830752c16ecf640bac58da21dc04835eb2e3 project_plan-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+14cfe06539b67e240e4a23e8f78031c8b02f9a1e project_plan-6.0.0
+2dd0180b1c6fa11d27451d4bbb723ef8130f3852 1.4.0
+baad591d0c8f28295fa940654fb52125167d371a 1.6.0
+f523c8e44b80900659959a1e5c6468cd237b266b 1.8.0
+940dd31347eb51632ea3de312a591311cb2f7707 2.0.0
+5deaba26e5eb26930d82c46f199d298bd0703c08 2.2.0
+0c0e7bb05215ca381a09d2fe696fdc829e7e738b 2.4.0
+cbf76a81d5ae48c1f227968fb94bde126ae149bf 2.6.0
+114982b3ee0b120531640b7e222683658e3a5b9d 2.8.0
+f80c569d8e18ed1bda75030131fe6a7133290ce0 3.0.0
+ecb969fd8ac9420c348d8ec495085659a384ecf5 3.2.0
+ef61c5c3c8d21d018a27de0ef4b5695cc58e1de5 3.4.0
+a9ab25db0e9574b4b95f3fb53f82ea28be881228 3.6.0
+bbb478b01b853f92b4c6e7d69855a96a28cd75ce 3.8.0
+0a23227855067e5fad3d5713708048f7387fad89 4.0.0
+bd3eddd2c67850ed86192d9a199ea152dceb9bb1 4.2.0
+a11bd1d08e01287eea027bedce0f7f8052b7ce3a 4.4.0
+3d474174951d44b4f67d6cc258956c78e6cd7147 4.6.0
+f3c4b6889a15b34f2f1db597519b288c17cc219d 4.8.0
+cc8cb10ea76ebe9db1bf60a72faea34c4e5d02bd 5.0.0
+c71cbf353d3e9ddd3b354367d50f58bdaac66af1 5.2.0
+5b78cd1eda861c3d8dc796e3dd91ea0de212d9ed 5.4.0
+21cf2e3f9b8a95f287f5623602d0beb9160af671 5.6.0
+7a46dfb81e38fe0bbe9a9fa78e10226476a422b7 5.8.0
+abf29d2d8ecf3ac2d2b4639af36d16881fdae55b 6.0.0
+6f90d91382061321ccf32a47d576ba108cf558d3 6.0.1
+0000000000000000000000000000000000000000 1.4.0
+2dd0180b1c6fa11d27451d4bbb723ef8130f3852 project_revenue-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+baad591d0c8f28295fa940654fb52125167d371a project_revenue-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+f523c8e44b80900659959a1e5c6468cd237b266b project_revenue-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+940dd31347eb51632ea3de312a591311cb2f7707 project_revenue-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+5deaba26e5eb26930d82c46f199d298bd0703c08 project_revenue-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+0c0e7bb05215ca381a09d2fe696fdc829e7e738b project_revenue-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+cbf76a81d5ae48c1f227968fb94bde126ae149bf project_revenue-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+114982b3ee0b120531640b7e222683658e3a5b9d project_revenue-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+f80c569d8e18ed1bda75030131fe6a7133290ce0 project_revenue-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+ecb969fd8ac9420c348d8ec495085659a384ecf5 project_revenue-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+ef61c5c3c8d21d018a27de0ef4b5695cc58e1de5 project_revenue-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+a9ab25db0e9574b4b95f3fb53f82ea28be881228 project_revenue-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+bbb478b01b853f92b4c6e7d69855a96a28cd75ce project_revenue-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+0a23227855067e5fad3d5713708048f7387fad89 project_revenue-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+bd3eddd2c67850ed86192d9a199ea152dceb9bb1 project_revenue-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+a11bd1d08e01287eea027bedce0f7f8052b7ce3a project_revenue-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+3d474174951d44b4f67d6cc258956c78e6cd7147 project_revenue-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+f3c4b6889a15b34f2f1db597519b288c17cc219d project_revenue-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+cc8cb10ea76ebe9db1bf60a72faea34c4e5d02bd project_revenue-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+c71cbf353d3e9ddd3b354367d50f58bdaac66af1 project_revenue-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+5b78cd1eda861c3d8dc796e3dd91ea0de212d9ed project_revenue-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+21cf2e3f9b8a95f287f5623602d0beb9160af671 project_revenue-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+7a46dfb81e38fe0bbe9a9fa78e10226476a422b7 project_revenue-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+abf29d2d8ecf3ac2d2b4639af36d16881fdae55b project_revenue-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+6f90d91382061321ccf32a47d576ba108cf558d3 project_revenue-6.0.1
+d97450df2b381008d36eaa676613703c0439da33 5.4.0
+c0de6703f97f84cd221021f1f44ed097e7bf1953 5.6.0
+f9c333d590de0f4743309266c4aa9aa404b52133 5.8.0
+e3fe01c43846e4a19a484ab3287ff0cb32c57e9b 6.0.0
+48f14a996233be5ac0130d7ac7d43e056a739f72 6.0.1
+0000000000000000000000000000000000000000 5.4.0
+d97450df2b381008d36eaa676613703c0439da33 purchase_amendment-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+c0de6703f97f84cd221021f1f44ed097e7bf1953 purchase_amendment-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+f9c333d590de0f4743309266c4aa9aa404b52133 purchase_amendment-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+e3fe01c43846e4a19a484ab3287ff0cb32c57e9b purchase_amendment-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+48f14a996233be5ac0130d7ac7d43e056a739f72 purchase_amendment-6.0.1
+28f5e05376cda70f569743e695369f3dcb5462d0 1.0.0
+8411703acab8ab25c5b6a34cedbaa65d8edfb74d 1.2.0
+821a4e526a660debd9e815f866edeaef93026535 1.4.0
+eaeea51fd310f387cc5593ac03caa0a7926ed377 1.6.0
+c5a5d252430911794635b127796bb69727c4c50f 1.8.0
+cf37cf340aadf693703bb72cd9090349698f5eec 2.0.0
+155968df100be420b04452a4a66bff26d9b09d9c 2.2.0
+16f519261f4717b8311fab4525fe9b42624fb9d9 2.4.0
+9aa18c79df9b40d85456d01bdc67ed599c49ed65 2.6.0
+94e08118db32cc429b90c45ed6243a5485d927bb 2.8.0
+37e7ff56a2020b546a3ab4362de63fef916485b4 3.0.0
+775b22f5d584e37ecf96e20519c672cc2c78e137 3.2.0
+3b5b95037d900f173929b37a54cd4fc2cea18437 3.4.0
+f575cdd64cba4615ed28849f77b7991aee7f8e6b 3.6.0
+c9a20a9ab9833b4dec50884ab524d3dd331395c6 3.8.0
+4a507c55113e94fed4f23aeb299c354ab19f451f 4.0.0
+d26f28ad5629c320e6cb88caac8b28c7e335372b 4.2.0
+6ee112692f6ceb07547622c5c974e4f81ee14683 4.4.0
+15a64f104f322d0827d44773911d4e0a9aebba5f 4.6.0
+4221e2277ff99417e520483bfd5dc2157882249a 4.8.0
+a19d4f68a99f24f220200eef7949504a3849bfbb 5.0.0
+3f18592e924cdb2e3603229c416ac41cac11b485 5.2.0
+40575dbd381e65fbd0364f66c0ff45909ebd243d 5.4.0
+9aada510d43bd05d3c4c469c3ea203442d56829a 5.6.0
+38398542e536c292af1a5e144e0a8f70400e2ca1 5.8.0
+2d9779c9eb069dc9e840690bd9c7fa35f5a6bd54 6.0.0
+72b15615452bc64fd73b5caf3c0abc1351d94dec 6.0.1
+1f62b71cc7b791fb68b670f3b3999ceb92f42850 6.0.2
+59df785ea68a332dd6bab8eedec328fa13b26146 6.0.3
+86d73697a72fedc55d5fc130c17893faac5d0245 6.0.4
+6722bfa5576291e9dcdfa66878027a9799a0b9a2 6.0.5
+c517d4067ca5cef9b6eb07e6de4e466eae69b95c 6.0.6
+a0051c17a0717756b5607b9b0bf4947bc590c924 6.0.7
+71321aef73ceef792e178a8071ae6605615b7cfe 6.0.8
+1b10f0afea95bcd6b97b0548b9b2dac130a1163e 6.0.9
+0000000000000000000000000000000000000000 1.0.0
+28f5e05376cda70f569743e695369f3dcb5462d0 purchase-1.0.0
+0000000000000000000000000000000000000000 1.2.0
+8411703acab8ab25c5b6a34cedbaa65d8edfb74d purchase-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+821a4e526a660debd9e815f866edeaef93026535 purchase-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+eaeea51fd310f387cc5593ac03caa0a7926ed377 purchase-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+c5a5d252430911794635b127796bb69727c4c50f purchase-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+cf37cf340aadf693703bb72cd9090349698f5eec purchase-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+155968df100be420b04452a4a66bff26d9b09d9c purchase-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+16f519261f4717b8311fab4525fe9b42624fb9d9 purchase-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+9aa18c79df9b40d85456d01bdc67ed599c49ed65 purchase-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+94e08118db32cc429b90c45ed6243a5485d927bb purchase-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+37e7ff56a2020b546a3ab4362de63fef916485b4 purchase-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+775b22f5d584e37ecf96e20519c672cc2c78e137 purchase-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+3b5b95037d900f173929b37a54cd4fc2cea18437 purchase-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+f575cdd64cba4615ed28849f77b7991aee7f8e6b purchase-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+c9a20a9ab9833b4dec50884ab524d3dd331395c6 purchase-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+4a507c55113e94fed4f23aeb299c354ab19f451f purchase-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+d26f28ad5629c320e6cb88caac8b28c7e335372b purchase-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+6ee112692f6ceb07547622c5c974e4f81ee14683 purchase-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+15a64f104f322d0827d44773911d4e0a9aebba5f purchase-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+4221e2277ff99417e520483bfd5dc2157882249a purchase-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+a19d4f68a99f24f220200eef7949504a3849bfbb purchase-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+3f18592e924cdb2e3603229c416ac41cac11b485 purchase-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+40575dbd381e65fbd0364f66c0ff45909ebd243d purchase-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+9aada510d43bd05d3c4c469c3ea203442d56829a purchase-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+38398542e536c292af1a5e144e0a8f70400e2ca1 purchase-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+2d9779c9eb069dc9e840690bd9c7fa35f5a6bd54 purchase-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+72b15615452bc64fd73b5caf3c0abc1351d94dec purchase-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+1f62b71cc7b791fb68b670f3b3999ceb92f42850 purchase-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+59df785ea68a332dd6bab8eedec328fa13b26146 purchase-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+86d73697a72fedc55d5fc130c17893faac5d0245 purchase-6.0.4
+0000000000000000000000000000000000000000 6.0.5
+6722bfa5576291e9dcdfa66878027a9799a0b9a2 purchase-6.0.5
+0000000000000000000000000000000000000000 6.0.6
+c517d4067ca5cef9b6eb07e6de4e466eae69b95c purchase-6.0.6
+0000000000000000000000000000000000000000 6.0.7
+a0051c17a0717756b5607b9b0bf4947bc590c924 purchase-6.0.7
+0000000000000000000000000000000000000000 6.0.8
+71321aef73ceef792e178a8071ae6605615b7cfe purchase-6.0.8
+0000000000000000000000000000000000000000 6.0.9
+1b10f0afea95bcd6b97b0548b9b2dac130a1163e purchase-6.0.9
+e453e3814ca6b24d75aa4e53a9986fb9318bf60b 5.4.0
+ac500cd9fdc7d3f12b037683d7e1cda58bf8840f 5.6.0
+3d86b8a53f54f6674ee66cb0132919fcb4acd4a4 5.8.0
+084f589d60703ceac43be05c0422ce204ca87697 6.0.0
+0000000000000000000000000000000000000000 5.4.0
+e453e3814ca6b24d75aa4e53a9986fb9318bf60b purchase_history-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+ac500cd9fdc7d3f12b037683d7e1cda58bf8840f purchase_history-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+3d86b8a53f54f6674ee66cb0132919fcb4acd4a4 purchase_history-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+084f589d60703ceac43be05c0422ce204ca87697 purchase_history-6.0.0
+9c98d5e9874c564e821b141ea41d9e7cae406e6b 1.2.0
+eb26aca05c57b21b5f7ace57a2e601a37871aced 1.4.0
+dc78f8d60898a66543a2fce81f601f1972b138f4 1.6.0
+3a3032d7e1b0a13e185941b061094f2f03b26347 1.8.0
+8e0a6416ad46e8917c90357418145a80ea5da2bd 2.0.0
+974320e593ed516aef45e56f5c62e171e5b31375 2.2.0
+01d5bf8bd871617f04260c7b55f5ede38f2936b1 2.4.0
+47531e7678e9edf31e771651e2b589ededb1f9a6 2.6.0
+f81b3297cf147653489db280aa12b4241c549da1 2.8.0
+1a4ce5683c1944f80c98f7537a5d5c550496cfe0 3.0.0
+294cc6a7ac22a9148733e7797796161019ee8734 3.2.0
+09702abc743c6d66785d20964f59e4e3c524b57d 3.4.0
+d1ea9a073d19200cbb7451f3257f926a87b59f8d 3.6.0
+f304f1d26971ae703c6bbac6873078ef5c35223b 3.8.0
+79fd3d85770c222d49aa059f5fd7376a0481ed87 4.0.0
+694e59c9e99ab0e6db581473c77bf4a2314692aa 4.2.0
+792caf8ebcde1466cddd185b00abdfe8e0b5cec7 4.4.0
+4ed14ad2c79707daea80984aff44d5d8faa7a89c 4.6.0
+189b38c757aca3de4ea5a83940d89bf74362c37b 4.8.0
+a24ef81bdda32f5bf3c9193120dca97c1bec9897 5.0.0
+2058dd0b32391d939bf4e24ccb016db816dddf05 5.2.0
+0eb4d6e86f87665f0b5426fa8048a65b89b4fdce 5.4.0
+075473b727f1150a206ef568e39a20d6a8c599b4 5.6.0
+e6433dc6d0026b21c37dc743c56e83e7c00f9c62 5.8.0
+babfee19d2ddd0137a4a13cdd6cef47a6e514edd 6.0.0
+0000000000000000000000000000000000000000 1.2.0
+9c98d5e9874c564e821b141ea41d9e7cae406e6b purchase_invoice_line_standalone-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+eb26aca05c57b21b5f7ace57a2e601a37871aced purchase_invoice_line_standalone-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+dc78f8d60898a66543a2fce81f601f1972b138f4 purchase_invoice_line_standalone-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+3a3032d7e1b0a13e185941b061094f2f03b26347 purchase_invoice_line_standalone-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+8e0a6416ad46e8917c90357418145a80ea5da2bd purchase_invoice_line_standalone-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+974320e593ed516aef45e56f5c62e171e5b31375 purchase_invoice_line_standalone-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+01d5bf8bd871617f04260c7b55f5ede38f2936b1 purchase_invoice_line_standalone-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+47531e7678e9edf31e771651e2b589ededb1f9a6 purchase_invoice_line_standalone-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+f81b3297cf147653489db280aa12b4241c549da1 purchase_invoice_line_standalone-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+1a4ce5683c1944f80c98f7537a5d5c550496cfe0 purchase_invoice_line_standalone-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+294cc6a7ac22a9148733e7797796161019ee8734 purchase_invoice_line_standalone-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+09702abc743c6d66785d20964f59e4e3c524b57d purchase_invoice_line_standalone-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+d1ea9a073d19200cbb7451f3257f926a87b59f8d purchase_invoice_line_standalone-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+f304f1d26971ae703c6bbac6873078ef5c35223b purchase_invoice_line_standalone-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+79fd3d85770c222d49aa059f5fd7376a0481ed87 purchase_invoice_line_standalone-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+694e59c9e99ab0e6db581473c77bf4a2314692aa purchase_invoice_line_standalone-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+792caf8ebcde1466cddd185b00abdfe8e0b5cec7 purchase_invoice_line_standalone-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+4ed14ad2c79707daea80984aff44d5d8faa7a89c purchase_invoice_line_standalone-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+189b38c757aca3de4ea5a83940d89bf74362c37b purchase_invoice_line_standalone-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+a24ef81bdda32f5bf3c9193120dca97c1bec9897 purchase_invoice_line_standalone-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+2058dd0b32391d939bf4e24ccb016db816dddf05 purchase_invoice_line_standalone-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+0eb4d6e86f87665f0b5426fa8048a65b89b4fdce purchase_invoice_line_standalone-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+075473b727f1150a206ef568e39a20d6a8c599b4 purchase_invoice_line_standalone-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+e6433dc6d0026b21c37dc743c56e83e7c00f9c62 purchase_invoice_line_standalone-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+babfee19d2ddd0137a4a13cdd6cef47a6e514edd purchase_invoice_line_standalone-6.0.0
+620f6a6bb9373b33772b2f4b10dfddddd55ef183 6.0.0
+388d46f132989abc7fa14fdf470cb62401b4ee18 6.0.1
+0000000000000000000000000000000000000000 6.0.0
+620f6a6bb9373b33772b2f4b10dfddddd55ef183 purchase_price_list-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+388d46f132989abc7fa14fdf470cb62401b4ee18 purchase_price_list-6.0.1
+01649a64b1527ab0cd844b116c6372d095bf049f 4.0.0
+b1b4778e4be5a374b5e36318b653ecff4c9db0a4 4.2.0
+a4df620b0ba8f7b10af138363772c52d647f5a41 4.4.0
+eb31fa5ebaf005375043180e3b0c76a94c0cd018 4.6.0
+6f7417300585275ed5c1fb280780bc8680eb18b3 4.8.0
+bdfa1b2fbf0e92cb9ef04372bf770c06cc03c22d 5.0.0
+25f77dc80d448b5a6c619281c427b18cd9abdca7 5.2.0
+bc99bc704753495d38e4bdf09d8f8d4ec4a9d1c5 5.4.0
+b439f3a641c3ba9003706a8dcb916daabbe72f98 5.6.0
+63947ac1f4929c7d68fb4195d507dd6718187300 5.8.0
+0fed0bd199b5697e01f20df909c0e96aae949f9a 6.0.0
+d088e18120a1873344d13a2acf5dcddd411795f4 6.0.1
+0000000000000000000000000000000000000000 4.0.0
+01649a64b1527ab0cd844b116c6372d095bf049f purchase_request-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+b1b4778e4be5a374b5e36318b653ecff4c9db0a4 purchase_request-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+a4df620b0ba8f7b10af138363772c52d647f5a41 purchase_request-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+eb31fa5ebaf005375043180e3b0c76a94c0cd018 purchase_request-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+6f7417300585275ed5c1fb280780bc8680eb18b3 purchase_request-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+bdfa1b2fbf0e92cb9ef04372bf770c06cc03c22d purchase_request-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+25f77dc80d448b5a6c619281c427b18cd9abdca7 purchase_request-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+bc99bc704753495d38e4bdf09d8f8d4ec4a9d1c5 purchase_request-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+b439f3a641c3ba9003706a8dcb916daabbe72f98 purchase_request-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+63947ac1f4929c7d68fb4195d507dd6718187300 purchase_request-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+0fed0bd199b5697e01f20df909c0e96aae949f9a purchase_request-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+d088e18120a1873344d13a2acf5dcddd411795f4 purchase_request-6.0.1
+17e19e016f9078d62e598961e6557178230911b4 4.8.0
+4dc6700053f01045be0c09def2b4b95478389f67 5.0.0
+d7de59a4769bc39b85ff2fc84850b788ad1f57d8 5.2.0
+a5f8af7baefda9293b4fbc84bb0a4a0819bba03f 5.4.0
+b339622b14d3eea46fd165e4e45e33f50f4e405e 5.6.0
+95f80b493794793f43c8d084d430f8b48c42b3bf 5.8.0
+96198308ebea5616cc3580f9c7a5777c57f19903 6.0.0
+0503dbbffa3584fc8d8d928ed29ade818938e044 6.0.1
+da2785b7ef32c8dbe43e1b7e8e54537431348e2b 6.0.2
+0000000000000000000000000000000000000000 4.8.0
+17e19e016f9078d62e598961e6557178230911b4 purchase_request_quotation-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+4dc6700053f01045be0c09def2b4b95478389f67 purchase_request_quotation-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+d7de59a4769bc39b85ff2fc84850b788ad1f57d8 purchase_request_quotation-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+a5f8af7baefda9293b4fbc84bb0a4a0819bba03f purchase_request_quotation-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+b339622b14d3eea46fd165e4e45e33f50f4e405e purchase_request_quotation-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+95f80b493794793f43c8d084d430f8b48c42b3bf purchase_request_quotation-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+96198308ebea5616cc3580f9c7a5777c57f19903 purchase_request_quotation-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+0503dbbffa3584fc8d8d928ed29ade818938e044 purchase_request_quotation-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+da2785b7ef32c8dbe43e1b7e8e54537431348e2b purchase_request_quotation-6.0.2
+bcd5902d3b82d5955095978ff35cb2bb4ad9a947 4.2.0
+dca61b39754d6249bea3697ce10ee49f92cebc02 4.4.0
+ff32ed4086837f7dae96c44a46520d17d1bc28fa 4.6.0
+6e47b57c4bdbee8d85664432b914fcbdf8e7a03c 4.8.0
+b44e913d22848d86c237c901d765535d1ab46faf 5.0.0
+5792c1dd486f65866b497ac98c0d6c2b5f4102e7 5.2.0
+317bcf82b7d6a99304ac8644f1c750c04fda79d1 5.4.0
+5dc4517730a7e3e23f080d4ee7fd471eaaf65791 5.6.0
+90ad238622bc89ca20c38e551d0cac8b3e28a8f1 5.8.0
+747927e0556ffdc27d8a71287f04d4649794bb65 6.0.0
+0000000000000000000000000000000000000000 4.2.0
+bcd5902d3b82d5955095978ff35cb2bb4ad9a947 purchase_requisition-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+dca61b39754d6249bea3697ce10ee49f92cebc02 purchase_requisition-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+ff32ed4086837f7dae96c44a46520d17d1bc28fa purchase_requisition-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+6e47b57c4bdbee8d85664432b914fcbdf8e7a03c purchase_requisition-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+b44e913d22848d86c237c901d765535d1ab46faf purchase_requisition-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+5792c1dd486f65866b497ac98c0d6c2b5f4102e7 purchase_requisition-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+317bcf82b7d6a99304ac8644f1c750c04fda79d1 purchase_requisition-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+5dc4517730a7e3e23f080d4ee7fd471eaaf65791 purchase_requisition-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+90ad238622bc89ca20c38e551d0cac8b3e28a8f1 purchase_requisition-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+747927e0556ffdc27d8a71287f04d4649794bb65 purchase_requisition-6.0.0
+57fd2631f24428f6782d99461eef0bb7df73410b 5.4.0
+97e04038a35ee6bdc169823c405bf0e04d6a89f3 5.6.0
+32a0b05096cb83083f5e66d008030a8b1cacfc81 5.8.0
+33f97eb44c2ea967e49411860d2c05c088ab15e0 6.0.0
+0000000000000000000000000000000000000000 5.4.0
+57fd2631f24428f6782d99461eef0bb7df73410b purchase_secondary_unit-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+97e04038a35ee6bdc169823c405bf0e04d6a89f3 purchase_secondary_unit-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+32a0b05096cb83083f5e66d008030a8b1cacfc81 purchase_secondary_unit-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+33f97eb44c2ea967e49411860d2c05c088ab15e0 purchase_secondary_unit-6.0.0
+6b4b291f70b6ad9ead4cbe9f8c2da88b5c324c8b 2.4.0
+1ee11d51aa0b6c2ecc06cb00ef9ef941d10fb3e7 2.6.0
+cd43d73b08c73a75fecae0b59e5da96a89d68498 2.8.0
+8ec1c5e5086391eef8c93b129311f19a52072f4d 3.0.0
+2dbc358ddf12b5b77705805bc72e17fe38f01a19 3.2.0
+63b3d63e95e64905bccc9dcf0e4e685dac81dfd3 3.4.0
+59d25a92cc7e19b50f6a11181bcf02b78dc4c09a 3.6.0
+bbdb8fc7bf4aea317d452b38798f2d7d915e5a75 3.8.0
+ad55847e968de20322cc71d504e48f769aa22baf 4.0.0
+173cf80a9a9df5f685c12d2acfa0faddacc94222 4.2.0
+07a2480b0e2834e758862e8230d8e93d28a57223 4.4.0
+b0428a99c8532d7a580ef686b853880b27beda3d 4.6.0
+209bd2b3806e73a9e10756f258a0a482fe55e009 4.8.0
+1f4d598b3d9c2afcff4aa60fb22a76d54e989bf3 5.0.0
+ed23e3603ff4c74033f22413278cd40e7c35240d 5.2.0
+de17813d9dd55d8be1a8258f5bc654d19e1bc26a 5.4.0
+cf45aa4d44a7f7e01557a040983d8308b1fcbd8a 5.6.0
+0cf9649d3f25d140770921c544853a07c84bec89 5.8.0
+38078366523c7a71bd738efda43047503d81c7a6 6.0.0
+0000000000000000000000000000000000000000 2.4.0
+6b4b291f70b6ad9ead4cbe9f8c2da88b5c324c8b purchase_shipment_cost-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+1ee11d51aa0b6c2ecc06cb00ef9ef941d10fb3e7 purchase_shipment_cost-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+cd43d73b08c73a75fecae0b59e5da96a89d68498 purchase_shipment_cost-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+8ec1c5e5086391eef8c93b129311f19a52072f4d purchase_shipment_cost-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+2dbc358ddf12b5b77705805bc72e17fe38f01a19 purchase_shipment_cost-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+63b3d63e95e64905bccc9dcf0e4e685dac81dfd3 purchase_shipment_cost-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+59d25a92cc7e19b50f6a11181bcf02b78dc4c09a purchase_shipment_cost-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+bbdb8fc7bf4aea317d452b38798f2d7d915e5a75 purchase_shipment_cost-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+ad55847e968de20322cc71d504e48f769aa22baf purchase_shipment_cost-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+173cf80a9a9df5f685c12d2acfa0faddacc94222 purchase_shipment_cost-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+07a2480b0e2834e758862e8230d8e93d28a57223 purchase_shipment_cost-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+b0428a99c8532d7a580ef686b853880b27beda3d purchase_shipment_cost-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+209bd2b3806e73a9e10756f258a0a482fe55e009 purchase_shipment_cost-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+1f4d598b3d9c2afcff4aa60fb22a76d54e989bf3 purchase_shipment_cost-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+ed23e3603ff4c74033f22413278cd40e7c35240d purchase_shipment_cost-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+de17813d9dd55d8be1a8258f5bc654d19e1bc26a purchase_shipment_cost-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+cf45aa4d44a7f7e01557a040983d8308b1fcbd8a purchase_shipment_cost-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+0cf9649d3f25d140770921c544853a07c84bec89 purchase_shipment_cost-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+38078366523c7a71bd738efda43047503d81c7a6 purchase_shipment_cost-6.0.0
+ffef8bae0da2388021948bcabbf6d6132df1d10d 4.4.0
+53aedf3c5a2907c144e5a4ddac42286e4a5b4e91 4.6.0
+5f91c5b9dbcf3d847e6acfc5ab73ea28e413d5b8 4.8.0
+bd304a295c3400cdd1d3ab88057cf52e3636d8b1 5.0.0
+7e8b2014f3b70fbb4d53bce379e9fffa7493fb4f 5.2.0
+088527a43d2fd9eed9e607d39bd79ae0083950a9 5.4.0
+3ac2fd3f244745e7e8ef98c9dbef84a883eedcc6 5.6.0
+66b2d8e545d2d1ec95b982d0ae82ac05e2f107d7 5.8.0
+ed3a20a42ba3e8d04ddd3c09d221227332e93f17 6.0.0
+45f4ad544e91fb6a8c1c9f7ee90228fc01858775 6.0.1
+0000000000000000000000000000000000000000 4.4.0
+ffef8bae0da2388021948bcabbf6d6132df1d10d sale_advance_payment-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+53aedf3c5a2907c144e5a4ddac42286e4a5b4e91 sale_advance_payment-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+5f91c5b9dbcf3d847e6acfc5ab73ea28e413d5b8 sale_advance_payment-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+bd304a295c3400cdd1d3ab88057cf52e3636d8b1 sale_advance_payment-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+7e8b2014f3b70fbb4d53bce379e9fffa7493fb4f sale_advance_payment-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+088527a43d2fd9eed9e607d39bd79ae0083950a9 sale_advance_payment-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+3ac2fd3f244745e7e8ef98c9dbef84a883eedcc6 sale_advance_payment-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+66b2d8e545d2d1ec95b982d0ae82ac05e2f107d7 sale_advance_payment-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+ed3a20a42ba3e8d04ddd3c09d221227332e93f17 sale_advance_payment-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+45f4ad544e91fb6a8c1c9f7ee90228fc01858775 sale_advance_payment-6.0.1
+2bc978e32824fac17d3c2665444c2bc738ae33ce 5.4.0
+16165133e8fb931f1a8d8dbb8f003c5c1c183132 5.6.0
+3d55751ec3e0150575541c445c0d60846f098336 5.8.0
+a60f0bcd2fa08bb785bf8090b58e4b023c5b97d3 6.0.0
+ec8c8833939e98e33f6a9687472158ab185b977e 6.0.1
+0000000000000000000000000000000000000000 5.4.0
+2bc978e32824fac17d3c2665444c2bc738ae33ce sale_amendment-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+16165133e8fb931f1a8d8dbb8f003c5c1c183132 sale_amendment-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+3d55751ec3e0150575541c445c0d60846f098336 sale_amendment-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+a60f0bcd2fa08bb785bf8090b58e4b023c5b97d3 sale_amendment-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+ec8c8833939e98e33f6a9687472158ab185b977e sale_amendment-6.0.1
+5e6544b5721589986fb34fb9d8189b96113a1812 3.8.0
+1452882cb48099b2b8774488952ef0da93549fba 4.0.0
+852c30b3f34953898bc8cd4ea2ebdb332ff3e733 4.2.0
+9cbc898a393f97b61f6d4716a1fb5433206238bd 4.4.0
+b437d3f8a855595bd87630a7118b0286f5ab1c85 4.6.0
+55166280b2e699bc8b8f0e99be726c4869743857 4.8.0
+266f997e91440b9bc36ae8a435d60c5679ea12fa 5.0.0
+a4923a52b963bce948b479ca426392efd0701d08 5.2.0
+2c543ccd3232d58d1b2d59fa757a7975c72f2372 5.4.0
+da18123e3fd5dccc41fb6f0385078c73d2f133ac 5.6.0
+2c985bccb02403f187f09b68c6869aa6daf8717a 5.8.0
+0d35637e6b73934bbc6edd6accabb7bf1841e77c 6.0.0
+6df66d282bd56fe55b0b53040c91bee1914c9148 6.0.1
+c366c311d9fb66015a70296ee23e17e5e2293616 6.0.2
+0000000000000000000000000000000000000000 3.8.0
+5e6544b5721589986fb34fb9d8189b96113a1812 sale_complaint-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+1452882cb48099b2b8774488952ef0da93549fba sale_complaint-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+852c30b3f34953898bc8cd4ea2ebdb332ff3e733 sale_complaint-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+9cbc898a393f97b61f6d4716a1fb5433206238bd sale_complaint-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+b437d3f8a855595bd87630a7118b0286f5ab1c85 sale_complaint-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+55166280b2e699bc8b8f0e99be726c4869743857 sale_complaint-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+266f997e91440b9bc36ae8a435d60c5679ea12fa sale_complaint-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+a4923a52b963bce948b479ca426392efd0701d08 sale_complaint-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+2c543ccd3232d58d1b2d59fa757a7975c72f2372 sale_complaint-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+da18123e3fd5dccc41fb6f0385078c73d2f133ac sale_complaint-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+2c985bccb02403f187f09b68c6869aa6daf8717a sale_complaint-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+0d35637e6b73934bbc6edd6accabb7bf1841e77c sale_complaint-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+6df66d282bd56fe55b0b53040c91bee1914c9148 sale_complaint-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+c366c311d9fb66015a70296ee23e17e5e2293616 sale_complaint-6.0.2
+9f3593c47d8e61701a48dd4994c87c8932cd03b4 3.2.0
+de61c4b9fa8b5d491a76de99866c9e6f6b7f18da 3.4.0
+53ed2c17b8fab91c131e4845130f5c643b610c4e 3.6.0
+9b0631e3b18e191780b3406becced025d9a6997c 3.8.0
+441f649129f3a3797f27d820c767acf1a2389a3a 4.0.0
+11f83d0ee53b6a3a453bf7c6d9d049dc86b958cd 4.2.0
+9ba1ef5999e04e46bb639917dde537d9f285312a 4.4.0
+d472c520bc15b3b3b2b36b1df50c9e38038d0c94 4.6.0
+5b7b57e25d0b85f530a8ff679209eabfc1e8800d 4.8.0
+912186dd35981e767a934197d0a7eaf2fd043524 5.0.0
+cbfca971ec9fd828f80888abf9fb86d43e159428 5.2.0
+e42f713281f747681fe9c20c822a276f5f9b729c 5.4.0
+7f3949969dbb1c999d977c261d49fe9945f431dc 5.6.0
+3d735aa32b29b9ba2ccb0e03762cd4f0a2f4a257 5.8.0
+538501607c2f00960a49f89d4249855ef0ce15cb 6.0.0
+0000000000000000000000000000000000000000 3.2.0
+9f3593c47d8e61701a48dd4994c87c8932cd03b4 sale_credit_limit-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+de61c4b9fa8b5d491a76de99866c9e6f6b7f18da sale_credit_limit-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+53ed2c17b8fab91c131e4845130f5c643b610c4e sale_credit_limit-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+9b0631e3b18e191780b3406becced025d9a6997c sale_credit_limit-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+441f649129f3a3797f27d820c767acf1a2389a3a sale_credit_limit-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+11f83d0ee53b6a3a453bf7c6d9d049dc86b958cd sale_credit_limit-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+9ba1ef5999e04e46bb639917dde537d9f285312a sale_credit_limit-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+d472c520bc15b3b3b2b36b1df50c9e38038d0c94 sale_credit_limit-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+5b7b57e25d0b85f530a8ff679209eabfc1e8800d sale_credit_limit-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+912186dd35981e767a934197d0a7eaf2fd043524 sale_credit_limit-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+cbfca971ec9fd828f80888abf9fb86d43e159428 sale_credit_limit-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+e42f713281f747681fe9c20c822a276f5f9b729c sale_credit_limit-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+7f3949969dbb1c999d977c261d49fe9945f431dc sale_credit_limit-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+3d735aa32b29b9ba2ccb0e03762cd4f0a2f4a257 sale_credit_limit-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+538501607c2f00960a49f89d4249855ef0ce15cb sale_credit_limit-6.0.0
+048f3939e4fe68df605f29805d421f0e4029e1e3 5.8.0
+e11442b5963bc719317414861dd81c13c7b941ce 6.0.0
+58afdb843fb2ec14c732a56181967e539738855f 6.0.1
+0000000000000000000000000000000000000000 5.8.0
+048f3939e4fe68df605f29805d421f0e4029e1e3 sale_discount-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+e11442b5963bc719317414861dd81c13c7b941ce sale_discount-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+58afdb843fb2ec14c732a56181967e539738855f sale_discount-6.0.1
+ed754e9dc954f77a62e5c13cce8982150df6c5fc 3.6.0
+1a28a341c3b19e92faec157cd3f1daef3882c9d0 3.8.0
+caee5c8f0b7246b0f14e2cd0772959ac13a9f2c8 4.0.0
+58dea19b24d01c729c9f35a7c3e6b95a65afffa7 4.2.0
+d3edd73f98f75ae80f1ba1058c7a0a7c0c1485df 4.4.0
+e1f0b6a705e5e87c5707d737b2a271177ab42ca0 4.6.0
+b07c3f104931d10aa1d015e7d712b2c6519b54bc 4.8.0
+e7516800e812afa2065d1e08e86021dcf0cc5bdb 5.0.0
+126cdf7207c7dc8e7cc0fb00b49dec3c2326031c 5.2.0
+3f4e25ec446eb2b04cb941890120df86d5d629b6 5.4.0
+7a7bfdc619295e1e225b1ea8f6b07dfb8769d4ec 5.6.0
+f3e01b105d1983d8835916e46748a28f492a5aec 5.8.0
+46c0de980742bcd165e258d654df7a2b1d164f8f 6.0.0
+0000000000000000000000000000000000000000 3.6.0
+ed754e9dc954f77a62e5c13cce8982150df6c5fc sale_extra-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+1a28a341c3b19e92faec157cd3f1daef3882c9d0 sale_extra-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+caee5c8f0b7246b0f14e2cd0772959ac13a9f2c8 sale_extra-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+58dea19b24d01c729c9f35a7c3e6b95a65afffa7 sale_extra-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+d3edd73f98f75ae80f1ba1058c7a0a7c0c1485df sale_extra-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+e1f0b6a705e5e87c5707d737b2a271177ab42ca0 sale_extra-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+b07c3f104931d10aa1d015e7d712b2c6519b54bc sale_extra-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+e7516800e812afa2065d1e08e86021dcf0cc5bdb sale_extra-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+126cdf7207c7dc8e7cc0fb00b49dec3c2326031c sale_extra-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+3f4e25ec446eb2b04cb941890120df86d5d629b6 sale_extra-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+7a7bfdc619295e1e225b1ea8f6b07dfb8769d4ec sale_extra-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+f3e01b105d1983d8835916e46748a28f492a5aec sale_extra-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+46c0de980742bcd165e258d654df7a2b1d164f8f sale_extra-6.0.0
+f7260dcf0ebb5739b6b66482ba4bc09b0d4f3e1d 6.0.0
+0379892ea1576bd17c67dae247b16acf688d88a9 6.0.1
+5c1d0d625a8f719800dfe3c6f5fca3e026c06cb6 6.0.2
+526e26430819ade46d6d7745aec20a7fdc395db7 6.0.3
+df89d6304a01a3a379e7f7cc869ae8b6c1c09b0d 6.0.4
+0000000000000000000000000000000000000000 6.0.0
+f7260dcf0ebb5739b6b66482ba4bc09b0d4f3e1d sale_gift_card-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+0379892ea1576bd17c67dae247b16acf688d88a9 sale_gift_card-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+5c1d0d625a8f719800dfe3c6f5fca3e026c06cb6 sale_gift_card-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+526e26430819ade46d6d7745aec20a7fdc395db7 sale_gift_card-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+df89d6304a01a3a379e7f7cc869ae8b6c1c09b0d sale_gift_card-6.0.4
+a10cbe150870d184b9a520b155de9cbc87ecc2f2 1.0.0
+cad9154b8847193dff951b9c4c0a4fa16c66d550 1.2.0
+107d9341d8067b074c60250a15e6cede4f038f7e 1.4.0
+dd5101ebaec9f7d1d13071e0e1ffcf3958a6b0f1 1.6.0
+13263ec7282b5a58dedd84cceb8e33de76a6952e 1.8.0
+4a6f7eb2afa6f6aa315fac3148397a01b0d6ed8e 2.0.0
+746ade947a1b66841722d5bfb4e50a3f87c18c9f 2.2.0
+5cc785354c99154c3656c94aa399a9e1d708db9f 2.4.0
+585d14523722fad71a1d6494123bc763db7ea851 2.6.0
+4b450ba768ec05bd3a46e28d0bdd8f49260f810b 2.8.0
+98c4a6bc6e9e9e26f4cbad60d055b22fa074e0fe 3.0.0
+626631267226df32a752f731624daacafa18e493 3.2.0
+2a184031033ef6cd2bb53f5d754cde0a57a3014a 3.4.0
+57e860bd74aa8d46a8092b643d24b64e5fea6a51 3.6.0
+8dd80d3a8f35cb56e1013d29a4ab2509ac4ee769 3.8.0
+fb552d3041962f3ffd92cd4c2b9822351b546079 4.0.0
+43663308f7adff661eb9c1c7336c9a063d38f945 4.2.0
+7fee0182f57fcf1ec8d7aaef5af2657d9a57ffc3 4.4.0
+e6b09f17a450ee17476bfdffd6610ad424991216 4.6.0
+1a675500baf9f714881ea69f0c045b486f834d1b 4.8.0
+5a31d0c21fa4aefeeb28784a1e7b181d4a71d6d2 5.0.0
+270f93e1f0f67b4d538d6e4931882b616e191707 5.2.0
+0ecdabf1630d793489597e59f3bc4760da48817f 5.4.0
+fc05c15856a5018d7ad0bdb0f34e80dfd56e7b3a 5.6.0
+8bef621cc3cda3d6bdaf1cd4b85fa43e9dacfd51 5.8.0
+1f5bf85b97b4457c460270884d1c0cd839008e59 6.0.0
+0d832b5962c0410c7a26b5e6d18127f89d6fa538 6.0.1
+afcd8bc6a21e7e1b4396e2e7acea123ccaada167 6.0.2
+cff569537d36a9e137a8ce5606db12096a4ac1a1 6.0.3
+03ad81c9b703f727474552d6c377568a95ddd534 6.0.4
+90fe3a8e962d793ad6ab5d6747ca67021a76f90f 6.0.5
+524e1570accd177a27cbde1a53301738f04efabe 6.0.6
+73036e90680d214c3865a4a39575ff7f1e842fe2 6.0.7
+99047c4da39bb9519f91e6fb36ccb90557107ff1 6.0.8
+cdc3e1a724d07f578eef65768c65028b7880f7bd 6.0.9
+0000000000000000000000000000000000000000 1.0.0
+a10cbe150870d184b9a520b155de9cbc87ecc2f2 sale-1.0.0
+0000000000000000000000000000000000000000 1.2.0
+cad9154b8847193dff951b9c4c0a4fa16c66d550 sale-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+107d9341d8067b074c60250a15e6cede4f038f7e sale-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+dd5101ebaec9f7d1d13071e0e1ffcf3958a6b0f1 sale-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+13263ec7282b5a58dedd84cceb8e33de76a6952e sale-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+4a6f7eb2afa6f6aa315fac3148397a01b0d6ed8e sale-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+746ade947a1b66841722d5bfb4e50a3f87c18c9f sale-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+5cc785354c99154c3656c94aa399a9e1d708db9f sale-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+585d14523722fad71a1d6494123bc763db7ea851 sale-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+4b450ba768ec05bd3a46e28d0bdd8f49260f810b sale-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+98c4a6bc6e9e9e26f4cbad60d055b22fa074e0fe sale-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+626631267226df32a752f731624daacafa18e493 sale-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+2a184031033ef6cd2bb53f5d754cde0a57a3014a sale-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+57e860bd74aa8d46a8092b643d24b64e5fea6a51 sale-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+8dd80d3a8f35cb56e1013d29a4ab2509ac4ee769 sale-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+fb552d3041962f3ffd92cd4c2b9822351b546079 sale-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+43663308f7adff661eb9c1c7336c9a063d38f945 sale-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+7fee0182f57fcf1ec8d7aaef5af2657d9a57ffc3 sale-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+e6b09f17a450ee17476bfdffd6610ad424991216 sale-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+1a675500baf9f714881ea69f0c045b486f834d1b sale-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+5a31d0c21fa4aefeeb28784a1e7b181d4a71d6d2 sale-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+270f93e1f0f67b4d538d6e4931882b616e191707 sale-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+0ecdabf1630d793489597e59f3bc4760da48817f sale-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+fc05c15856a5018d7ad0bdb0f34e80dfd56e7b3a sale-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+8bef621cc3cda3d6bdaf1cd4b85fa43e9dacfd51 sale-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+1f5bf85b97b4457c460270884d1c0cd839008e59 sale-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+0d832b5962c0410c7a26b5e6d18127f89d6fa538 sale-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+afcd8bc6a21e7e1b4396e2e7acea123ccaada167 sale-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+cff569537d36a9e137a8ce5606db12096a4ac1a1 sale-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+03ad81c9b703f727474552d6c377568a95ddd534 sale-6.0.4
+0000000000000000000000000000000000000000 6.0.5
+90fe3a8e962d793ad6ab5d6747ca67021a76f90f sale-6.0.5
+0000000000000000000000000000000000000000 6.0.6
+524e1570accd177a27cbde1a53301738f04efabe sale-6.0.6
+0000000000000000000000000000000000000000 6.0.7
+73036e90680d214c3865a4a39575ff7f1e842fe2 sale-6.0.7
+0000000000000000000000000000000000000000 6.0.8
+99047c4da39bb9519f91e6fb36ccb90557107ff1 sale-6.0.8
+0000000000000000000000000000000000000000 6.0.9
+cdc3e1a724d07f578eef65768c65028b7880f7bd sale-6.0.9
+183c2adb200e9ebb4d04e37d16843a86842e5fc4 5.4.0
+818c4a409fd405f8e29257235d3f33c228f98528 5.6.0
+037afc127047ce9a8558cb7f3c5778b8ff84eb60 5.8.0
+18ef01aa2e6feb211bbfc1a53449e227f369ffee 6.0.0
+0000000000000000000000000000000000000000 5.4.0
+183c2adb200e9ebb4d04e37d16843a86842e5fc4 sale_history-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+818c4a409fd405f8e29257235d3f33c228f98528 sale_history-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+037afc127047ce9a8558cb7f3c5778b8ff84eb60 sale_history-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+18ef01aa2e6feb211bbfc1a53449e227f369ffee sale_history-6.0.0
+02193968928ea7a8040f51efb7cbf71a63f6716c 3.0.0
+a3e8ad8e20b1bf89588a287ed33ab8e787934e1f 3.2.0
+a194a1b7c60769f1d3dc847006440be35609ee09 3.4.0
+1e1ada5c238f9e03c696877a237fe2e5eb51a804 3.6.0
+c92b890fd994b9fec5745a294018fa263dfcc444 3.8.0
+eb3a77d0925df79a1ac2e7bea95f38a5cb9703e4 4.0.0
+115f9e97cb33ca748fb1d51275127c272458b56e 4.2.0
+f3a9b35ed2a519b4a9a423459e00ba9dc93ab6be 4.4.0
+59bcb84c02d49c4600e211fd78a875d22034a929 4.6.0
+64ec2452692d45978f759a391b44ab56514559b6 4.8.0
+f61d4e4dc1cb442e84f322be136cf3609cd74991 5.0.0
+ecde908cdd3d027dc6cfad5bfc68538dad162b30 5.2.0
+b564fcd0dcd00071678e81767914bffe6e855d9b 5.4.0
+a15f7ba308fcb2ff1133491c843a079bf9c976f3 5.6.0
+b2b863a78064e4324237d10f17ed3001703c7c13 5.8.0
+d660bd5979030f91ff945fb68a1402e85a57e006 6.0.0
+0000000000000000000000000000000000000000 3.0.0
+02193968928ea7a8040f51efb7cbf71a63f6716c sale_invoice_grouping-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+a3e8ad8e20b1bf89588a287ed33ab8e787934e1f sale_invoice_grouping-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+a194a1b7c60769f1d3dc847006440be35609ee09 sale_invoice_grouping-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+1e1ada5c238f9e03c696877a237fe2e5eb51a804 sale_invoice_grouping-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+c92b890fd994b9fec5745a294018fa263dfcc444 sale_invoice_grouping-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+eb3a77d0925df79a1ac2e7bea95f38a5cb9703e4 sale_invoice_grouping-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+115f9e97cb33ca748fb1d51275127c272458b56e sale_invoice_grouping-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+f3a9b35ed2a519b4a9a423459e00ba9dc93ab6be sale_invoice_grouping-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+59bcb84c02d49c4600e211fd78a875d22034a929 sale_invoice_grouping-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+64ec2452692d45978f759a391b44ab56514559b6 sale_invoice_grouping-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+f61d4e4dc1cb442e84f322be136cf3609cd74991 sale_invoice_grouping-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+ecde908cdd3d027dc6cfad5bfc68538dad162b30 sale_invoice_grouping-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+b564fcd0dcd00071678e81767914bffe6e855d9b sale_invoice_grouping-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+a15f7ba308fcb2ff1133491c843a079bf9c976f3 sale_invoice_grouping-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+b2b863a78064e4324237d10f17ed3001703c7c13 sale_invoice_grouping-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+d660bd5979030f91ff945fb68a1402e85a57e006 sale_invoice_grouping-6.0.0
+8a95588381b35cb27577087832c5ae4da9cd7e3f 1.6.0
+ebc57da9bed5ee9fe72fe058f4df25f1bf64b3d2 1.8.0
+79949ff632053561e2e165741bf0173902de44bf 2.0.0
+ab0f0de52d17ccca323a8b88185d460c168486b8 2.2.0
+b883df5cada60b8fb8885da6a09805ebd82b93ab 2.4.0
+1cf3fa4815060810f3d7da1f011e6b9d104bf2b7 2.6.0
+31409c9f2ef35ddf938d8a75edaa7fb531b2b24b 2.8.0
+78047448b367fbe6f204a0c593f5d6e1791cc097 3.0.0
+fac58ec726e0bb8c4dc9ea5f5d0f0a1fbaf8f94f 3.2.0
+bb0ed6867cabf05d58b5ef98eeb7a364939acdc1 3.4.0
+6ef578dc4f6da372f04cd1c0198a94bfd6f3eb62 3.6.0
+2f848da36791fc48112cd6c7c81a8708f5827431 3.8.0
+fd788ea3774d3eb2aca8480d8076d25513297d69 4.0.0
+e632dd78214b52c0dc93f2471cdd624d9556517b 4.2.0
+0d16cfcf221ed8608565e6e4f5c946b9909d7f14 4.4.0
+11a9ed7c950aee7e9f311ea7d04a4878c06a0257 4.6.0
+f8c109894b1eff1d3b39e8182239553776fab26f 4.8.0
+5888934279521ac12caf69431fa5385380fde816 5.0.0
+1256de2cad83864e82fb1b0bf52c63f7a6338187 5.2.0
+dd0ebdb6c44a90773a827d18e014019f9fb9666d 5.4.0
+fe5bf66c49251e367441e76f708e4c24b4d44d3d 5.6.0
+95169acf1c0a88a30c2fac46e2da054b32e4799f 5.8.0
+13a5b61b9b4583bfe0c9007e410aa5a914955b84 6.0.0
+8f17d0cb6ce9f91620409d1c090e3d8355d24dc4 6.0.1
+0000000000000000000000000000000000000000 1.6.0
+8a95588381b35cb27577087832c5ae4da9cd7e3f sale_opportunity-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+ebc57da9bed5ee9fe72fe058f4df25f1bf64b3d2 sale_opportunity-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+79949ff632053561e2e165741bf0173902de44bf sale_opportunity-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+ab0f0de52d17ccca323a8b88185d460c168486b8 sale_opportunity-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+b883df5cada60b8fb8885da6a09805ebd82b93ab sale_opportunity-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+1cf3fa4815060810f3d7da1f011e6b9d104bf2b7 sale_opportunity-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+31409c9f2ef35ddf938d8a75edaa7fb531b2b24b sale_opportunity-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+78047448b367fbe6f204a0c593f5d6e1791cc097 sale_opportunity-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+fac58ec726e0bb8c4dc9ea5f5d0f0a1fbaf8f94f sale_opportunity-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+bb0ed6867cabf05d58b5ef98eeb7a364939acdc1 sale_opportunity-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+6ef578dc4f6da372f04cd1c0198a94bfd6f3eb62 sale_opportunity-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+2f848da36791fc48112cd6c7c81a8708f5827431 sale_opportunity-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+fd788ea3774d3eb2aca8480d8076d25513297d69 sale_opportunity-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+e632dd78214b52c0dc93f2471cdd624d9556517b sale_opportunity-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+0d16cfcf221ed8608565e6e4f5c946b9909d7f14 sale_opportunity-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+11a9ed7c950aee7e9f311ea7d04a4878c06a0257 sale_opportunity-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+f8c109894b1eff1d3b39e8182239553776fab26f sale_opportunity-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+5888934279521ac12caf69431fa5385380fde816 sale_opportunity-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+1256de2cad83864e82fb1b0bf52c63f7a6338187 sale_opportunity-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+dd0ebdb6c44a90773a827d18e014019f9fb9666d sale_opportunity-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+fe5bf66c49251e367441e76f708e4c24b4d44d3d sale_opportunity-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+95169acf1c0a88a30c2fac46e2da054b32e4799f sale_opportunity-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+13a5b61b9b4583bfe0c9007e410aa5a914955b84 sale_opportunity-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+8f17d0cb6ce9f91620409d1c090e3d8355d24dc4 sale_opportunity-6.0.1
+cf14756390fc8104236ac571a1985ada6dbfbcfb 4.6.0
+92b49453423dbd713b2fe0c4c8acf4a3e2429b05 4.8.0
+cacdd3e5f2f6d79335bc8b2d59c20989104bd700 5.0.0
+5dda623c16d968c13ea93a15736ebc0e40c54997 5.2.0
+bc6b67bbc1c6be7f765ea846a7a9b4705ed7898a 5.4.0
+55badc28caf6c17a1cec03414342862917b50aae 5.6.0
+48510945db7404f4eeb1b3ed097d74f4b0bfa133 5.8.0
+8cf2cd8b23e95b1b20e0ef6e034f87d22e046c30 6.0.0
+0f82434b6bd5a746848c517b56d0b50329dd9032 6.0.1
+6ab687ba33684d9d99ea64d3f6ae66ac0319eb57 6.0.2
+0000000000000000000000000000000000000000 4.6.0
+cf14756390fc8104236ac571a1985ada6dbfbcfb sale_payment-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+92b49453423dbd713b2fe0c4c8acf4a3e2429b05 sale_payment-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+cacdd3e5f2f6d79335bc8b2d59c20989104bd700 sale_payment-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+5dda623c16d968c13ea93a15736ebc0e40c54997 sale_payment-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+bc6b67bbc1c6be7f765ea846a7a9b4705ed7898a sale_payment-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+55badc28caf6c17a1cec03414342862917b50aae sale_payment-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+48510945db7404f4eeb1b3ed097d74f4b0bfa133 sale_payment-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+8cf2cd8b23e95b1b20e0ef6e034f87d22e046c30 sale_payment-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+0f82434b6bd5a746848c517b56d0b50329dd9032 sale_payment-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+6ab687ba33684d9d99ea64d3f6ae66ac0319eb57 sale_payment-6.0.2
+ab27d5f885523aea9a019286456f0d1e5e8004ce 1.4.0
+f9b3c65cec15cb254f0dabd277267713b27ac85e 1.6.0
+fd059eb6efc541f8017126fe01244840d97e9734 1.8.0
+8fba70f4cccaf6eecb33ab96b912896925e0c53c 2.0.0
+72abba3cf573b24c299d8c436ad1ee7ebc7ec019 2.2.0
+2707ce9a73005af39c738bd1ebc802510dea26c6 2.4.0
+77cab32b37ac5edd7633c5180c27a6c714910404 2.6.0
+1e016db1de37328bf2cbfd5e269e3f08fd52aea5 2.8.0
+89e39e7632c711d6b55296cc882dd84269e9c204 3.0.0
+2275c8a82001381ec5b05a110c268cbebcbadf50 3.2.0
+fcccce714c6ea6b301ccfddfcfad3ebd340ba1ab 3.4.0
+da4b0d936e33a548f38c744746fcb09d0a8d8981 3.6.0
+7ab4b6c816aac80c456cccd720f532b0f2683599 3.8.0
+32947c8017123b169ce3016d5ace19b2f3180a5c 4.0.0
+8077ddce6393d8c26c2a827cf26a1c0b800328cf 4.2.0
+655dd1c019ba39803cc86c7ad206d50e637f2cae 4.4.0
+2f8fbabe66588be2c44258cef94188b822d86aa6 4.6.0
+bc8164a5def26df10bfa7f7f6822caf4baa695cf 4.8.0
+38bdc770d89ba2771ed9db9aaa5070a1241e2316 5.0.0
+3e8dba0fb8a97f7f85b4b81c068bb1035ed9f591 5.2.0
+d55fde4995043af44a2db09d2b30fc05aa07e650 5.4.0
+ee4594b79aebab2288a48acc19d437d26660702e 5.6.0
+3dd6b2922b2ce7e7b495a4a9989d51b30f9d20d0 5.8.0
+774b4432599f895c9321db4c1df1c8440e66b05a 6.0.0
+c1f6221592b86abb1c47859ec919af44d302a983 6.0.1
+0000000000000000000000000000000000000000 1.4.0
+ab27d5f885523aea9a019286456f0d1e5e8004ce sale_price_list-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+f9b3c65cec15cb254f0dabd277267713b27ac85e sale_price_list-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+fd059eb6efc541f8017126fe01244840d97e9734 sale_price_list-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+8fba70f4cccaf6eecb33ab96b912896925e0c53c sale_price_list-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+72abba3cf573b24c299d8c436ad1ee7ebc7ec019 sale_price_list-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+2707ce9a73005af39c738bd1ebc802510dea26c6 sale_price_list-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+77cab32b37ac5edd7633c5180c27a6c714910404 sale_price_list-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+1e016db1de37328bf2cbfd5e269e3f08fd52aea5 sale_price_list-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+89e39e7632c711d6b55296cc882dd84269e9c204 sale_price_list-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+2275c8a82001381ec5b05a110c268cbebcbadf50 sale_price_list-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+fcccce714c6ea6b301ccfddfcfad3ebd340ba1ab sale_price_list-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+da4b0d936e33a548f38c744746fcb09d0a8d8981 sale_price_list-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+7ab4b6c816aac80c456cccd720f532b0f2683599 sale_price_list-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+32947c8017123b169ce3016d5ace19b2f3180a5c sale_price_list-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+8077ddce6393d8c26c2a827cf26a1c0b800328cf sale_price_list-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+655dd1c019ba39803cc86c7ad206d50e637f2cae sale_price_list-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+2f8fbabe66588be2c44258cef94188b822d86aa6 sale_price_list-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+bc8164a5def26df10bfa7f7f6822caf4baa695cf sale_price_list-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+38bdc770d89ba2771ed9db9aaa5070a1241e2316 sale_price_list-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+3e8dba0fb8a97f7f85b4b81c068bb1035ed9f591 sale_price_list-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+d55fde4995043af44a2db09d2b30fc05aa07e650 sale_price_list-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+ee4594b79aebab2288a48acc19d437d26660702e sale_price_list-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+3dd6b2922b2ce7e7b495a4a9989d51b30f9d20d0 sale_price_list-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+774b4432599f895c9321db4c1df1c8440e66b05a sale_price_list-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+c1f6221592b86abb1c47859ec919af44d302a983 sale_price_list-6.0.1
+3bc89a03c30827599ba2358137451740c0ed3d32 5.2.0
+8601dafabd0098f2e5df235458ee3d3cd9a7c56d 5.4.0
+e55081ceaa04185643d06774bf80303827e4d53b 5.6.0
+875d7e3c1ea4f922723e9e513171f86d4e47ce06 5.8.0
+8fbeddc61c5fbf7fcd6ea98ca8c918030035c435 6.0.0
+c72b6ac9a0d3d248e0aa710c1f92a6ad64822eff 6.0.1
+2dfbb343ca9515f1cee2f909103a49eb4ba7fcbb 6.0.2
+46fa607228c4eb55edecace49a70e2da9e31dec9 6.0.3
+0000000000000000000000000000000000000000 5.2.0
+3bc89a03c30827599ba2358137451740c0ed3d32 sale_product_customer-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+8601dafabd0098f2e5df235458ee3d3cd9a7c56d sale_product_customer-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+e55081ceaa04185643d06774bf80303827e4d53b sale_product_customer-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+875d7e3c1ea4f922723e9e513171f86d4e47ce06 sale_product_customer-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+8fbeddc61c5fbf7fcd6ea98ca8c918030035c435 sale_product_customer-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+c72b6ac9a0d3d248e0aa710c1f92a6ad64822eff sale_product_customer-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+2dfbb343ca9515f1cee2f909103a49eb4ba7fcbb sale_product_customer-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+46fa607228c4eb55edecace49a70e2da9e31dec9 sale_product_customer-6.0.3
+eb3633ef7e348b175c1de2d74b74ebb8d35ccd7a 4.8.0
+a559a9907346a3ed392d1253d85720553130ee04 5.0.0
+d78fac53046d868f11c8d42f0baff6a0a16497bf 5.2.0
+3c28cf8cc29c42acf80fe349e0e74ebf16b30f3e 5.4.0
+06446e2efbb22a5a2900d58e2c450a4d80d11cbf 5.6.0
+a7c5dedf708211de95b5d6f18be8fe2a40b01477 5.8.0
+b3e615c084feedfd747423c775eb55300824804e 6.0.0
+0000000000000000000000000000000000000000 4.8.0
+eb3633ef7e348b175c1de2d74b74ebb8d35ccd7a sale_promotion_coupon-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+a559a9907346a3ed392d1253d85720553130ee04 sale_promotion_coupon-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+d78fac53046d868f11c8d42f0baff6a0a16497bf sale_promotion_coupon-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+3c28cf8cc29c42acf80fe349e0e74ebf16b30f3e sale_promotion_coupon-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+06446e2efbb22a5a2900d58e2c450a4d80d11cbf sale_promotion_coupon-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+a7c5dedf708211de95b5d6f18be8fe2a40b01477 sale_promotion_coupon-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+b3e615c084feedfd747423c775eb55300824804e sale_promotion_coupon-6.0.0
+9f34c79d46c2d737af28e5989d170dc4c29f8bca 3.8.0
+e9dfc299f0412d0a1d6ab4fa779ce8e1879e0289 4.0.0
+643a8dff3fc66b95106bbe3ea58d3a8bf3f7d702 4.2.0
+932ea4b106c6b82582ae20a257940961bf64c636 4.4.0
+ab0740f8088064fca42753a6cfe2ea6bf7f06826 4.6.0
+79e9c913b4816af96b1eb2366ef0e53b1a76809d 4.8.0
+8cc1caf51ac1a8c6213bb6b60917f6e2754c9d2a 5.0.0
+533b36c56838dcca47711c338612816e2b2f7823 5.2.0
+f6c780c48d4d649ba2cb421fde633ccb38f0e8d1 5.4.0
+fd11abb781d777f1e0e97d7566a541b6adb12321 5.6.0
+3e261884cfc342f9af6527162c804eae3990006a 5.8.0
+201938015dab5f5c3e45f8e38096d6fb7a6a439c 6.0.0
+8e66edc558f665a508a7f2b9897213ce1ca8b212 6.0.1
+a14ed38f936838505a7f3c3310590f5d3ef4c804 6.0.2
+0000000000000000000000000000000000000000 3.8.0
+9f34c79d46c2d737af28e5989d170dc4c29f8bca sale_promotion-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+e9dfc299f0412d0a1d6ab4fa779ce8e1879e0289 sale_promotion-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+643a8dff3fc66b95106bbe3ea58d3a8bf3f7d702 sale_promotion-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+932ea4b106c6b82582ae20a257940961bf64c636 sale_promotion-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+ab0740f8088064fca42753a6cfe2ea6bf7f06826 sale_promotion-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+79e9c913b4816af96b1eb2366ef0e53b1a76809d sale_promotion-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+8cc1caf51ac1a8c6213bb6b60917f6e2754c9d2a sale_promotion-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+533b36c56838dcca47711c338612816e2b2f7823 sale_promotion-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+f6c780c48d4d649ba2cb421fde633ccb38f0e8d1 sale_promotion-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+fd11abb781d777f1e0e97d7566a541b6adb12321 sale_promotion-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+3e261884cfc342f9af6527162c804eae3990006a sale_promotion-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+201938015dab5f5c3e45f8e38096d6fb7a6a439c sale_promotion-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+8e66edc558f665a508a7f2b9897213ce1ca8b212 sale_promotion-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+a14ed38f936838505a7f3c3310590f5d3ef4c804 sale_promotion-6.0.2
+2a228469da4bed16d7d4c457abbc807cc573c265 5.4.0
+56454423ca2d4e487200814673f5ecd8fc980efd 5.6.0
+d805b804f29e407ea4b0f69efcafe6a61865362c 5.8.0
+31c032243180722071056f4e2e2a1d4ae4df953f 6.0.0
+0000000000000000000000000000000000000000 5.4.0
+2a228469da4bed16d7d4c457abbc807cc573c265 sale_secondary_unit-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+56454423ca2d4e487200814673f5ecd8fc980efd sale_secondary_unit-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+d805b804f29e407ea4b0f69efcafe6a61865362c sale_secondary_unit-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+31c032243180722071056f4e2e2a1d4ae4df953f sale_secondary_unit-6.0.0
+71a276c5d18a81476b1545a4d958cda80c4450ab 2.0.0
+36b22ce15af6266455a7344bdb1b7708658a3918 2.2.0
+8b23387948920fbc4acf986227a563387b1086f5 2.4.0
+f45b4c88b84945e0238c9ae55e5c8cd19deb58a8 2.6.0
+4a59cbca07a505cfab07d3da66a5b269b4506ce7 2.8.0
+fbe62f5dc0f7ba0cf659be52bd4e89a14f3af072 3.0.0
+cc69cb0d3fa633a4e40e5deff44a1dc1de6d3d7d 3.2.0
+88f6c7e4d90d1f1a06d13678b864065a62c3dbc6 3.4.0
+c90dd0c24002a8411ec0835bc1f5529b17346a58 3.6.0
+e7ccf8e2b8de17273886b3b3c12fdcedd41310ae 3.8.0
+b60a07baabd40970d72e6f475d129246a2949bf2 4.0.0
+f779a1568b6448e577353c9b5264e9837e0818a9 4.2.0
+b4750cf7a2a1bef268ec448124a8eb94f5c7f3ac 4.4.0
+3c4b4407aedd9dfde45b280f305c95abc1887fa0 4.6.0
+e32589a3bcb51b0afa39c03add8945cd551ef58a 4.8.0
+1f0897f8bf5b6d063011d84250c4d9f2eb54ccbe 5.0.0
+8ae25e38066bc15ac698466d9ed1ff869b5a314a 5.2.0
+00af805dd3e38da7fb98f605bf0122592158c0f6 5.4.0
+724b009489d5ad49fe41028cc9409b60c263b672 5.6.0
+c4d5e46fcf82f58c549f986399f83668dc01e90c 5.8.0
+74a631f9669fcd6d19c994950b9b090d45c96e1f 6.0.0
+1df76bb0fde08ee6c3b456bc7a07348c10f87cdf 6.0.1
+0991e079f758f572450cf07ebcda1c450e6789cf 6.0.2
+aba842b19d04f6534dbc5c000605d90337613448 6.0.3
+caef0e34a8d179924724cd4e9a0c30c365e40679 6.0.4
+0000000000000000000000000000000000000000 2.0.0
+71a276c5d18a81476b1545a4d958cda80c4450ab sale_shipment_cost-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+36b22ce15af6266455a7344bdb1b7708658a3918 sale_shipment_cost-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+8b23387948920fbc4acf986227a563387b1086f5 sale_shipment_cost-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+f45b4c88b84945e0238c9ae55e5c8cd19deb58a8 sale_shipment_cost-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+4a59cbca07a505cfab07d3da66a5b269b4506ce7 sale_shipment_cost-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+fbe62f5dc0f7ba0cf659be52bd4e89a14f3af072 sale_shipment_cost-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+cc69cb0d3fa633a4e40e5deff44a1dc1de6d3d7d sale_shipment_cost-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+88f6c7e4d90d1f1a06d13678b864065a62c3dbc6 sale_shipment_cost-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+c90dd0c24002a8411ec0835bc1f5529b17346a58 sale_shipment_cost-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+e7ccf8e2b8de17273886b3b3c12fdcedd41310ae sale_shipment_cost-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+b60a07baabd40970d72e6f475d129246a2949bf2 sale_shipment_cost-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+f779a1568b6448e577353c9b5264e9837e0818a9 sale_shipment_cost-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+b4750cf7a2a1bef268ec448124a8eb94f5c7f3ac sale_shipment_cost-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+3c4b4407aedd9dfde45b280f305c95abc1887fa0 sale_shipment_cost-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+e32589a3bcb51b0afa39c03add8945cd551ef58a sale_shipment_cost-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+1f0897f8bf5b6d063011d84250c4d9f2eb54ccbe sale_shipment_cost-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+8ae25e38066bc15ac698466d9ed1ff869b5a314a sale_shipment_cost-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+00af805dd3e38da7fb98f605bf0122592158c0f6 sale_shipment_cost-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+724b009489d5ad49fe41028cc9409b60c263b672 sale_shipment_cost-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+c4d5e46fcf82f58c549f986399f83668dc01e90c sale_shipment_cost-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+74a631f9669fcd6d19c994950b9b090d45c96e1f sale_shipment_cost-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+1df76bb0fde08ee6c3b456bc7a07348c10f87cdf sale_shipment_cost-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+0991e079f758f572450cf07ebcda1c450e6789cf sale_shipment_cost-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+aba842b19d04f6534dbc5c000605d90337613448 sale_shipment_cost-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+caef0e34a8d179924724cd4e9a0c30c365e40679 sale_shipment_cost-6.0.4
+4e18bffba1d928a833714369987e61ee691a51e6 3.2.0
+214c0ae0defc5d398a757857953aa3b73e8daaa9 3.4.0
+96118825d91dfa186e344ad464592145bdbdbc03 3.6.0
+234e6dd84adc0e12d1bd4424ac95ea3c53bd8e41 3.8.0
+d753906e57e00e17b3dc46723bc84c51dcac4312 4.0.0
+56504fa2f4fec8ca7e36135be82c93e307e9dde0 4.2.0
+29287b1c5d08d892c5af513ae75a0dda240c0eeb 4.4.0
+3f7db5247270711f88180bdb61676c73a352cfc3 4.6.0
+d2a6c1af0d0aae8c840c4fec727f67ac14d83283 4.8.0
+53c2c7174be144c346358abcf4e5c2e7f280208f 5.0.0
+adad4c039e95428fc3dc357251dbd782264e8a1a 5.2.0
+5ee73bbc4e00d21a6efbeb6d358b3b280aab1744 5.4.0
+70c7edd923532816e22c96397f3201279ef6bd41 5.6.0
+ea9261c209bcd28dafd29205c58f2199596eef50 5.8.0
+5defabd519cf5e50cde2f4779d889abe22f28b75 6.0.0
+0000000000000000000000000000000000000000 3.2.0
+4e18bffba1d928a833714369987e61ee691a51e6 sale_shipment_grouping-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+214c0ae0defc5d398a757857953aa3b73e8daaa9 sale_shipment_grouping-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+96118825d91dfa186e344ad464592145bdbdbc03 sale_shipment_grouping-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+234e6dd84adc0e12d1bd4424ac95ea3c53bd8e41 sale_shipment_grouping-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+d753906e57e00e17b3dc46723bc84c51dcac4312 sale_shipment_grouping-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+56504fa2f4fec8ca7e36135be82c93e307e9dde0 sale_shipment_grouping-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+29287b1c5d08d892c5af513ae75a0dda240c0eeb sale_shipment_grouping-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+3f7db5247270711f88180bdb61676c73a352cfc3 sale_shipment_grouping-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+d2a6c1af0d0aae8c840c4fec727f67ac14d83283 sale_shipment_grouping-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+53c2c7174be144c346358abcf4e5c2e7f280208f sale_shipment_grouping-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+adad4c039e95428fc3dc357251dbd782264e8a1a sale_shipment_grouping-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+5ee73bbc4e00d21a6efbeb6d358b3b280aab1744 sale_shipment_grouping-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+70c7edd923532816e22c96397f3201279ef6bd41 sale_shipment_grouping-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+ea9261c209bcd28dafd29205c58f2199596eef50 sale_shipment_grouping-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+5defabd519cf5e50cde2f4779d889abe22f28b75 sale_shipment_grouping-6.0.0
+85881e061cd7c54322b0f6c2283b6c3ddf552668 4.6.0
+4e2af555b00f240d2902f1c89e269dad16f82250 4.8.0
+d53c9cc0a7aa80ec6fca13e6e7e63da1ef278bbf 5.0.0
+fe7da63d5ea6de75e3fe13109ef8219a69fc2391 5.2.0
+2742ddec3cb1c8334f9d9ecde0a9c6ad5a8ed36c 5.4.0
+1de405190689ab072107b79be6f003938efa1a3b 5.6.0
+6b06320f1b17705be25b353e4b9c11045af31583 5.8.0
+cb41254aec0000127774331aedec41f96a17956b 6.0.0
+0000000000000000000000000000000000000000 4.6.0
+85881e061cd7c54322b0f6c2283b6c3ddf552668 sale_shipment_tolerance-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+4e2af555b00f240d2902f1c89e269dad16f82250 sale_shipment_tolerance-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+d53c9cc0a7aa80ec6fca13e6e7e63da1ef278bbf sale_shipment_tolerance-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+fe7da63d5ea6de75e3fe13109ef8219a69fc2391 sale_shipment_tolerance-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+2742ddec3cb1c8334f9d9ecde0a9c6ad5a8ed36c sale_shipment_tolerance-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+1de405190689ab072107b79be6f003938efa1a3b sale_shipment_tolerance-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+6b06320f1b17705be25b353e4b9c11045af31583 sale_shipment_tolerance-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+cb41254aec0000127774331aedec41f96a17956b sale_shipment_tolerance-6.0.0
+104c6a538cb716b5c27719d633c2d5aff8171646 3.8.0
+905096471c40bdbacfd13f42491991a9b27c21d7 4.0.0
+427e7da28ce7af6b2f4607253c9b235cc669b903 4.2.0
+d992148e8e2f1a8823d265c4ca42d34ab3d8ddf7 4.4.0
+898df1302a7dbaa01416abeeb8d28d59a06da359 4.6.0
+743a19f34c4dbb78065f1404e96c5f923e37e3c8 4.8.0
+b05d84f765a67911944adce3ac14745fce028175 5.0.0
+95f8a4bf87c5e1e810fd1c9f41da850ede67feb9 5.2.0
+7058bd1a301a8b39af68ea44edebffd7752fac05 5.4.0
+2e8927a7d0e2232f5abae5240998a68b72dc7303 5.6.0
+449248ae2cbb69613de518014a0920a44127b53c 5.8.0
+c994d5caf96e9febbdb906400d75ee32a0832125 6.0.0
+744cab2037bee3b12f80d2e96e37d5555d0460e5 6.0.1
+0000000000000000000000000000000000000000 3.8.0
+104c6a538cb716b5c27719d633c2d5aff8171646 sale_stock_quantity-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+905096471c40bdbacfd13f42491991a9b27c21d7 sale_stock_quantity-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+427e7da28ce7af6b2f4607253c9b235cc669b903 sale_stock_quantity-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+d992148e8e2f1a8823d265c4ca42d34ab3d8ddf7 sale_stock_quantity-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+898df1302a7dbaa01416abeeb8d28d59a06da359 sale_stock_quantity-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+743a19f34c4dbb78065f1404e96c5f923e37e3c8 sale_stock_quantity-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+b05d84f765a67911944adce3ac14745fce028175 sale_stock_quantity-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+95f8a4bf87c5e1e810fd1c9f41da850ede67feb9 sale_stock_quantity-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+7058bd1a301a8b39af68ea44edebffd7752fac05 sale_stock_quantity-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+2e8927a7d0e2232f5abae5240998a68b72dc7303 sale_stock_quantity-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+449248ae2cbb69613de518014a0920a44127b53c sale_stock_quantity-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+c994d5caf96e9febbdb906400d75ee32a0832125 sale_stock_quantity-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+744cab2037bee3b12f80d2e96e37d5555d0460e5 sale_stock_quantity-6.0.1
+75517bd9657c0e40c5ec4e9e3e37df1586f4dc90 5.0.0
+b3dc75efc82dbe9433628ecb62de248d27db2ad3 5.2.0
+6f9c41ec5642ab214b9ec0f72d2fb9bf0c94e98d 5.4.0
+3bcc53cee134356e3bb99c6c2deb4c54d7121a99 5.6.0
+d2667ef655e3fcd2bce97d45493dd3ca2d39981c 5.8.0
+4de0f53738952b064ded56a22ba8f7dd8f3c78ff 6.0.0
+b369f465f2801b165b0178fe351bfd1b30401b41 6.0.1
+0000000000000000000000000000000000000000 5.0.0
+75517bd9657c0e40c5ec4e9e3e37df1586f4dc90 sale_subscription_asset-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+b3dc75efc82dbe9433628ecb62de248d27db2ad3 sale_subscription_asset-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+6f9c41ec5642ab214b9ec0f72d2fb9bf0c94e98d sale_subscription_asset-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+3bcc53cee134356e3bb99c6c2deb4c54d7121a99 sale_subscription_asset-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+d2667ef655e3fcd2bce97d45493dd3ca2d39981c sale_subscription_asset-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+4de0f53738952b064ded56a22ba8f7dd8f3c78ff sale_subscription_asset-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+b369f465f2801b165b0178fe351bfd1b30401b41 sale_subscription_asset-6.0.1
+1e234d7fe95a4207e73e849c12ca95b99723007c 4.4.0
+cf51019e46261067d3ae3b02e89fde523fa0d6a4 4.6.0
+c61628856c63e5efc941573029a21dfb14f1ce06 4.8.0
+0d147bdf58a17b11fe3fb8fcf875ee3d1a75dde6 5.0.0
+5a0870de5f7ae7d7461c9f9eca3af6f235ff3cb6 5.2.0
+5e15f189af137372ca03673beacec43acb69c2c9 5.4.0
+516aa84817b09c7bccbbe86b66b6417aeb425243 5.6.0
+199c9c6bf4abe1ab1984ddd7d11e3ef6cd973d0b 5.8.0
+6770e1add356bc79935ab2b7a7cf9021d94e4cd8 6.0.0
+f86052339cb97ce945912155ee5beb071c6bf58d 6.0.1
+beff7dd082dc6634338cc91e2a7d8749f583af18 6.0.2
+0000000000000000000000000000000000000000 4.4.0
+1e234d7fe95a4207e73e849c12ca95b99723007c sale_subscription-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+cf51019e46261067d3ae3b02e89fde523fa0d6a4 sale_subscription-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+c61628856c63e5efc941573029a21dfb14f1ce06 sale_subscription-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+0d147bdf58a17b11fe3fb8fcf875ee3d1a75dde6 sale_subscription-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+5a0870de5f7ae7d7461c9f9eca3af6f235ff3cb6 sale_subscription-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+5e15f189af137372ca03673beacec43acb69c2c9 sale_subscription-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+516aa84817b09c7bccbbe86b66b6417aeb425243 sale_subscription-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+199c9c6bf4abe1ab1984ddd7d11e3ef6cd973d0b sale_subscription-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+6770e1add356bc79935ab2b7a7cf9021d94e4cd8 sale_subscription-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+f86052339cb97ce945912155ee5beb071c6bf58d sale_subscription-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+beff7dd082dc6634338cc91e2a7d8749f583af18 sale_subscription-6.0.2
+19a57b0b3ad67a2c214b86511794cef0396736e7 2.8.0
+f711cca156f5b37f1979421cec9eb7519ac1fc98 3.0.0
+d66d5107d6b1eecab92dffedaf71343abbc87b48 3.2.0
+7205cff4d35b08ecfc535bc04394365b1503922f 3.4.0
+7127d9b83914b90ba27e1ca499fd30a4d4e39791 3.6.0
+baddf1fac5d962cf2339b003f4099def522f263d 3.8.0
+36405360c0de87f3aaf7603f6794864c2e988bbb 4.0.0
+d928b2d0144e706c003caef549ee1166dadf41f9 4.2.0
+678245521b888dba63e5b31eadc4cb09d3229631 4.4.0
+e395bc2eea0270a69dae5cd36785799006474532 4.6.0
+b4ecb0306ebf8b7d04ce8005edbb70a9f4ba1019 4.8.0
+e2452d05303463862d2da2b262a0a9624787f41e 5.0.0
+97d07dba78b2bc9b87f00d17266e68f6ae7d8da3 5.2.0
+48139e76f98ce32ede8a0f79c414a674a4ebfdcf 5.4.0
+614b1e3edc866b885d531338cbd008c126de3956 5.6.0
+3dd257f7aacb341fc9d3b36bcd5a7ca137e1a39c 5.8.0
+394e3db8573728ed4b4aff1520aeea8ab3f4e063 6.0.0
+906621151e54dc1207e32fd0020d5011fe410448 6.0.1
+5adad935706d1d3d9e03b79abffb815ec77ba3af 6.0.2
+6b39b2b8632615e7a32a108acf40c099f493868b 6.0.3
+0000000000000000000000000000000000000000 2.8.0
+19a57b0b3ad67a2c214b86511794cef0396736e7 sale_supply_drop_shipment-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+f711cca156f5b37f1979421cec9eb7519ac1fc98 sale_supply_drop_shipment-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+d66d5107d6b1eecab92dffedaf71343abbc87b48 sale_supply_drop_shipment-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+7205cff4d35b08ecfc535bc04394365b1503922f sale_supply_drop_shipment-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+7127d9b83914b90ba27e1ca499fd30a4d4e39791 sale_supply_drop_shipment-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+baddf1fac5d962cf2339b003f4099def522f263d sale_supply_drop_shipment-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+36405360c0de87f3aaf7603f6794864c2e988bbb sale_supply_drop_shipment-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+d928b2d0144e706c003caef549ee1166dadf41f9 sale_supply_drop_shipment-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+678245521b888dba63e5b31eadc4cb09d3229631 sale_supply_drop_shipment-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+e395bc2eea0270a69dae5cd36785799006474532 sale_supply_drop_shipment-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+b4ecb0306ebf8b7d04ce8005edbb70a9f4ba1019 sale_supply_drop_shipment-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+e2452d05303463862d2da2b262a0a9624787f41e sale_supply_drop_shipment-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+97d07dba78b2bc9b87f00d17266e68f6ae7d8da3 sale_supply_drop_shipment-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+48139e76f98ce32ede8a0f79c414a674a4ebfdcf sale_supply_drop_shipment-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+614b1e3edc866b885d531338cbd008c126de3956 sale_supply_drop_shipment-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+3dd257f7aacb341fc9d3b36bcd5a7ca137e1a39c sale_supply_drop_shipment-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+394e3db8573728ed4b4aff1520aeea8ab3f4e063 sale_supply_drop_shipment-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+906621151e54dc1207e32fd0020d5011fe410448 sale_supply_drop_shipment-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+5adad935706d1d3d9e03b79abffb815ec77ba3af sale_supply_drop_shipment-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+6b39b2b8632615e7a32a108acf40c099f493868b sale_supply_drop_shipment-6.0.3
+9d51a13e8346425ad0304993f732c1e5a20a76c1 2.8.0
+2073077ab2b0c6a1f8a0b39accf36ccb14fd77c0 3.0.0
+25a90ba19bbcf5b93a2ec81d96590f0c244d3df4 3.2.0
+5478dfb45b7d156cb8ce9069290f94ff7340a1b4 3.4.0
+836d4865c124edda9132ce46eedf39031112930a 3.6.0
+ccee92d5cac85cd171a4190c106ca13e17cc077f 3.8.0
+d58ed0bed67cb50a6c576bf6abd582ecbb902d74 4.0.0
+25e9c457fd1097bb0898194632ef719ad1edd8e5 4.2.0
+be59a2b5ff6771cf4d5c9b1c78f72ed8f2995c9a 4.4.0
+cbbb1d178e77d277bdb7c27a0c8b1ecce443b942 4.6.0
+698ea041c44ede7b132ac142db13642c2d4a0e4b 4.8.0
+e869a845b7d9fdbcfe7ed17d4c322230efc34f6e 5.0.0
+e0ebd4611c7a3c6486bd3cb553cb703ce7e03d33 5.2.0
+ecaf5fd99a7a59e3fc5e4615cd668eba43a037ac 5.4.0
+920a0452a4d5fb8781ecb9e3971e77dc54c82802 5.6.0
+2bdcbedcd4c2b51bb9fb1170ccbc856bb0e4c62d 5.8.0
+156bd2b7b22290d9bc319376801d1c70f5a4b6c0 6.0.0
+87d145c8591c8b46f9731cbec8dcfbfc19d22355 6.0.1
+0000000000000000000000000000000000000000 2.8.0
+9d51a13e8346425ad0304993f732c1e5a20a76c1 sale_supply-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+2073077ab2b0c6a1f8a0b39accf36ccb14fd77c0 sale_supply-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+25a90ba19bbcf5b93a2ec81d96590f0c244d3df4 sale_supply-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+5478dfb45b7d156cb8ce9069290f94ff7340a1b4 sale_supply-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+836d4865c124edda9132ce46eedf39031112930a sale_supply-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+ccee92d5cac85cd171a4190c106ca13e17cc077f sale_supply-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+d58ed0bed67cb50a6c576bf6abd582ecbb902d74 sale_supply-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+25e9c457fd1097bb0898194632ef719ad1edd8e5 sale_supply-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+be59a2b5ff6771cf4d5c9b1c78f72ed8f2995c9a sale_supply-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+cbbb1d178e77d277bdb7c27a0c8b1ecce443b942 sale_supply-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+698ea041c44ede7b132ac142db13642c2d4a0e4b sale_supply-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+e869a845b7d9fdbcfe7ed17d4c322230efc34f6e sale_supply-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+e0ebd4611c7a3c6486bd3cb553cb703ce7e03d33 sale_supply-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+ecaf5fd99a7a59e3fc5e4615cd668eba43a037ac sale_supply-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+920a0452a4d5fb8781ecb9e3971e77dc54c82802 sale_supply-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+2bdcbedcd4c2b51bb9fb1170ccbc856bb0e4c62d sale_supply-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+156bd2b7b22290d9bc319376801d1c70f5a4b6c0 sale_supply-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+87d145c8591c8b46f9731cbec8dcfbfc19d22355 sale_supply-6.0.1
+f62f4846d82f2c05110d92ddb65f764478df50d4 5.6.0
+2e4a3b14e265050e2df36c1c96b03fd246a5da6e 5.8.0
+2081017ba6e796df571eb28475f82ada5ab9c27f 6.0.0
+dd0c6e4d288c0a5ba33192e58cb37808ee3fdec2 6.0.1
+0000000000000000000000000000000000000000 5.6.0
+f62f4846d82f2c05110d92ddb65f764478df50d4 sale_supply_production-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+2e4a3b14e265050e2df36c1c96b03fd246a5da6e sale_supply_production-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+2081017ba6e796df571eb28475f82ada5ab9c27f sale_supply_production-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+dd0c6e4d288c0a5ba33192e58cb37808ee3fdec2 sale_supply_production-6.0.1
+2ecdd7815e6c21be61cd051a6a9e8b717f070a88 5.8.0
+8ca8057e893a91132d0cd825f4d657f33d7ea0e7 6.0.0
+3e67ce9619dd4fa27ad1ea43b1b91a56b59f9d01 6.0.1
+0000000000000000000000000000000000000000 5.8.0
+2ecdd7815e6c21be61cd051a6a9e8b717f070a88 stock_assign_manual-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+8ca8057e893a91132d0cd825f4d657f33d7ea0e7 stock_assign_manual-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+3e67ce9619dd4fa27ad1ea43b1b91a56b59f9d01 stock_assign_manual-6.0.1
+1cca6d14276b659f00a0fc38be07cc5fe34f5ee3 4.6.0
+f4fdf5e0eed18ad55d81251b7836d58d82a2c8e6 4.8.0
+a70b520434de02e84563ff24c9355edbfcf211bd 5.0.0
+9f4f86318326142aa40c5581d7ee6305e80bb54c 5.2.0
+9caec42518ff5f7bcae3b3318f8f1a93c659e2df 5.4.0
+30267e762f4cff49765e21f8676afb8a82378004 5.6.0
+2f3647bc2b8116b932578ea01c1933e56c3e6e72 5.8.0
+ae83f77292cfd1c40a0997c570a4fba56ccb09d0 6.0.0
+e135f31b4507791092dc1e3812d47706bf6269ee 6.0.1
+e0f024b6d13467e95992fe5e5a3ff73ee007621e 6.0.2
+0000000000000000000000000000000000000000 4.6.0
+1cca6d14276b659f00a0fc38be07cc5fe34f5ee3 stock_consignment-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+f4fdf5e0eed18ad55d81251b7836d58d82a2c8e6 stock_consignment-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+a70b520434de02e84563ff24c9355edbfcf211bd stock_consignment-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+9f4f86318326142aa40c5581d7ee6305e80bb54c stock_consignment-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+9caec42518ff5f7bcae3b3318f8f1a93c659e2df stock_consignment-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+30267e762f4cff49765e21f8676afb8a82378004 stock_consignment-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+2f3647bc2b8116b932578ea01c1933e56c3e6e72 stock_consignment-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+ae83f77292cfd1c40a0997c570a4fba56ccb09d0 stock_consignment-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+e135f31b4507791092dc1e3812d47706bf6269ee stock_consignment-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+e0f024b6d13467e95992fe5e5a3ff73ee007621e stock_consignment-6.0.2
+b9ba6291ff01f9f6ceaa7685324e385aaad70ed8 1.2.0
+ddd1eccfec75e5a7c29f1679e68987ec16c4079b 1.4.0
+ec15c191467d843cee84661735d8e6b1a614e87f 1.6.0
+3e2d602a2d7bef0d69b99daa0c2c82bc98bbe3f0 1.8.0
+a0bef2c542a5d734e6a7f9d7984e945156cf5be2 2.0.0
+2745e0851b7da8701df441dac1b27e8ec95f5b5e 2.2.0
+7f0bb8e8f9faba66514b88819a8cf38cf79490d3 2.4.0
+88b74de7c907a886cc73be70f38d624ac7ebee19 2.6.0
+ca9d55dd442d515a52a3fcfc8fc60f784ea5e906 2.8.0
+94dfb0ac9d740888fa59ba2d58a9a5c0aef409e1 3.0.0
+9658f3f89a68c82b80138a37a115b764657493c5 3.2.0
+4d5fc8837f7eae07f8634d718b3ae2903b6ae60a 3.4.0
+d22c87db76f1557f048c68f6ad3ad87776b41079 3.6.0
+229754c2419cb9201649abe4a937457458a87c31 3.8.0
+d8d9d25f84964e131574d5c2af10127d5def2de1 4.0.0
+5dcd83fc7e31a660b1bf3481e82fd66fe913917d 4.2.0
+ca7feded741ba1714157280cdb4012d5ec0eee34 4.4.0
+b8a5320254d19e69acf55a9e0d15efd1617963ac 4.6.0
+e51f3aa6f87fd0b45a49d19f1f96f85f024f41cb 4.8.0
+1605875226050dfba9bdbec52bdc178c4d12b3ab 5.0.0
+e3220f9f070d012d207eb41083f9e5b645a14213 5.2.0
+8aa238ec2462dbde49cc8e0d0ab72a48d0e8ffd9 5.4.0
+823cc750b4c3758e09e2b5a9dbc908b6096922e8 5.6.0
+2ea6e7d95ad940d0a7f2b6e35c0547caa3d47ed2 5.8.0
+6b68d584ffcc365975efb0e4754d92b90d060d85 6.0.0
+e233e9feddcc6b91e38f96117d09f77944be1a7e 6.0.1
+cb1831b5b9fbcbb6089ea440e439fb73167cf307 6.0.2
+0000000000000000000000000000000000000000 1.2.0
+b9ba6291ff01f9f6ceaa7685324e385aaad70ed8 stock_forecast-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+ddd1eccfec75e5a7c29f1679e68987ec16c4079b stock_forecast-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+ec15c191467d843cee84661735d8e6b1a614e87f stock_forecast-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+3e2d602a2d7bef0d69b99daa0c2c82bc98bbe3f0 stock_forecast-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+a0bef2c542a5d734e6a7f9d7984e945156cf5be2 stock_forecast-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+2745e0851b7da8701df441dac1b27e8ec95f5b5e stock_forecast-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+7f0bb8e8f9faba66514b88819a8cf38cf79490d3 stock_forecast-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+88b74de7c907a886cc73be70f38d624ac7ebee19 stock_forecast-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+ca9d55dd442d515a52a3fcfc8fc60f784ea5e906 stock_forecast-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+94dfb0ac9d740888fa59ba2d58a9a5c0aef409e1 stock_forecast-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+9658f3f89a68c82b80138a37a115b764657493c5 stock_forecast-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+4d5fc8837f7eae07f8634d718b3ae2903b6ae60a stock_forecast-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+d22c87db76f1557f048c68f6ad3ad87776b41079 stock_forecast-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+229754c2419cb9201649abe4a937457458a87c31 stock_forecast-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+d8d9d25f84964e131574d5c2af10127d5def2de1 stock_forecast-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+5dcd83fc7e31a660b1bf3481e82fd66fe913917d stock_forecast-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+ca7feded741ba1714157280cdb4012d5ec0eee34 stock_forecast-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+b8a5320254d19e69acf55a9e0d15efd1617963ac stock_forecast-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+e51f3aa6f87fd0b45a49d19f1f96f85f024f41cb stock_forecast-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+1605875226050dfba9bdbec52bdc178c4d12b3ab stock_forecast-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+e3220f9f070d012d207eb41083f9e5b645a14213 stock_forecast-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+8aa238ec2462dbde49cc8e0d0ab72a48d0e8ffd9 stock_forecast-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+823cc750b4c3758e09e2b5a9dbc908b6096922e8 stock_forecast-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+2ea6e7d95ad940d0a7f2b6e35c0547caa3d47ed2 stock_forecast-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+6b68d584ffcc365975efb0e4754d92b90d060d85 stock_forecast-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+e233e9feddcc6b91e38f96117d09f77944be1a7e stock_forecast-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+cb1831b5b9fbcbb6089ea440e439fb73167cf307 stock_forecast-6.0.2
+36cc8c10a10e0df5e7a0ef2cb6d6cdda706c0180 1.0.0
+f1d720635a60692c9abeb972734482e01ebc4b87 1.2.0
+0571f5c67623c43272e5fc05cc381554d6bf3db0 1.4.0
+6a658c8f74a540a10272f5d7f311d6c61c04f3da 1.6.0
+902e4b31b9d56918b1e9eb6e9486f52d19820fa6 1.8.0
+c2e3b9e568b73f262ebf0b69c2ca98f97cbb886e 2.0.0
+3babec8ed968fa95e07a7d90351de0e23a1125bf 2.2.0
+6217a989c27b4780c99ae09ee8cd1bd99807f857 2.4.0
+be073cc040e1ea0eabf77e09eaa8c8c97062e3ab 2.6.0
+83de8e4076f99f7247dc034a909a85a0dc500d84 2.8.0
+1e2bd2e0ec24c7c6109d38625e90462dffb18c13 3.0.0
+bcb26eaee7652f9b11cc717402859b0c3c6d87d2 3.2.0
+70be46258bf1471f5712285ae1772941610aaf7b 3.4.0
+70c741dc67fb55b51b950b2c5fa383318e693e04 3.6.0
+1b17ff426586b71fc7df09353c6337abe409c7cc 3.8.0
+f8628e226bd36c24c4ba5fece3363a272d2090eb 4.0.0
+ba22e15da88bf5736b49a85f12d8d4c864f4bd3f 4.2.0
+03dc7be46d80699cc35528ffe1416d972868d830 4.4.0
+e987bc41694de75a4a74235c12d7a576083c24ba 4.6.0
+697136ec827439a97ba89764f6c4e603f44c2dde 4.8.0
+997d19b737f02756d91647bbcf2c244c75454a13 5.0.0
+72a0c9157ce92abc2aef770d49e4f4d2df334e53 5.2.0
+2d1eab94f8c1efa0b7c9008f333d3419d3afd92e 5.4.0
+942dd4faf224b4b7a4d24fa47488f9453c9d37de 5.6.0
+d1e67fbb11774d0a7ca3bd5761cf4ea11dbaa4b8 5.8.0
+07499733ef86626acae2c8249ea02eb14ac4990f 6.0.0
+d2ee66917e7a025dbe0a45c5e20246921f88e3ab 6.0.1
+e0f26d2d46f0b8d2466f74c572e7b3eac747ef6d 6.0.2
+39ab9008e2b31f3067ca193e97e6b4182a97dbf1 6.0.3
+c4559954273ed17956b9f424e506e004cad913a8 6.0.4
+a231e37aa2b8074e0a5ddc4957decd74d528268b 6.0.5
+bdbcc38971c21643796423e4fe7af1d487d7abc6 6.0.6
+95d6cbcf8e8e4c2661c872fbadfc031ed9294a57 6.0.7
+046cf4bde35642bf0dfd9701a4cf2fcfbd0599a7 6.0.8
+21767740f556a7cc537b4e1f39d2d709b7f5ea3a 6.0.9
+7eb0b3717a39da9388a90ed5aa6a84f68494c594 6.0.10
+642a659e1017214dd9559d3c1ab97ffdd5457d79 6.0.11
+a29dbdb162873ebdea451f6895f895b063b3bb07 6.0.12
+b2feddae43b362b85b5b70908cefcff96ba1b0dd 6.0.13
+3688ec9159b359be2fbb3b3de8a8fce97e9effb6 6.0.14
+0dd8675f2ca761e2f461cb96ba36ec5b841404b2 6.0.15
+95767dcfed28d7257ca79b81157006aa8cd78c51 6.0.16
+27b7111d95687f65648992b8c2bc09fdbc24aebe 6.0.17
+98b3979b26627af842f6552583a216346c4ece89 6.0.18
+0000000000000000000000000000000000000000 1.0.0
+36cc8c10a10e0df5e7a0ef2cb6d6cdda706c0180 stock-1.0.0
+0000000000000000000000000000000000000000 1.2.0
+f1d720635a60692c9abeb972734482e01ebc4b87 stock-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+0571f5c67623c43272e5fc05cc381554d6bf3db0 stock-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+6a658c8f74a540a10272f5d7f311d6c61c04f3da stock-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+902e4b31b9d56918b1e9eb6e9486f52d19820fa6 stock-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+c2e3b9e568b73f262ebf0b69c2ca98f97cbb886e stock-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+3babec8ed968fa95e07a7d90351de0e23a1125bf stock-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+6217a989c27b4780c99ae09ee8cd1bd99807f857 stock-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+be073cc040e1ea0eabf77e09eaa8c8c97062e3ab stock-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+83de8e4076f99f7247dc034a909a85a0dc500d84 stock-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+1e2bd2e0ec24c7c6109d38625e90462dffb18c13 stock-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+bcb26eaee7652f9b11cc717402859b0c3c6d87d2 stock-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+70be46258bf1471f5712285ae1772941610aaf7b stock-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+70c741dc67fb55b51b950b2c5fa383318e693e04 stock-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+1b17ff426586b71fc7df09353c6337abe409c7cc stock-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+f8628e226bd36c24c4ba5fece3363a272d2090eb stock-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+ba22e15da88bf5736b49a85f12d8d4c864f4bd3f stock-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+03dc7be46d80699cc35528ffe1416d972868d830 stock-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+e987bc41694de75a4a74235c12d7a576083c24ba stock-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+697136ec827439a97ba89764f6c4e603f44c2dde stock-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+997d19b737f02756d91647bbcf2c244c75454a13 stock-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+72a0c9157ce92abc2aef770d49e4f4d2df334e53 stock-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+2d1eab94f8c1efa0b7c9008f333d3419d3afd92e stock-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+942dd4faf224b4b7a4d24fa47488f9453c9d37de stock-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+d1e67fbb11774d0a7ca3bd5761cf4ea11dbaa4b8 stock-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+07499733ef86626acae2c8249ea02eb14ac4990f stock-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+d2ee66917e7a025dbe0a45c5e20246921f88e3ab stock-6.0.1
+0000000000000000000000000000000000000000 6.0.10
+7eb0b3717a39da9388a90ed5aa6a84f68494c594 stock-6.0.10
+0000000000000000000000000000000000000000 6.0.11
+642a659e1017214dd9559d3c1ab97ffdd5457d79 stock-6.0.11
+0000000000000000000000000000000000000000 6.0.12
+a29dbdb162873ebdea451f6895f895b063b3bb07 stock-6.0.12
+0000000000000000000000000000000000000000 6.0.13
+b2feddae43b362b85b5b70908cefcff96ba1b0dd stock-6.0.13
+0000000000000000000000000000000000000000 6.0.14
+3688ec9159b359be2fbb3b3de8a8fce97e9effb6 stock-6.0.14
+0000000000000000000000000000000000000000 6.0.15
+0dd8675f2ca761e2f461cb96ba36ec5b841404b2 stock-6.0.15
+0000000000000000000000000000000000000000 6.0.16
+95767dcfed28d7257ca79b81157006aa8cd78c51 stock-6.0.16
+0000000000000000000000000000000000000000 6.0.17
+27b7111d95687f65648992b8c2bc09fdbc24aebe stock-6.0.17
+0000000000000000000000000000000000000000 6.0.18
+98b3979b26627af842f6552583a216346c4ece89 stock-6.0.18
+0000000000000000000000000000000000000000 6.0.2
+e0f26d2d46f0b8d2466f74c572e7b3eac747ef6d stock-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+39ab9008e2b31f3067ca193e97e6b4182a97dbf1 stock-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+c4559954273ed17956b9f424e506e004cad913a8 stock-6.0.4
+0000000000000000000000000000000000000000 6.0.5
+a231e37aa2b8074e0a5ddc4957decd74d528268b stock-6.0.5
+0000000000000000000000000000000000000000 6.0.6
+bdbcc38971c21643796423e4fe7af1d487d7abc6 stock-6.0.6
+0000000000000000000000000000000000000000 6.0.7
+95d6cbcf8e8e4c2661c872fbadfc031ed9294a57 stock-6.0.7
+0000000000000000000000000000000000000000 6.0.8
+046cf4bde35642bf0dfd9701a4cf2fcfbd0599a7 stock-6.0.8
+0000000000000000000000000000000000000000 6.0.9
+21767740f556a7cc537b4e1f39d2d709b7f5ea3a stock-6.0.9
+059c67523e52eda86c563a2414e2b6107b101a8d 1.2.0
+225b705164561d09d5fcae80b784da0fedd531fc 1.4.0
+185537801e5e1ed3b6a2f6719db0e999c0d805e1 1.6.0
+1e23789f77c3e731e73ddc789d8b9ce9f01efc70 1.8.0
+241ddb0a8f8ded2e160598d3efc2e2a00d64abc9 2.0.0
+739e08551f9b9d6e80619ad88d2a8e4e64e3c986 2.2.0
+0299558c412d8feb4db592e3f360fd4b0ecc52cc 2.4.0
+44e7cada1ccc7466f0c284505fd21c335cdb1f58 2.6.0
+f688494c52bc7de9316ae436d20441371a73b3ec 2.8.0
+931ee9f97e52351fc8c7dae24581168d1b3b8c18 3.0.0
+4870db0874d83c50955cbbca10af3ae5b26aae94 3.2.0
+154ea5fb86b75faffd363439f1d6e990d6936c68 3.4.0
+af2746cd736ea6c0d5deee681e9e6286513d2837 3.6.0
+cdc30282449ca7b4991228fde5f99d38673a4fd0 3.8.0
+2b15dc5cabb1156e41e49bcc64b55ae085f2e325 4.0.0
+f86b857b0aa3b56b09d5f574b3a4560b0b00502c 4.2.0
+b6f4180cc07450e9041db772ddfd0dca2f3134ef 4.4.0
+52b6e412dc583d0578df29abfb95cc3865cba4b2 4.6.0
+fc2aa3c75ba8fdb40273523e4fefb1777c4919f8 4.8.0
+bd5dc78969db8e574bef34ca69fa946e49c766ef 5.0.0
+9c0c444c4fda668a0ee25e016a67751a11b5e131 5.2.0
+639a8cb26974fca129c9d7bdae8bba88380c9efe 5.4.0
+dbced0dbb0ad20cf471c30cfafd2b0eee3cfe6d4 5.6.0
+ef5bc23acec6b070d72acd94a55539969f114699 5.8.0
+e5bea2a22f5042af86510ab283ef7f6a30276bfd 6.0.0
+0000000000000000000000000000000000000000 1.2.0
+059c67523e52eda86c563a2414e2b6107b101a8d stock_inventory_location-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+225b705164561d09d5fcae80b784da0fedd531fc stock_inventory_location-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+185537801e5e1ed3b6a2f6719db0e999c0d805e1 stock_inventory_location-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+1e23789f77c3e731e73ddc789d8b9ce9f01efc70 stock_inventory_location-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+241ddb0a8f8ded2e160598d3efc2e2a00d64abc9 stock_inventory_location-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+739e08551f9b9d6e80619ad88d2a8e4e64e3c986 stock_inventory_location-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+0299558c412d8feb4db592e3f360fd4b0ecc52cc stock_inventory_location-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+44e7cada1ccc7466f0c284505fd21c335cdb1f58 stock_inventory_location-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+f688494c52bc7de9316ae436d20441371a73b3ec stock_inventory_location-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+931ee9f97e52351fc8c7dae24581168d1b3b8c18 stock_inventory_location-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+4870db0874d83c50955cbbca10af3ae5b26aae94 stock_inventory_location-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+154ea5fb86b75faffd363439f1d6e990d6936c68 stock_inventory_location-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+af2746cd736ea6c0d5deee681e9e6286513d2837 stock_inventory_location-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+cdc30282449ca7b4991228fde5f99d38673a4fd0 stock_inventory_location-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+2b15dc5cabb1156e41e49bcc64b55ae085f2e325 stock_inventory_location-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+f86b857b0aa3b56b09d5f574b3a4560b0b00502c stock_inventory_location-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+b6f4180cc07450e9041db772ddfd0dca2f3134ef stock_inventory_location-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+52b6e412dc583d0578df29abfb95cc3865cba4b2 stock_inventory_location-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+fc2aa3c75ba8fdb40273523e4fefb1777c4919f8 stock_inventory_location-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+bd5dc78969db8e574bef34ca69fa946e49c766ef stock_inventory_location-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+9c0c444c4fda668a0ee25e016a67751a11b5e131 stock_inventory_location-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+639a8cb26974fca129c9d7bdae8bba88380c9efe stock_inventory_location-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+dbced0dbb0ad20cf471c30cfafd2b0eee3cfe6d4 stock_inventory_location-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+ef5bc23acec6b070d72acd94a55539969f114699 stock_inventory_location-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+e5bea2a22f5042af86510ab283ef7f6a30276bfd stock_inventory_location-6.0.0
+13bc032ce45aa856f7c929da56974ff13ff3b7f3 4.6.0
+c5757a882fa6b0f30a7bca1a2e232c59dbe8e997 4.8.0
+7712e9bf2ae5372165f1208c7fcf74caa77733b8 5.0.0
+9cadbedb76593e2b1046c483ff57a5cecb380a41 5.2.0
+061bb098401a21770b1f7d8491805fb2516d50b2 5.4.0
+35e0bc476e8e103ff133ab5797eed1d3979289b2 5.6.0
+a767051ad55af5437c1df4473f0d16251941bc79 5.8.0
+2657bcf38993689626952562bc1999027d0262cd 6.0.0
+0000000000000000000000000000000000000000 4.6.0
+13bc032ce45aa856f7c929da56974ff13ff3b7f3 stock_location_move-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+c5757a882fa6b0f30a7bca1a2e232c59dbe8e997 stock_location_move-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+7712e9bf2ae5372165f1208c7fcf74caa77733b8 stock_location_move-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+9cadbedb76593e2b1046c483ff57a5cecb380a41 stock_location_move-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+061bb098401a21770b1f7d8491805fb2516d50b2 stock_location_move-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+35e0bc476e8e103ff133ab5797eed1d3979289b2 stock_location_move-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+a767051ad55af5437c1df4473f0d16251941bc79 stock_location_move-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+2657bcf38993689626952562bc1999027d0262cd stock_location_move-6.0.0
+b23baaf1166b3f28f7aaa55b16d8f0b50e7121ed 1.2.0
+d9f7fda1212e61153ce87ef5a7ebba1aa906d9f2 1.4.0
+926f70090196ceefd74450f182a8a9b053282600 1.6.0
+9eada792e0e9eda93b8719d4ec92590f2ff3dacf 1.8.0
+8a47bba1738af17af3c6702cc29bd7a6e268dcfb 2.0.0
+c66ac42308b219dd773e9a4f2b76e344cf913cc8 2.2.0
+9a792408dcb3f2902a0c6da0c71db3ad1692dbd9 2.4.0
+5d56a013f279fc4b31e9a73a6e5b4bb8991e25ef 2.6.0
+d0821f9f197cab6cbeb260b6c230e301def3daea 2.8.0
+0a8b7366a62a97d33c7cdc1b6938fccd4ad4104e 3.0.0
+7e56cda8de6b9e0384104bd68e200f467af001bf 3.2.0
+9befac1e3076f141972816af2f6fe8782125df85 3.4.0
+db721dd4b8e93902f4e1173ff0d9f12f92260802 3.6.0
+5e18316f6f636a5474949d3bc5cb66c153e3da4b 3.8.0
+e052747c31f40fd68e13b0ec450c3ffc502e5e66 4.0.0
+13d25c22e30033991a1aa9233b7ecce233ebc6ea 4.2.0
+8eac3ea1d980cb34c5bda3255bc764ec079fe60f 4.4.0
+809b3a45222dbc93dc22785adbb184705b24502a 4.6.0
+ec2b60415d119b35cf61b75247abaf5bb67a70b1 4.8.0
+907c38d009f3853cddeb21db3e569e681e60a82f 5.0.0
+777c5d8d0ccec1c866450b98973009de6a5e38a5 5.2.0
+4abcc1fb1039f1cde5ba1277efc6edb713d427af 5.4.0
+93240765ffba8fb10f1fcc8699db8c9f5d827e36 5.6.0
+119bb6dcafeffabbe80a5b9fcb872071e0f3c784 5.8.0
+1a8e026150a29d49f552c112f9795b1f2ad035b6 6.0.0
+0000000000000000000000000000000000000000 1.2.0
+b23baaf1166b3f28f7aaa55b16d8f0b50e7121ed stock_location_sequence-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+d9f7fda1212e61153ce87ef5a7ebba1aa906d9f2 stock_location_sequence-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+926f70090196ceefd74450f182a8a9b053282600 stock_location_sequence-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+9eada792e0e9eda93b8719d4ec92590f2ff3dacf stock_location_sequence-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+8a47bba1738af17af3c6702cc29bd7a6e268dcfb stock_location_sequence-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+c66ac42308b219dd773e9a4f2b76e344cf913cc8 stock_location_sequence-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+9a792408dcb3f2902a0c6da0c71db3ad1692dbd9 stock_location_sequence-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+5d56a013f279fc4b31e9a73a6e5b4bb8991e25ef stock_location_sequence-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+d0821f9f197cab6cbeb260b6c230e301def3daea stock_location_sequence-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+0a8b7366a62a97d33c7cdc1b6938fccd4ad4104e stock_location_sequence-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+7e56cda8de6b9e0384104bd68e200f467af001bf stock_location_sequence-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+9befac1e3076f141972816af2f6fe8782125df85 stock_location_sequence-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+db721dd4b8e93902f4e1173ff0d9f12f92260802 stock_location_sequence-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+5e18316f6f636a5474949d3bc5cb66c153e3da4b stock_location_sequence-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+e052747c31f40fd68e13b0ec450c3ffc502e5e66 stock_location_sequence-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+13d25c22e30033991a1aa9233b7ecce233ebc6ea stock_location_sequence-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+8eac3ea1d980cb34c5bda3255bc764ec079fe60f stock_location_sequence-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+809b3a45222dbc93dc22785adbb184705b24502a stock_location_sequence-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+ec2b60415d119b35cf61b75247abaf5bb67a70b1 stock_location_sequence-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+907c38d009f3853cddeb21db3e569e681e60a82f stock_location_sequence-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+777c5d8d0ccec1c866450b98973009de6a5e38a5 stock_location_sequence-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+4abcc1fb1039f1cde5ba1277efc6edb713d427af stock_location_sequence-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+93240765ffba8fb10f1fcc8699db8c9f5d827e36 stock_location_sequence-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+119bb6dcafeffabbe80a5b9fcb872071e0f3c784 stock_location_sequence-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+1a8e026150a29d49f552c112f9795b1f2ad035b6 stock_location_sequence-6.0.0
+f3daa4fc57a55e3f24f9430134a7db46b430d24a 2.4.0
+9bfebffac7ac532b86f50e1d93fc3b41d3921d77 2.6.0
+ac0210ea97cffd9aa37a5af53160243fbe0d7f56 2.8.0
+a358b629d083fbbe619614fcf3f26efaa21ff057 3.0.0
+2419d87bd5c29430664571dbd3376b556dc8ed83 3.2.0
+f72cb08228d56df2be724b462e5d9497dc700285 3.4.0
+8f644f057381856d5ab1834f34a981ff1b65fba3 3.6.0
+2918a530bb167f85c238e2dafe30ee6cf942ea70 3.8.0
+571f01b197f02ef5842c30e25e66515c9d1fa0c4 4.0.0
+e79c0e4b00b8455533c2992369e0ad78ce2fb4e0 4.2.0
+c5f89116f21e00e008b9dc515e82a291bc4a37a9 4.4.0
+e966c63314da859ecacd7e40356201e74d3bd715 4.6.0
+d6e8ca4264c50efb67ae4b0b4c2c7b6982612894 4.8.0
+a5722d02c1c5a5ccabf997d980a86bb6bd0160db 5.0.0
+0170b28fa1c9581bf0831a501469df19a3f7b302 5.2.0
+c77c42846d957aa443927c3eb3e0e489eabe3eeb 5.4.0
+4c6125ae5f16e2ded590b4a84c17ae9ab6f0e826 5.6.0
+6ccbea8c304a744066cefa9637aed2bb21ca5149 5.8.0
+2e05cf05ee95b78ad35fc10eeb51fc35a6b6bc9f 6.0.0
+0000000000000000000000000000000000000000 2.4.0
+f3daa4fc57a55e3f24f9430134a7db46b430d24a stock_lot-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+9bfebffac7ac532b86f50e1d93fc3b41d3921d77 stock_lot-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+ac0210ea97cffd9aa37a5af53160243fbe0d7f56 stock_lot-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+a358b629d083fbbe619614fcf3f26efaa21ff057 stock_lot-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+2419d87bd5c29430664571dbd3376b556dc8ed83 stock_lot-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+f72cb08228d56df2be724b462e5d9497dc700285 stock_lot-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+8f644f057381856d5ab1834f34a981ff1b65fba3 stock_lot-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+2918a530bb167f85c238e2dafe30ee6cf942ea70 stock_lot-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+571f01b197f02ef5842c30e25e66515c9d1fa0c4 stock_lot-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+e79c0e4b00b8455533c2992369e0ad78ce2fb4e0 stock_lot-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+c5f89116f21e00e008b9dc515e82a291bc4a37a9 stock_lot-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+e966c63314da859ecacd7e40356201e74d3bd715 stock_lot-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+d6e8ca4264c50efb67ae4b0b4c2c7b6982612894 stock_lot-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+a5722d02c1c5a5ccabf997d980a86bb6bd0160db stock_lot-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+0170b28fa1c9581bf0831a501469df19a3f7b302 stock_lot-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+c77c42846d957aa443927c3eb3e0e489eabe3eeb stock_lot-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+4c6125ae5f16e2ded590b4a84c17ae9ab6f0e826 stock_lot-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+6ccbea8c304a744066cefa9637aed2bb21ca5149 stock_lot-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+2e05cf05ee95b78ad35fc10eeb51fc35a6b6bc9f stock_lot-6.0.0
+f319ec0ab83850bfbc4dbf0c1e3f88923d4c6ba4 3.6.0
+086daa04833949d995472901fff5f58a5ad1ea7c 3.8.0
+f13eceee4f070ddd92d5bf3b4e37723989b25de5 4.0.0
+69a63fa91de5824e6c69c5283b7cc4a560faabde 4.2.0
+abbc7eac4114aeb9d1ec6aa43d7744d4df991431 4.4.0
+b8d5d4e6d18e736b29350b41559f86e1b552c496 4.6.0
+fea52fe8ed7b3233a42ceb4b4185d7db3adf359f 4.8.0
+7e17d7d28b28cf0e6be49af141ba094b802f9b0d 5.0.0
+9d45f2cfdb3983e8fe676177066f8d37f5a8d18d 5.2.0
+19f381cd840ef2196eddcbc954937b3f2b3db661 5.4.0
+d977882bd686aabe9cf7a56b08710358fb8d9960 5.6.0
+78740da434731b98192332919c0cad73f0553da6 5.8.0
+226bd337f659e121a6be8f9c01e5341c1d366a94 6.0.0
+0000000000000000000000000000000000000000 3.6.0
+f319ec0ab83850bfbc4dbf0c1e3f88923d4c6ba4 stock_lot_sled-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+086daa04833949d995472901fff5f58a5ad1ea7c stock_lot_sled-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+f13eceee4f070ddd92d5bf3b4e37723989b25de5 stock_lot_sled-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+69a63fa91de5824e6c69c5283b7cc4a560faabde stock_lot_sled-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+abbc7eac4114aeb9d1ec6aa43d7744d4df991431 stock_lot_sled-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+b8d5d4e6d18e736b29350b41559f86e1b552c496 stock_lot_sled-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+fea52fe8ed7b3233a42ceb4b4185d7db3adf359f stock_lot_sled-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+7e17d7d28b28cf0e6be49af141ba094b802f9b0d stock_lot_sled-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+9d45f2cfdb3983e8fe676177066f8d37f5a8d18d stock_lot_sled-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+19f381cd840ef2196eddcbc954937b3f2b3db661 stock_lot_sled-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+d977882bd686aabe9cf7a56b08710358fb8d9960 stock_lot_sled-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+78740da434731b98192332919c0cad73f0553da6 stock_lot_sled-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+226bd337f659e121a6be8f9c01e5341c1d366a94 stock_lot_sled-6.0.0
+7841e7ccbb5af34441c92e9b24caae751ca71194 5.0.0
+accb9a9e2eecea2c07521b46f81d22bbb13c6efc 5.2.0
+52a0d3ff69fa733416ddb698e73c99a17309ffe1 5.4.0
+fb5d9bead5daa2058a5d59f3ef18de584202b4d6 5.6.0
+703868576e2ab157fe5aadae42c7e6931098aa40 5.8.0
+cc2dd321d99fe14fe9251051eee46a6903c57bc4 6.0.0
+9a158d468bdaf917b6345ea9a6722f524bdb5274 6.0.1
+0000000000000000000000000000000000000000 5.0.0
+7841e7ccbb5af34441c92e9b24caae751ca71194 stock_lot_unit-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+accb9a9e2eecea2c07521b46f81d22bbb13c6efc stock_lot_unit-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+52a0d3ff69fa733416ddb698e73c99a17309ffe1 stock_lot_unit-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+fb5d9bead5daa2058a5d59f3ef18de584202b4d6 stock_lot_unit-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+703868576e2ab157fe5aadae42c7e6931098aa40 stock_lot_unit-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+cc2dd321d99fe14fe9251051eee46a6903c57bc4 stock_lot_unit-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+9a158d468bdaf917b6345ea9a6722f524bdb5274 stock_lot_unit-6.0.1
+2d95440ef29e4e6ae8bf7c513b4cced6038974ad 3.2.0
+5886452ff995b50071f07e05f519b2e4bb0526c9 3.4.0
+ed428643d547655cf08fd33ac6700bedc75308c6 3.6.0
+600f0b784df713a34b9c770622bc8dfd8a2a8c78 3.8.0
+e46734b4ac890bb0bf34bf08e261a6390fb7c3a8 4.0.0
+abf3fe276ee219d027e78dc72ec570add038899b 4.2.0
+e3764726bbbe93305d2e3e8bb20746cd0b33ae4f 4.4.0
+876b678e056f2ba5ae6108b10182c8e3b72184d1 4.6.0
+85793ff5a50a432be0fb45012478972b4c60e056 4.8.0
+6a0a6190312f634e8b64b6997fb1b37129532fbe 5.0.0
+d761efb2ac196534d0ff715146bd9b727c20bd40 5.2.0
+25ebab75a5457e2e00ed334edae56d5f5991a603 5.4.0
+3d96d408e7cb3cc3552ca3b99356990b889f78f6 5.6.0
+28f4106d4fc02d7c6d7f8735a58422031e3e3e1a 5.8.0
+a4cd8b29bbafd25dcf991704353b57b10e383f59 6.0.0
+30c33b19afd38febbe42c02c95b31b56155dc0e3 6.0.1
+0000000000000000000000000000000000000000 3.2.0
+2d95440ef29e4e6ae8bf7c513b4cced6038974ad stock_package-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+5886452ff995b50071f07e05f519b2e4bb0526c9 stock_package-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+ed428643d547655cf08fd33ac6700bedc75308c6 stock_package-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+600f0b784df713a34b9c770622bc8dfd8a2a8c78 stock_package-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+e46734b4ac890bb0bf34bf08e261a6390fb7c3a8 stock_package-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+abf3fe276ee219d027e78dc72ec570add038899b stock_package-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+e3764726bbbe93305d2e3e8bb20746cd0b33ae4f stock_package-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+876b678e056f2ba5ae6108b10182c8e3b72184d1 stock_package-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+85793ff5a50a432be0fb45012478972b4c60e056 stock_package-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+6a0a6190312f634e8b64b6997fb1b37129532fbe stock_package-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+d761efb2ac196534d0ff715146bd9b727c20bd40 stock_package-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+25ebab75a5457e2e00ed334edae56d5f5991a603 stock_package-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+3d96d408e7cb3cc3552ca3b99356990b889f78f6 stock_package-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+28f4106d4fc02d7c6d7f8735a58422031e3e3e1a stock_package-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+a4cd8b29bbafd25dcf991704353b57b10e383f59 stock_package-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+30c33b19afd38febbe42c02c95b31b56155dc0e3 stock_package-6.0.1
+5352520b9e2d793f180c7338973c93eb2756c11a 4.2.0
+48eda81a2c3e4697d12b3ecd43d20cdffdf7f95d 4.4.0
+72b19785f7aefa42c43dbf7430b70393abfafdac 4.6.0
+a3fda5824dc2e831806bb3e54c4b554e28707d66 4.8.0
+c91e82164a66fa45b1e5f5c18f4eecb9666ff9f9 5.0.0
+1d75d725c02de30176404a116395f5cea1a8b15d 5.2.0
+f774a1f78ac021fd0dbe822bde61f5300f1ee672 5.4.0
+e9c1c8ee8d12182e14e0b7fda103035e43d957ef 5.6.0
+879357ee52cac15348178e8cba439074c7fcc206 5.8.0
+ba57075f760026b8388fb77bd0cc053601bd04b0 6.0.0
+09059a2547a75404f58b275ce0fd3918623bc1a7 6.0.1
+2b5ccfa32a5b93ce4f5ac2140fb71f7303b83f09 6.0.2
+4d29e0810a25db6762a820f6cb5e111493294a91 6.0.3
+4b3730e93b5f8671ef5dcf2f6cfa671bdad8dbcc 6.0.4
+0000000000000000000000000000000000000000 4.2.0
+5352520b9e2d793f180c7338973c93eb2756c11a stock_package_shipping_dpd-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+48eda81a2c3e4697d12b3ecd43d20cdffdf7f95d stock_package_shipping_dpd-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+72b19785f7aefa42c43dbf7430b70393abfafdac stock_package_shipping_dpd-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+a3fda5824dc2e831806bb3e54c4b554e28707d66 stock_package_shipping_dpd-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+c91e82164a66fa45b1e5f5c18f4eecb9666ff9f9 stock_package_shipping_dpd-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+1d75d725c02de30176404a116395f5cea1a8b15d stock_package_shipping_dpd-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+f774a1f78ac021fd0dbe822bde61f5300f1ee672 stock_package_shipping_dpd-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+e9c1c8ee8d12182e14e0b7fda103035e43d957ef stock_package_shipping_dpd-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+879357ee52cac15348178e8cba439074c7fcc206 stock_package_shipping_dpd-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+ba57075f760026b8388fb77bd0cc053601bd04b0 stock_package_shipping_dpd-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+09059a2547a75404f58b275ce0fd3918623bc1a7 stock_package_shipping_dpd-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+2b5ccfa32a5b93ce4f5ac2140fb71f7303b83f09 stock_package_shipping_dpd-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+4d29e0810a25db6762a820f6cb5e111493294a91 stock_package_shipping_dpd-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+4b3730e93b5f8671ef5dcf2f6cfa671bdad8dbcc stock_package_shipping_dpd-6.0.4
+6d6ce7193b8fe468b131732a63d49ad51282feb4 4.2.0
+c92db1ac0cb7f23ec59451a1559ae587489e51cf 4.4.0
+896bda88b3e4e06011cc8274248a747c98ed5d8a 4.6.0
+12732a7de25ada586b597f5ceb95a61aca85c982 4.8.0
+d84a549ca4ce55c8b6f2c55e7b387111fe5d31f5 5.0.0
+dfa6486ca4ca8a505a1103a1966f252bfb76b0d5 5.2.0
+fc827a8182eeabea27b4107630814f58615a5093 5.4.0
+1e8a3c6dcb32eebb16c0135a83c6d24a178809a0 5.6.0
+4afae51825024fa5bdda4845018c68076e37f985 5.8.0
+4d757048f5cf112af97613ed3cd8c1d9747d5932 6.0.0
+0000000000000000000000000000000000000000 4.2.0
+6d6ce7193b8fe468b131732a63d49ad51282feb4 stock_package_shipping-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+c92db1ac0cb7f23ec59451a1559ae587489e51cf stock_package_shipping-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+896bda88b3e4e06011cc8274248a747c98ed5d8a stock_package_shipping-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+12732a7de25ada586b597f5ceb95a61aca85c982 stock_package_shipping-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+d84a549ca4ce55c8b6f2c55e7b387111fe5d31f5 stock_package_shipping-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+dfa6486ca4ca8a505a1103a1966f252bfb76b0d5 stock_package_shipping-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+fc827a8182eeabea27b4107630814f58615a5093 stock_package_shipping-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+1e8a3c6dcb32eebb16c0135a83c6d24a178809a0 stock_package_shipping-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+4afae51825024fa5bdda4845018c68076e37f985 stock_package_shipping-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+4d757048f5cf112af97613ed3cd8c1d9747d5932 stock_package_shipping-6.0.0
+14873b27f47664b486aa92a3318081ee86d5cca7 4.2.0
+cd53d5490f327e9e13479e7d1540b47c111f4a23 4.4.0
+ca475eeb8c9c520c70346d799d444bb7225bd55b 4.6.0
+4437ebda9bc7470b4b98ee42370d12a6f942b1c3 4.8.0
+3e4c032cdadea2e021de270022e212eadb23c9d8 5.0.0
+4cde26523853d124058cc72a0bacc483c388c750 5.2.0
+84fdbd3bf2bccebc09b4216e01d9b93193d14daf 5.4.0
+7e0f69141e15402340c207ebefbb2e43083cf1ad 5.6.0
+c338db57b720be61b239b5f39f0080d062ee131e 5.8.0
+7c788a324e4e275dda49e425ab502fe792cc5bec 6.0.0
+c23f35d0e7f71821852b6243c3ad80116587a328 6.0.1
+f20add511e11bdfc0d27e65270e965111e91a831 6.0.2
+b54ffaf40ede8f5093dd3b31fcad9b7ef974fd92 6.0.3
+0000000000000000000000000000000000000000 4.2.0
+14873b27f47664b486aa92a3318081ee86d5cca7 stock_package_shipping_ups-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+cd53d5490f327e9e13479e7d1540b47c111f4a23 stock_package_shipping_ups-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+ca475eeb8c9c520c70346d799d444bb7225bd55b stock_package_shipping_ups-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+4437ebda9bc7470b4b98ee42370d12a6f942b1c3 stock_package_shipping_ups-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+3e4c032cdadea2e021de270022e212eadb23c9d8 stock_package_shipping_ups-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+4cde26523853d124058cc72a0bacc483c388c750 stock_package_shipping_ups-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+84fdbd3bf2bccebc09b4216e01d9b93193d14daf stock_package_shipping_ups-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+7e0f69141e15402340c207ebefbb2e43083cf1ad stock_package_shipping_ups-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+c338db57b720be61b239b5f39f0080d062ee131e stock_package_shipping_ups-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+7c788a324e4e275dda49e425ab502fe792cc5bec stock_package_shipping_ups-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+c23f35d0e7f71821852b6243c3ad80116587a328 stock_package_shipping_ups-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+f20add511e11bdfc0d27e65270e965111e91a831 stock_package_shipping_ups-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+b54ffaf40ede8f5093dd3b31fcad9b7ef974fd92 stock_package_shipping_ups-6.0.3
+2ea983f6240bd88f6b9abf2e4b7b857ce4bdf264 1.2.0
+ec24bd0ab6daa217e29753b68f9ae242f80062b7 1.4.0
+c560e70b18afce2d136cfbcc9f1ebf5756761882 1.6.0
+ab792b3468742c3a1f777165f8bdde4ebc96c1fd 1.8.0
+67d1514d90ff98a12865eaa025269914b15082b8 2.0.0
+53b4739836b0d10620038cce567d4d935f1a1363 2.2.0
+1922c46f7101f9397889c59c908bdd1e4489f70b 2.4.0
+b8e5502b8bd42741c92695a6540fade63bffbd43 2.6.0
+010a427751135ecb84ce3d7c13791ecf37edde23 2.8.0
+0dc520d1c9eeb9e242d5fb61fe2263ac28f5903f 3.0.0
+40cd13193206cc64a30dd7776fa954af1bceded9 3.2.0
+85c6a4a6a1d99d5c99228952115f1a57289856ba 3.4.0
+d2f9dbbcab386708468c523572888c7649e32851 3.6.0
+c540f2937c11c85591041fc8c2c4afd0ff53228f 3.8.0
+e8b3d84c1317eacc7b6b44b53b8ae70859b7977b 4.0.0
+b5442c0b44dc60bb6486bc308636bd37d1f5ff88 4.2.0
+ef4be934e362ed9336b2242ef1f3b799e724dfea 4.4.0
+3d5ef5ae2d89470391e2f59ae298312c670a93fa 4.6.0
+a41145e1e25e6348642c3fef1fb37d68142afc57 4.8.0
+1ea4345152b56228edf41029cf33318c5090cf29 5.0.0
+c10048ef95077f6c48ec1a3dd2cda9b29a55d9ef 5.2.0
+361b17eb46d869242083f3b2d269bc584bc17579 5.4.0
+a02f09f5837245a86c17ca480d069694b85d8214 5.6.0
+dfea61949c69f6013213cc92528fcfbc62e0a0f6 5.8.0
+25101e7ec2d7d8322005ae0e70f3d78256223ebe 6.0.0
+0000000000000000000000000000000000000000 1.2.0
+2ea983f6240bd88f6b9abf2e4b7b857ce4bdf264 stock_product_location-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+ec24bd0ab6daa217e29753b68f9ae242f80062b7 stock_product_location-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+c560e70b18afce2d136cfbcc9f1ebf5756761882 stock_product_location-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+ab792b3468742c3a1f777165f8bdde4ebc96c1fd stock_product_location-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+67d1514d90ff98a12865eaa025269914b15082b8 stock_product_location-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+53b4739836b0d10620038cce567d4d935f1a1363 stock_product_location-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+1922c46f7101f9397889c59c908bdd1e4489f70b stock_product_location-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+b8e5502b8bd42741c92695a6540fade63bffbd43 stock_product_location-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+010a427751135ecb84ce3d7c13791ecf37edde23 stock_product_location-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+0dc520d1c9eeb9e242d5fb61fe2263ac28f5903f stock_product_location-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+40cd13193206cc64a30dd7776fa954af1bceded9 stock_product_location-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+85c6a4a6a1d99d5c99228952115f1a57289856ba stock_product_location-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+d2f9dbbcab386708468c523572888c7649e32851 stock_product_location-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+c540f2937c11c85591041fc8c2c4afd0ff53228f stock_product_location-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+e8b3d84c1317eacc7b6b44b53b8ae70859b7977b stock_product_location-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+b5442c0b44dc60bb6486bc308636bd37d1f5ff88 stock_product_location-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+ef4be934e362ed9336b2242ef1f3b799e724dfea stock_product_location-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+3d5ef5ae2d89470391e2f59ae298312c670a93fa stock_product_location-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+a41145e1e25e6348642c3fef1fb37d68142afc57 stock_product_location-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+1ea4345152b56228edf41029cf33318c5090cf29 stock_product_location-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+c10048ef95077f6c48ec1a3dd2cda9b29a55d9ef stock_product_location-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+361b17eb46d869242083f3b2d269bc584bc17579 stock_product_location-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+a02f09f5837245a86c17ca480d069694b85d8214 stock_product_location-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+dfea61949c69f6013213cc92528fcfbc62e0a0f6 stock_product_location-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+25101e7ec2d7d8322005ae0e70f3d78256223ebe stock_product_location-6.0.0
+790271308b23a4856ade0be330ee59b5d69e7e75 6.0.0
+0d690f1867acdf63432b947bbe732d414e407bdd 6.0.1
+c72689d153af662a5cb470842229d8c0a77c7373 6.0.2
+0000000000000000000000000000000000000000 6.0.0
+790271308b23a4856ade0be330ee59b5d69e7e75 stock_quantity_early_planning-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+0d690f1867acdf63432b947bbe732d414e407bdd stock_quantity_early_planning-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+c72689d153af662a5cb470842229d8c0a77c7373 stock_quantity_early_planning-6.0.2
+8c7dc4a68eb44600a2e57f380b7fb39e7d4c9bd7 6.0.0
+97abbb580f15c3bfed62d2229bfba49506d8d5f5 6.0.1
+178ac9fc9cef1e3cf07a6e199a5279ab0f369c87 6.0.2
+37ac933fb3458735fed361ad53724bede8e0c050 6.0.3
+0000000000000000000000000000000000000000 6.0.0
+8c7dc4a68eb44600a2e57f380b7fb39e7d4c9bd7 stock_quantity_issue-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+97abbb580f15c3bfed62d2229bfba49506d8d5f5 stock_quantity_issue-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+178ac9fc9cef1e3cf07a6e199a5279ab0f369c87 stock_quantity_issue-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+37ac933fb3458735fed361ad53724bede8e0c050 stock_quantity_issue-6.0.3
+5e63bae17297495d2b63041be081e6bb8a69be2e 5.4.0
+83b28ed660ea0a02ba4cbaea22f495f2b3038615 5.6.0
+d7e3a25d15aa72096b29d985483e3caeb1fc4a43 5.8.0
+e55605b40ed71ec25e3079bb9c8b473bf879af58 6.0.0
+0000000000000000000000000000000000000000 5.4.0
+5e63bae17297495d2b63041be081e6bb8a69be2e stock_secondary_unit-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+83b28ed660ea0a02ba4cbaea22f495f2b3038615 stock_secondary_unit-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+d7e3a25d15aa72096b29d985483e3caeb1fc4a43 stock_secondary_unit-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+e55605b40ed71ec25e3079bb9c8b473bf879af58 stock_secondary_unit-6.0.0
+e2d7e4135cc43091843e096a227cb69ded3b425a 6.0.0
+a98c4d2bb4d071c619d81c97184764d17f146898 6.0.1
+25169494e1beb8a9a36b6f4f0e02996db373046d 6.0.2
+0000000000000000000000000000000000000000 6.0.0
+e2d7e4135cc43091843e096a227cb69ded3b425a stock_shipment_cost-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+a98c4d2bb4d071c619d81c97184764d17f146898 stock_shipment_cost-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+25169494e1beb8a9a36b6f4f0e02996db373046d stock_shipment_cost-6.0.2
+b11be33a256e6e18c5e478831f2eecdb6cc55b56 4.4.0
+a8fa5ceb9134b53a902c8b860e8d910ab36267bd 4.6.0
+55fcd1727648050cba394388bb31ce0a70b74371 4.8.0
+568b1d3a4957cc66a2023eb3853555fd8b2b313a 5.0.0
+df952bd9a9312169cce9a3559a6808fd15ce729f 5.2.0
+135db8a22874fd324ea9ca94b2f47c5f9d1671f7 5.4.0
+8e1fe403bf2728fcd47d00652c985dbb86b4840c 5.6.0
+5900e412e77ddf587a4ce0d69cde3a3a1e4c5fa3 5.8.0
+5fa8a7ad24a9d9c5726f08a174c22696480bb3c9 6.0.0
+421aeff2cfde33cdaa789d706a265827407b325b 6.0.1
+0000000000000000000000000000000000000000 4.4.0
+b11be33a256e6e18c5e478831f2eecdb6cc55b56 stock_shipment_measurements-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+a8fa5ceb9134b53a902c8b860e8d910ab36267bd stock_shipment_measurements-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+55fcd1727648050cba394388bb31ce0a70b74371 stock_shipment_measurements-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+568b1d3a4957cc66a2023eb3853555fd8b2b313a stock_shipment_measurements-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+df952bd9a9312169cce9a3559a6808fd15ce729f stock_shipment_measurements-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+135db8a22874fd324ea9ca94b2f47c5f9d1671f7 stock_shipment_measurements-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+8e1fe403bf2728fcd47d00652c985dbb86b4840c stock_shipment_measurements-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+5900e412e77ddf587a4ce0d69cde3a3a1e4c5fa3 stock_shipment_measurements-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+5fa8a7ad24a9d9c5726f08a174c22696480bb3c9 stock_shipment_measurements-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+421aeff2cfde33cdaa789d706a265827407b325b stock_shipment_measurements-6.0.1
+28368573eba198c3524a0ef44c5d1318a71a25b6 2.4.0
+04196701d026d86eb57f91c6e38cddecf257d63f 2.6.0
+099647a527ee5b315f03850b900f656bd10d759f 2.8.0
+06bc610a6f9a26c456050fd61c273bd012a21f04 3.0.0
+e793ef3ca432a0e409aa49bc846bd2c572f3a5ee 3.2.0
+99999433d0e31e2b6f1eb2f589844e835d7b2953 3.4.0
+4c27a1322efba12ae02f1299e7989460ffe8af09 3.6.0
+cca693a2c563e30e5f10fefeca30c49101eb3495 3.8.0
+d961a4a36143eae4ff23dc2c8f7b49c83a8e6b9a 4.0.0
+10eb3100612be23bcac20f5c1036e58aaef76ed7 4.2.0
+d73f07a6109ae14f711d9ac9efe316a4595d3ffa 4.4.0
+893b0270a268be94790a68facfb745cc188d7a93 4.6.0
+eef7e68926b3f9c34ae5dc12bcd0ec6884918c09 4.8.0
+fd97dee9a2f6c5fc4c3ddd7298fdcf4c917ef5d9 5.0.0
+c07759c9b8d3b7733620789a050e7b6de418cf99 5.2.0
+160bbe8565f066ff2e7565fd8a9aceec2c3a0bed 5.4.0
+51f597bea6844c61a7dd658329a0e55e011e5327 5.6.0
+f13147d0020a5a42a7420db6678d2472ccf79bd3 5.8.0
+69d98ca60d7117c6ea722ea3d69fb7896859614b 6.0.0
+0000000000000000000000000000000000000000 2.4.0
+28368573eba198c3524a0ef44c5d1318a71a25b6 stock_split-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+04196701d026d86eb57f91c6e38cddecf257d63f stock_split-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+099647a527ee5b315f03850b900f656bd10d759f stock_split-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+06bc610a6f9a26c456050fd61c273bd012a21f04 stock_split-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+e793ef3ca432a0e409aa49bc846bd2c572f3a5ee stock_split-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+99999433d0e31e2b6f1eb2f589844e835d7b2953 stock_split-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+4c27a1322efba12ae02f1299e7989460ffe8af09 stock_split-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+cca693a2c563e30e5f10fefeca30c49101eb3495 stock_split-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+d961a4a36143eae4ff23dc2c8f7b49c83a8e6b9a stock_split-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+10eb3100612be23bcac20f5c1036e58aaef76ed7 stock_split-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+d73f07a6109ae14f711d9ac9efe316a4595d3ffa stock_split-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+893b0270a268be94790a68facfb745cc188d7a93 stock_split-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+eef7e68926b3f9c34ae5dc12bcd0ec6884918c09 stock_split-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+fd97dee9a2f6c5fc4c3ddd7298fdcf4c917ef5d9 stock_split-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+c07759c9b8d3b7733620789a050e7b6de418cf99 stock_split-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+160bbe8565f066ff2e7565fd8a9aceec2c3a0bed stock_split-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+51f597bea6844c61a7dd658329a0e55e011e5327 stock_split-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+f13147d0020a5a42a7420db6678d2472ccf79bd3 stock_split-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+69d98ca60d7117c6ea722ea3d69fb7896859614b stock_split-6.0.0
+2c1e13c8dd3396c1cd8e638111aac955de3ebc00 1.2.0
+5295eef207dc90e5cd3667c3883675e05726ef57 1.4.0
+2dfd00186d72076cf13379297e19c076884078d9 1.6.0
+056794451985f57a11e3cd7eba52f596ee9ec735 1.8.0
+bd08fecfa2cf0e7e3580c85090f62e1711fcfb88 2.0.0
+fe083045a79de94717fd58ecfa407f9662d05445 2.2.0
+926d98699fe8374bf591a6a21561cb51af46b3cb 2.4.0
+5169c4780f85a719ae92808f229620867a6756ca 2.6.0
+bc954fb77cc0651892cdfe10fb52fda48c238a98 2.8.0
+bb15a9f03156fea571be3216d502e5d4dc92439c 3.0.0
+7887dba041046609d589e9db4d3d6cf154d84865 3.2.0
+13c061d1e265b64a17a67ab05b2419ea17a10e7b 3.4.0
+8cd9280b5c4df641c5c969f020cec2d7d291082e 3.6.0
+3cd313fcfb1603d6ba340e254fc09ac6cfd1c420 3.8.0
+f36bf15e0049da995257277971560f979e534808 4.0.0
+a0f86fdcff3f7146eba32e4c06107cbadf7e52e5 4.2.0
+33bc557f7dde9e3ed40d6cc8e11b98eda63239a5 4.4.0
+32bafb5576e02e637109040302e14ff20f32e3a4 4.6.0
+1567de11c58a7052bba71f735826f332ece9ef35 4.8.0
+30611743f9cfe3c23bf8d252b971b011ea54ad53 5.0.0
+39be3138aa4546c555cf9ca5d800bb4ec3c3d7cb 5.2.0
+91f140df04060667e5faab3bf8d1095cab3f5528 5.4.0
+dbec1eac9dc4167e1307adbc62ef72bc7937d5ef 5.6.0
+00c0bad66396daf07d8c5f78dd8dae4ed0e421a4 5.8.0
+5a0e8f4810783920576928b183e3733693959da8 6.0.0
+0000000000000000000000000000000000000000 1.2.0
+2c1e13c8dd3396c1cd8e638111aac955de3ebc00 stock_supply_day-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+5295eef207dc90e5cd3667c3883675e05726ef57 stock_supply_day-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+2dfd00186d72076cf13379297e19c076884078d9 stock_supply_day-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+056794451985f57a11e3cd7eba52f596ee9ec735 stock_supply_day-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+bd08fecfa2cf0e7e3580c85090f62e1711fcfb88 stock_supply_day-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+fe083045a79de94717fd58ecfa407f9662d05445 stock_supply_day-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+926d98699fe8374bf591a6a21561cb51af46b3cb stock_supply_day-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+5169c4780f85a719ae92808f229620867a6756ca stock_supply_day-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+bc954fb77cc0651892cdfe10fb52fda48c238a98 stock_supply_day-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+bb15a9f03156fea571be3216d502e5d4dc92439c stock_supply_day-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+7887dba041046609d589e9db4d3d6cf154d84865 stock_supply_day-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+13c061d1e265b64a17a67ab05b2419ea17a10e7b stock_supply_day-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+8cd9280b5c4df641c5c969f020cec2d7d291082e stock_supply_day-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+3cd313fcfb1603d6ba340e254fc09ac6cfd1c420 stock_supply_day-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+f36bf15e0049da995257277971560f979e534808 stock_supply_day-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+a0f86fdcff3f7146eba32e4c06107cbadf7e52e5 stock_supply_day-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+33bc557f7dde9e3ed40d6cc8e11b98eda63239a5 stock_supply_day-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+32bafb5576e02e637109040302e14ff20f32e3a4 stock_supply_day-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+1567de11c58a7052bba71f735826f332ece9ef35 stock_supply_day-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+30611743f9cfe3c23bf8d252b971b011ea54ad53 stock_supply_day-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+39be3138aa4546c555cf9ca5d800bb4ec3c3d7cb stock_supply_day-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+91f140df04060667e5faab3bf8d1095cab3f5528 stock_supply_day-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+dbec1eac9dc4167e1307adbc62ef72bc7937d5ef stock_supply_day-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+00c0bad66396daf07d8c5f78dd8dae4ed0e421a4 stock_supply_day-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+5a0e8f4810783920576928b183e3733693959da8 stock_supply_day-6.0.0
+0834d76da22334e9c2b1e9d89ba50ac38bd3907f 2.2.0
+3c285f5f45031efbf9966541ace27b80fa45129d 2.4.0
+850476a6cbe95cf9bead5fdfaf094231908623ae 2.6.0
+3e0634468842969d6b2ee5e0f0c69a5aa75088e0 2.8.0
+3a26b77c883afebe780e59cd591c85f86248479c 3.0.0
+e6944d53c9579ff7d529f2fcadc021dc5a96d76c 3.2.0
+749efb5e0a4e86fb5ce3d5f181e73bc61ccd40e8 3.4.0
+370823db908f443f81bae475974c57af6281236b 3.6.0
+ba552f7b9b5297a6cde2372eebc523945d535c93 3.8.0
+0c88f450cac4029d9aaa81e94bc24457aec7c54a 4.0.0
+f0df25bfdb09fc1875f336bb870aa140a3247bcd 4.2.0
+afc2f1896f1c22b4591147b48f03743886e390f2 4.4.0
+5d6cdbfbb2b37451d4875ff9e789bf1350e75ab7 4.6.0
+df25bbcc27ede6b2a09868c7239732c3cd5e2c2a 4.8.0
+df42ccdd98a6fb0b4f55cc24e94f077fec1ffeb2 5.0.0
+d8a1fdd9db7f020437f2d5f02311ab29fe0cbab4 5.2.0
+c4c090246916fe2e00d67a26cb9859ea0a7106b5 5.4.0
+b89599b1cef0267371ce55e1b41cb1958d3312ba 5.6.0
+757b5e5484dd448afcbec95e87c21ecfad938b5f 5.8.0
+579edbea3863be427cfc1bb76cec03d061732d90 6.0.0
+0000000000000000000000000000000000000000 2.2.0
+0834d76da22334e9c2b1e9d89ba50ac38bd3907f stock_supply_forecast-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+3c285f5f45031efbf9966541ace27b80fa45129d stock_supply_forecast-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+850476a6cbe95cf9bead5fdfaf094231908623ae stock_supply_forecast-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+3e0634468842969d6b2ee5e0f0c69a5aa75088e0 stock_supply_forecast-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+3a26b77c883afebe780e59cd591c85f86248479c stock_supply_forecast-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+e6944d53c9579ff7d529f2fcadc021dc5a96d76c stock_supply_forecast-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+749efb5e0a4e86fb5ce3d5f181e73bc61ccd40e8 stock_supply_forecast-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+370823db908f443f81bae475974c57af6281236b stock_supply_forecast-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+ba552f7b9b5297a6cde2372eebc523945d535c93 stock_supply_forecast-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+0c88f450cac4029d9aaa81e94bc24457aec7c54a stock_supply_forecast-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+f0df25bfdb09fc1875f336bb870aa140a3247bcd stock_supply_forecast-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+afc2f1896f1c22b4591147b48f03743886e390f2 stock_supply_forecast-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+5d6cdbfbb2b37451d4875ff9e789bf1350e75ab7 stock_supply_forecast-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+df25bbcc27ede6b2a09868c7239732c3cd5e2c2a stock_supply_forecast-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+df42ccdd98a6fb0b4f55cc24e94f077fec1ffeb2 stock_supply_forecast-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+d8a1fdd9db7f020437f2d5f02311ab29fe0cbab4 stock_supply_forecast-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+c4c090246916fe2e00d67a26cb9859ea0a7106b5 stock_supply_forecast-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+b89599b1cef0267371ce55e1b41cb1958d3312ba stock_supply_forecast-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+757b5e5484dd448afcbec95e87c21ecfad938b5f stock_supply_forecast-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+579edbea3863be427cfc1bb76cec03d061732d90 stock_supply_forecast-6.0.0
+bb2bb6af62f06218b0c8c689b24dd16f43307ca1 1.0.0
+5b0a8261963f167230f23a1b97c8b38519428143 1.2.0
+396ad2807deb26c6c353eb119dc50fd4fdcbb28a 1.4.0
+b44aa993ce24453fdb2362187e201a9375bcaa09 1.6.0
+f76056df60f581f803c7a7e4cec81397e4bbbb9c 1.8.0
+354dfc672c4b3ee2609a4051f6d8d431dd087231 2.0.0
+0881ad5cb82f3f00ec1eea276fa100a957691982 2.2.0
+5eb0f23e5774dddbf43cafe34bf527e1cd78d619 2.4.0
+6cd5f943826cb858bc34d20074bfd81b715114f8 2.6.0
+69f57817f6f0ed6ee0788cfab959a9321fcb45bb 2.8.0
+2ebe2636b804a2f7635d0af5b1030ced08de7a37 3.0.0
+c466a41ecc7586e898f0f4f2341c2e74b41ea816 3.2.0
+ddd6516306dd09e3049fb95ff94b4ce48687e200 3.4.0
+e122da9f78841562722820efbf4d64e4c390e8af 3.6.0
+5dcc2dd84f2145e78882af143cad5111c31f09b6 3.8.0
+c0a58dc8306d6885126b9613ad4b36e0a95b75f0 4.0.0
+afc53d87c88438c9c8e56629e994836844e32dbe 4.2.0
+7bbc6abdafa0642baf4095654151d70c9e5482c4 4.4.0
+99eaaa78814833e4d21e9d96e8c110f061f0edfa 4.6.0
+3b5c655f3c26831a505bd74493f108425d42bc62 4.8.0
+1c163e9beae826b96a72cd0d2c59bf4899241f82 5.0.0
+c139a716d188bf7fbf46574fa84a473133b8bee2 5.2.0
+9264fc010a2d2acb3128d9208977bd6b77fb5160 5.4.0
+2d2feece662966a006078304aa61b695447cef2f 5.6.0
+5756606b07d016272254398e15ae07873a72c230 5.8.0
+d527c60bfe0bc723779200d118179faa7f96ba4a 6.0.0
+7c13addfa07217e498c00f83117517b179d33f1b 6.0.1
+47e2a56c3eb9cd49ad460d35fc16dab4c334384b 6.0.2
+aeafed90f31c18b914b74cfd675f897dc41ca6cd 6.0.3
+0000000000000000000000000000000000000000 1.0.0
+bb2bb6af62f06218b0c8c689b24dd16f43307ca1 stock_supply-1.0.0
+0000000000000000000000000000000000000000 1.2.0
+5b0a8261963f167230f23a1b97c8b38519428143 stock_supply-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+396ad2807deb26c6c353eb119dc50fd4fdcbb28a stock_supply-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+b44aa993ce24453fdb2362187e201a9375bcaa09 stock_supply-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+f76056df60f581f803c7a7e4cec81397e4bbbb9c stock_supply-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+354dfc672c4b3ee2609a4051f6d8d431dd087231 stock_supply-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+0881ad5cb82f3f00ec1eea276fa100a957691982 stock_supply-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+5eb0f23e5774dddbf43cafe34bf527e1cd78d619 stock_supply-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+6cd5f943826cb858bc34d20074bfd81b715114f8 stock_supply-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+69f57817f6f0ed6ee0788cfab959a9321fcb45bb stock_supply-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+2ebe2636b804a2f7635d0af5b1030ced08de7a37 stock_supply-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+c466a41ecc7586e898f0f4f2341c2e74b41ea816 stock_supply-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+ddd6516306dd09e3049fb95ff94b4ce48687e200 stock_supply-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+e122da9f78841562722820efbf4d64e4c390e8af stock_supply-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+5dcc2dd84f2145e78882af143cad5111c31f09b6 stock_supply-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+c0a58dc8306d6885126b9613ad4b36e0a95b75f0 stock_supply-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+afc53d87c88438c9c8e56629e994836844e32dbe stock_supply-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+7bbc6abdafa0642baf4095654151d70c9e5482c4 stock_supply-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+99eaaa78814833e4d21e9d96e8c110f061f0edfa stock_supply-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+3b5c655f3c26831a505bd74493f108425d42bc62 stock_supply-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+1c163e9beae826b96a72cd0d2c59bf4899241f82 stock_supply-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+c139a716d188bf7fbf46574fa84a473133b8bee2 stock_supply-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+9264fc010a2d2acb3128d9208977bd6b77fb5160 stock_supply-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+2d2feece662966a006078304aa61b695447cef2f stock_supply-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+5756606b07d016272254398e15ae07873a72c230 stock_supply-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+d527c60bfe0bc723779200d118179faa7f96ba4a stock_supply-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+7c13addfa07217e498c00f83117517b179d33f1b stock_supply-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+47e2a56c3eb9cd49ad460d35fc16dab4c334384b stock_supply-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+aeafed90f31c18b914b74cfd675f897dc41ca6cd stock_supply-6.0.3
+ec2752f736f671fea3f95f881fa19e7cbfcc88c2 2.4.0
+4541105a8fc9586b5c65f581d70dd6906c41a730 2.6.0
+c0a9cb20a609d38ecf4facd08ffe55b2020e38ad 2.8.0
+ddf4cfa5af01e368d995885606d572d53d36cd7b 3.0.0
+81e986b99d1b16b26e8c7ae69684225bfa252603 3.2.0
+808383c0929c8dda2fab252418dbf31b46c2dffc 3.4.0
+bf11ecaa1d599160a62a02f46639955aaaa472a3 3.6.0
+07c3ef01edffc285a49cb969e18737dfac67bfdc 3.8.0
+d41ca7fbc924d4f73aff1c8377d2f700abe06f2d 4.0.0
+b58e60f41b662ac3d58c7502c4a6b4d5018797f4 4.2.0
+52078228f2c56880ac08f6987e8383c08a8043fd 4.4.0
+5df3455491d72296ada960cb45f72a276433a45d 4.6.0
+769117cd528a585fda8ea67bad5b54bf6fe5f6a6 4.8.0
+25c05b49d46071031d53a7798a711246789d6973 5.0.0
+24c941bdf02946e4bc130135508158dcb9817c39 5.2.0
+d4b5b3fa95da83bb9439320e69f4df43b9360f9c 5.4.0
+0b460de8ca80a58dc7b4d4528c6c4587fa0d16eb 5.6.0
+f0209c41aa97aaf6a1c8da050e47f24ad289aa38 5.8.0
+6f70ee75254fa62addab73552b06b39a2e151e66 6.0.0
+4b8288280406ba3d9a4bfb3c96a84a29ddcb9e23 6.0.1
+0000000000000000000000000000000000000000 2.4.0
+ec2752f736f671fea3f95f881fa19e7cbfcc88c2 stock_supply_production-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+4541105a8fc9586b5c65f581d70dd6906c41a730 stock_supply_production-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+c0a9cb20a609d38ecf4facd08ffe55b2020e38ad stock_supply_production-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+ddf4cfa5af01e368d995885606d572d53d36cd7b stock_supply_production-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+81e986b99d1b16b26e8c7ae69684225bfa252603 stock_supply_production-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+808383c0929c8dda2fab252418dbf31b46c2dffc stock_supply_production-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+bf11ecaa1d599160a62a02f46639955aaaa472a3 stock_supply_production-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+07c3ef01edffc285a49cb969e18737dfac67bfdc stock_supply_production-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+d41ca7fbc924d4f73aff1c8377d2f700abe06f2d stock_supply_production-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+b58e60f41b662ac3d58c7502c4a6b4d5018797f4 stock_supply_production-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+52078228f2c56880ac08f6987e8383c08a8043fd stock_supply_production-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+5df3455491d72296ada960cb45f72a276433a45d stock_supply_production-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+769117cd528a585fda8ea67bad5b54bf6fe5f6a6 stock_supply_production-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+25c05b49d46071031d53a7798a711246789d6973 stock_supply_production-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+24c941bdf02946e4bc130135508158dcb9817c39 stock_supply_production-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+d4b5b3fa95da83bb9439320e69f4df43b9360f9c stock_supply_production-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+0b460de8ca80a58dc7b4d4528c6c4587fa0d16eb stock_supply_production-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+f0209c41aa97aaf6a1c8da050e47f24ad289aa38 stock_supply_production-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+6f70ee75254fa62addab73552b06b39a2e151e66 stock_supply_production-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+4b8288280406ba3d9a4bfb3c96a84a29ddcb9e23 stock_supply_production-6.0.1
+b9082c1aa7e6cc8316754bca8f2b29c7018ef9fc 3.0.0
+1dbac5dcf15dc3f17fb4865387a9e171dd20fc70 3.2.0
+db5b4bb6b6b098dd55089c2923e3eb5e1b8ec56b 3.4.0
+b7cb20ab4ec3b50821983ed8c0b034f30752a6ec 3.6.0
+7961a5a68240535525babbcdf496952107a480bf 3.8.0
+615333cf31aa9cc78cba9d7e20c515752e448fdb 4.0.0
+eaf2542a8adbf470a3249429f44cd5c70fa6a986 4.2.0
+6bd47a06f582784dfca255c49c7877d614adec51 4.4.0
+486b4928c849a93beb92d3bdfecfc8f622a38956 4.6.0
+03ded560c597cabf1a3e7df1fb586ecde33c1529 4.8.0
+7fcc5447286ed6be08252a52014a229fb21e706b 5.0.0
+25dfcaa29bcd9d57cdf019b3cae55b6226c355f6 5.2.0
+d4b86ad1ba39b874c39da9a5a007690489f4e15f 5.4.0
+f55c3c6bdd16d4b2ce85c8d691e9cafa71ce3d1f 5.6.0
+74c459fcf1a4a1237e25c4e3a63adbed65a7d1a8 5.8.0
+71a5bc1d16dc5b2b613ab21d94116f74d3b99320 6.0.0
+0000000000000000000000000000000000000000 3.0.0
+b9082c1aa7e6cc8316754bca8f2b29c7018ef9fc timesheet_cost-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+1dbac5dcf15dc3f17fb4865387a9e171dd20fc70 timesheet_cost-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+db5b4bb6b6b098dd55089c2923e3eb5e1b8ec56b timesheet_cost-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+b7cb20ab4ec3b50821983ed8c0b034f30752a6ec timesheet_cost-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+7961a5a68240535525babbcdf496952107a480bf timesheet_cost-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+615333cf31aa9cc78cba9d7e20c515752e448fdb timesheet_cost-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+eaf2542a8adbf470a3249429f44cd5c70fa6a986 timesheet_cost-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+6bd47a06f582784dfca255c49c7877d614adec51 timesheet_cost-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+486b4928c849a93beb92d3bdfecfc8f622a38956 timesheet_cost-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+03ded560c597cabf1a3e7df1fb586ecde33c1529 timesheet_cost-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+7fcc5447286ed6be08252a52014a229fb21e706b timesheet_cost-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+25dfcaa29bcd9d57cdf019b3cae55b6226c355f6 timesheet_cost-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+d4b86ad1ba39b874c39da9a5a007690489f4e15f timesheet_cost-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+f55c3c6bdd16d4b2ce85c8d691e9cafa71ce3d1f timesheet_cost-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+74c459fcf1a4a1237e25c4e3a63adbed65a7d1a8 timesheet_cost-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+71a5bc1d16dc5b2b613ab21d94116f74d3b99320 timesheet_cost-6.0.0
+a32068d131a6872da6c87812f3fda96c5ad076bb 1.4.0
+3d405f7a2a43e41869b7f438203d3a945b1d68f9 1.6.0
+65577163f1e51a0e1385155cae93eb2900866f3b 1.8.0
+24d03108a830bc2b71924432ebcb32dfd6f5b2e0 2.0.0
+1d020661487e0ddc14d2825aa66ec6772e66010c 2.2.0
+7b90dcce007c3fc93a9b409f54f379f8182728ee 2.4.0
+549128cae2441f891c24176c1f6a67777962e3d3 2.6.0
+8c69d08939dbc773d89f4c637ce6a8d8cadcb866 2.8.0
+4e635a95118453b2ff0ec533a70ac50d4dacc3cb 3.0.0
+5f4ed300d4966e0c16c4497428a130b19a6209f3 3.2.0
+a4e84c96f4735bd710e02a0364af0947ba44d4b7 3.4.0
+728c1ee800a32fdd4856e86998a32c3c929d262d 3.6.0
+1924468dda905272353c147edc625a3496b3421e 3.8.0
+ae80ff03e20174f8ed595b9fa47893598c13f91f 4.0.0
+dd6dfdad58d95b23dab3c1ff906f2e18c634b474 4.2.0
+05cf4e50160ca0801ef2aa7c93d2b9b9c4a41071 4.4.0
+4ad8501eef3e1b47ccf54ecabf5cedbb0bebe99b 4.6.0
+bd8398d102d53692be26bd76171c23b85676304c 4.8.0
+f22152a613c52f8ffece522ec3a1f30e46637e3a 5.0.0
+ae0426e8137939d8d4e14f0d6717b46e0bd6ff3a 5.2.0
+41c1f6178f3f039bc62dd85ebd1fa6f92212c9ec 5.4.0
+f9ad969ee981b3b7cd11723d471d4ed3d0fff873 5.6.0
+a874b70acc06493a4b64edc59ec3be3cba8503a6 5.8.0
+779126589e978c55a09cc15d7854a08fff370416 6.0.0
+8603d8d89e44cb5ad8a8c9efc403db90cd214028 6.0.1
+d2f9bdfd51c32bc1c67d14357acab16782dedb07 6.0.2
+0000000000000000000000000000000000000000 1.4.0
+a32068d131a6872da6c87812f3fda96c5ad076bb timesheet-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+3d405f7a2a43e41869b7f438203d3a945b1d68f9 timesheet-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+65577163f1e51a0e1385155cae93eb2900866f3b timesheet-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+24d03108a830bc2b71924432ebcb32dfd6f5b2e0 timesheet-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+1d020661487e0ddc14d2825aa66ec6772e66010c timesheet-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+7b90dcce007c3fc93a9b409f54f379f8182728ee timesheet-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+549128cae2441f891c24176c1f6a67777962e3d3 timesheet-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+8c69d08939dbc773d89f4c637ce6a8d8cadcb866 timesheet-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+4e635a95118453b2ff0ec533a70ac50d4dacc3cb timesheet-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+5f4ed300d4966e0c16c4497428a130b19a6209f3 timesheet-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+a4e84c96f4735bd710e02a0364af0947ba44d4b7 timesheet-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+728c1ee800a32fdd4856e86998a32c3c929d262d timesheet-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+1924468dda905272353c147edc625a3496b3421e timesheet-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+ae80ff03e20174f8ed595b9fa47893598c13f91f timesheet-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+dd6dfdad58d95b23dab3c1ff906f2e18c634b474 timesheet-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+05cf4e50160ca0801ef2aa7c93d2b9b9c4a41071 timesheet-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+4ad8501eef3e1b47ccf54ecabf5cedbb0bebe99b timesheet-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+bd8398d102d53692be26bd76171c23b85676304c timesheet-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+f22152a613c52f8ffece522ec3a1f30e46637e3a timesheet-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+ae0426e8137939d8d4e14f0d6717b46e0bd6ff3a timesheet-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+41c1f6178f3f039bc62dd85ebd1fa6f92212c9ec timesheet-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+f9ad969ee981b3b7cd11723d471d4ed3d0fff873 timesheet-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+a874b70acc06493a4b64edc59ec3be3cba8503a6 timesheet-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+779126589e978c55a09cc15d7854a08fff370416 timesheet-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+8603d8d89e44cb5ad8a8c9efc403db90cd214028 timesheet-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+d2f9bdfd51c32bc1c67d14357acab16782dedb07 timesheet-6.0.2
+0f3d5527aad7e83e07c84b19983b86f5b580d9b9 5.2.0
+32c3f6707c841e89eaa8e1200b4ed4b4b8c2510d 5.4.0
+65a1ddcc0b7d681c785f9260aa11e9c9a9b3f74b 5.6.0
+8766a61dd6f885faa2bed9eaa21c307412674989 5.8.0
+5c50392d0b77f4f5c1f76ece0997ec73591e887c 6.0.0
+0000000000000000000000000000000000000000 5.2.0
+0f3d5527aad7e83e07c84b19983b86f5b580d9b9 user_role-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+32c3f6707c841e89eaa8e1200b4ed4b4b8c2510d user_role-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+65a1ddcc0b7d681c785f9260aa11e9c9a9b3f74b user_role-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+8766a61dd6f885faa2bed9eaa21c307412674989 user_role-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+5c50392d0b77f4f5c1f76ece0997ec73591e887c user_role-6.0.0
+cc6273db844d391455840a0cb63fbd8e78b704c7 5.8.0
+4020d5ca9497c14dfc273676d49363650eb8da80 6.0.0
+0050d9a729746f753fbd3029ff635a459e458e07 6.0.1
+64b26bac37642e1dcff5f8d9590250cbff8fbc94 6.0.2
+247fec368df174a2cc186065669462b198b3fd62 6.0.3
+0000000000000000000000000000000000000000 5.8.0
+cc6273db844d391455840a0cb63fbd8e78b704c7 web_shop-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+4020d5ca9497c14dfc273676d49363650eb8da80 web_shop-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+0050d9a729746f753fbd3029ff635a459e458e07 web_shop-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+64b26bac37642e1dcff5f8d9590250cbff8fbc94 web_shop-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+247fec368df174a2cc186065669462b198b3fd62 web_shop-6.0.3
+bfc8e45097fc0e414744408e96708fdf5d2b33a1 5.8.0
+2efa183d80e356d0c11731819456b8dd9bc586db 6.0.0
+1f0c1ae839cf3df054309a0aa60e6e7fcdbdc926 6.0.1
+c1149124f1c8206c8b3d787dc9d7f41e61c0fe20 6.0.2
+255623f33107cd9f26a00f89c727634bb01cf1a9 6.0.3
+33f7271faaeccb49772f3ce8dc6e35036d7aec61 6.0.4
+2af6bbee8a75aaca6a213f722f1e4b49d98c551e 6.0.5
+0000000000000000000000000000000000000000 5.8.0
+bfc8e45097fc0e414744408e96708fdf5d2b33a1 web_shop_vue_storefront-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+2efa183d80e356d0c11731819456b8dd9bc586db web_shop_vue_storefront-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+1f0c1ae839cf3df054309a0aa60e6e7fcdbdc926 web_shop_vue_storefront-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+c1149124f1c8206c8b3d787dc9d7f41e61c0fe20 web_shop_vue_storefront-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+255623f33107cd9f26a00f89c727634bb01cf1a9 web_shop_vue_storefront-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+33f7271faaeccb49772f3ce8dc6e35036d7aec61 web_shop_vue_storefront-6.0.4
+0000000000000000000000000000000000000000 6.0.5
+2af6bbee8a75aaca6a213f722f1e4b49d98c551e web_shop_vue_storefront-6.0.5
+0a5ab9e8e526e89b69c1aadb73127da0759edc27 5.8.0
+4b01e563d74ede2cd6ac3c0ae8bd597a963c21a3 6.0.0
+c418c973cfc6b60e495a3376cd632035b9a1a7d8 6.0.1
+0000000000000000000000000000000000000000 5.8.0
+0a5ab9e8e526e89b69c1aadb73127da0759edc27 web_shop_vue_storefront_stripe-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+4b01e563d74ede2cd6ac3c0ae8bd597a963c21a3 web_shop_vue_storefront_stripe-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+c418c973cfc6b60e495a3376cd632035b9a1a7d8 web_shop_vue_storefront_stripe-6.0.1
+d1340478469878c66528aac5cec001841d14ca5a 5.2.0
+bed84c6dd812463897dc9cca5b7909f6ea4651a4 5.4.0
+e37a9b2291b9b60d453a9eabc894d21b5aeca097 5.6.0
+c3046a83c61339a6310b8cf56c2e4dddd59a0675 5.8.0
+0d2662846f667e44e2831a271becf86f8868c9a5 6.0.0
+f5cdb780a081fb87e0ebcb77b71e5b1c9f7233df 6.0.1
+0000000000000000000000000000000000000000 5.2.0
+d1340478469878c66528aac5cec001841d14ca5a web_shortener-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+bed84c6dd812463897dc9cca5b7909f6ea4651a4 web_shortener-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+e37a9b2291b9b60d453a9eabc894d21b5aeca097 web_shortener-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+c3046a83c61339a6310b8cf56c2e4dddd59a0675 web_shortener-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+0d2662846f667e44e2831a271becf86f8868c9a5 web_shortener-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+f5cdb780a081fb87e0ebcb77b71e5b1c9f7233df web_shortener-6.0.1
+99f99784b341ce8bb34bd70d89f51aa45c24f1f7 4.2.0
+a6661fddc44d1cee9c5697d983e8fb38deb73225 4.4.0
+d5c1f780f492de8ab82da98a577a5685bb513d9b 4.6.0
+9ad3bd829ad68cd69806533416aadc50f5eb6794 4.8.0
+ca21f3a99b42b088c6588c36f5e105dae713f775 5.0.0
+c2ef0488218d9d3ee59514b744e2145bbd0147b3 5.2.0
+cb5da130470815adfd7b3681fa2803feed934f45 5.4.0
+b95009d0a58dd058440cc0cd7537e5c4499ea16a 5.6.0
+166c1e4c476baeb36b21cef7963b87b5ca07f71e 5.8.0
+ec9a4f3e26f796c12a267e4b3af717fd2a35c066 6.0.0
+0000000000000000000000000000000000000000 4.2.0
+99f99784b341ce8bb34bd70d89f51aa45c24f1f7 web_user-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+a6661fddc44d1cee9c5697d983e8fb38deb73225 web_user-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+d5c1f780f492de8ab82da98a577a5685bb513d9b web_user-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+9ad3bd829ad68cd69806533416aadc50f5eb6794 web_user-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+ca21f3a99b42b088c6588c36f5e105dae713f775 web_user-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+c2ef0488218d9d3ee59514b744e2145bbd0147b3 web_user-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+cb5da130470815adfd7b3681fa2803feed934f45 web_user-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+b95009d0a58dd058440cc0cd7537e5c4499ea16a web_user-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+166c1e4c476baeb36b21cef7963b87b5ca07f71e web_user-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+ec9a4f3e26f796c12a267e4b3af717fd2a35c066 web_user-6.0.0
+3974f546b848d4ac59551db9f733d8ed62946dfd 1.8.0
+c8fdae3b2338b744fce709572958884a95de87b3 2.0.0
+120d0435125cf3a3c28280321962571924ad422f 2.2.0
+ef9846cb18afe62182de446d8e4fa7b8393f7168 2.4.0
+648c43939fd698988bde5b54f7a1dff9d47922af 2.6.0
+5625ce03643f9f2b69659907754e5b0e924c689f 2.8.0
+31740f7e08a0c449ce6715e1ef15392fb6326ce9 3.0.0
+40affcdda4629de37997d0e5c7d3fe9ca2806b12 3.2.0
+61013c4482fc95a61d2a15a8b21574a706755b10 3.4.0
+2a2503ebd25887ff3668d470809c00c5bcf2c6c7 3.6.0
+1e741a18e2a1f29fcc66e9ab4878554a4e63a355 3.8.0
+403f21dd1bb7059a0928c46c8b21a97c14f9c720 4.0.0
+d5b1e8f047748526d9a2cd354da0e86d617ec4c7 4.2.0
+365af7e74c2baae38e96bc0afb1deae2d2b44ac0 4.4.0
+cd4731fb373698d480a625a286de776a0b9bdc6e 4.6.0
+3867b51d50056fda52882150a017a9dce6811264 4.8.0
+e86f9d540f29dfcd39e8f198b50940c8b91250d6 5.0.0
+f4a0b0e282f39c013c44e5012e6b85e4b8a4ae40 5.2.0
+03daaf3994610fde107d98d8458b2731e03c5306 5.4.0
+a8061a1d268776766c44ceb97094d229dbe31962 5.6.0
+8bc88e82ff9edc33725d08bc0c6f2862f221a127 5.8.0
+ac15e7f1881fd78d30eac0d7c772638265830c77 6.0.0
+14cd94a3e75463a9e4ab4c562cce82470070731b 6.0.1
+b579da9fa80282eaf0657e6d2826147c2c6c2f3d 6.0.2
+dc3d781b552d24dcfb7b0ced4322b1ba17e6ca09 6.0.3
+8e6d0969604981e6d024b203424b1b3f0bcd4cb3 6.0.4
+c20749d242200840432ab0b87ce7c0072ee1be34 6.0.5
+b279acacc05c6df60ca9833a3eb6e22b9f9fa488 6.0.6
+8a5195f7cece07c1baceade758e1e783170abe32 6.0.7
+0000000000000000000000000000000000000000 1.8.0
+3974f546b848d4ac59551db9f733d8ed62946dfd proteus-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+c8fdae3b2338b744fce709572958884a95de87b3 proteus-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+120d0435125cf3a3c28280321962571924ad422f proteus-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+ef9846cb18afe62182de446d8e4fa7b8393f7168 proteus-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+648c43939fd698988bde5b54f7a1dff9d47922af proteus-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+5625ce03643f9f2b69659907754e5b0e924c689f proteus-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+31740f7e08a0c449ce6715e1ef15392fb6326ce9 proteus-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+40affcdda4629de37997d0e5c7d3fe9ca2806b12 proteus-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+61013c4482fc95a61d2a15a8b21574a706755b10 proteus-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+2a2503ebd25887ff3668d470809c00c5bcf2c6c7 proteus-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+1e741a18e2a1f29fcc66e9ab4878554a4e63a355 proteus-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+403f21dd1bb7059a0928c46c8b21a97c14f9c720 proteus-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+d5b1e8f047748526d9a2cd354da0e86d617ec4c7 proteus-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+365af7e74c2baae38e96bc0afb1deae2d2b44ac0 proteus-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+cd4731fb373698d480a625a286de776a0b9bdc6e proteus-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+3867b51d50056fda52882150a017a9dce6811264 proteus-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+e86f9d540f29dfcd39e8f198b50940c8b91250d6 proteus-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+f4a0b0e282f39c013c44e5012e6b85e4b8a4ae40 proteus-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+03daaf3994610fde107d98d8458b2731e03c5306 proteus-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+a8061a1d268776766c44ceb97094d229dbe31962 proteus-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+8bc88e82ff9edc33725d08bc0c6f2862f221a127 proteus-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+ac15e7f1881fd78d30eac0d7c772638265830c77 proteus-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+14cd94a3e75463a9e4ab4c562cce82470070731b proteus-6.0.1
+0000000000000000000000000000000000000000 6.0.2
+b579da9fa80282eaf0657e6d2826147c2c6c2f3d proteus-6.0.2
+0000000000000000000000000000000000000000 6.0.3
+dc3d781b552d24dcfb7b0ced4322b1ba17e6ca09 proteus-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+8e6d0969604981e6d024b203424b1b3f0bcd4cb3 proteus-6.0.4
+0000000000000000000000000000000000000000 6.0.5
+c20749d242200840432ab0b87ce7c0072ee1be34 proteus-6.0.5
+0000000000000000000000000000000000000000 6.0.6
+b279acacc05c6df60ca9833a3eb6e22b9f9fa488 proteus-6.0.6
+0000000000000000000000000000000000000000 6.0.7
+8a5195f7cece07c1baceade758e1e783170abe32 proteus-6.0.7
+c835144ba5fd172c9aa8714683e69ca60bc894bc 3.8.0
+20712dc81634af43f9e0ebb41b0dcea50ccffdd2 4.0.0
+963504a30207af5877c11368ac5dadbc5d28fee1 4.2.0
+1fea2b717dd8d57d0a233c19d7f1eec35bdde0fa 4.4.0
+16a536201007ba66d36040a34e79a8998c4051f8 4.6.0
+08b000057b0b5a69f4034f2e1f5c7f2f7f23276f 4.8.0
+47edb75271514576ea775d28dc286a120675aa32 5.0.0
+4074fcefe73deec0b4dcd8b2e29f6c3c8eade611 5.2.0
+2d6d3a648c1dc1711adcc7bd3ff0930949b3076a 5.4.0
+513d2f77dc3bb1f5335af4faf233ccaa1711ac82 5.6.0
+e013e9930e2f27e5205b93f39d49f3604ae07901 5.8.0
+031cd536bd9f4e89345876c2d438626c57fbb33c 6.0.0
+ca49dcd87a916c997b5fe8bfc79c3195766bd4be 6.0.1
+a8121f01d452fd877749cf304dd691618553fccb 6.0.2
+90177ab7f46ac9703f9130f36f87d696774506be 6.0.3
+c1b6c469704c89d22f838a7c387f8ce2db6c04e8 6.0.4
+d37b211c91cc908fb3dbdc3ea8b52af50ef325a2 6.0.5
+76abf46e661d7f2b5d95bf13fddf107f31d47105 6.0.6
+722e116a59f5a1ba61aede38920e03a05a7d7ce4 6.0.7
+262af554d965998030b6b5b9441bc9469dab2311 6.0.8
+caafedc5aba43c65c49eeddf28ee41d8d35d2108 6.0.9
+a29aac850db9e9d55cc33f3ef1fff7af05043fc8 6.0.10
+c1f4671012217e27ee6fedb519da6eecb6b164d8 6.0.11
+2d40a627f2215c62800149562d033a18d550eabc 6.0.12
+31cb176af93153cff7f9b0ad024ce2d3ecac44c1 6.0.13
+440b2885e1659393f469358808a8b83ccb08c12c 6.0.14
+845114a2dc0253d6cb66883089996adffed70188 6.0.15
+89d9b0b02548363e7dfc984e594d09eff061e29c 6.0.16
+f95deaf6c5404e617fe522d98520c1ba829c64b3 6.0.17
+056876b48b55163bfb276ed713fbc8d3c7ec3209 6.0.18
+3fc2510a1f70752c9489a924727c11951eb5171f 6.0.19
+1491afc63d061116473998f40335b1901c62f7c8 6.0.20
+8f4439b7d4a4908f44c9e6d93b3a45fd8fd39350 6.0.21
+0263312e30f850a6637f1c920dbff1c929bf9ded 6.0.22
+5b249c3acf2243f294089418a325bbdcab7c57ad 6.0.23
+7fd7e8a5ae84dab88f322e900d26cbd2e7115292 6.0.24
+0000000000000000000000000000000000000000 3.8.0
+c835144ba5fd172c9aa8714683e69ca60bc894bc sao-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+20712dc81634af43f9e0ebb41b0dcea50ccffdd2 sao-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+963504a30207af5877c11368ac5dadbc5d28fee1 sao-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+1fea2b717dd8d57d0a233c19d7f1eec35bdde0fa sao-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+16a536201007ba66d36040a34e79a8998c4051f8 sao-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+08b000057b0b5a69f4034f2e1f5c7f2f7f23276f sao-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+47edb75271514576ea775d28dc286a120675aa32 sao-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+4074fcefe73deec0b4dcd8b2e29f6c3c8eade611 sao-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+2d6d3a648c1dc1711adcc7bd3ff0930949b3076a sao-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+513d2f77dc3bb1f5335af4faf233ccaa1711ac82 sao-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+e013e9930e2f27e5205b93f39d49f3604ae07901 sao-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+031cd536bd9f4e89345876c2d438626c57fbb33c sao-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+ca49dcd87a916c997b5fe8bfc79c3195766bd4be sao-6.0.1
+0000000000000000000000000000000000000000 6.0.10
+a29aac850db9e9d55cc33f3ef1fff7af05043fc8 sao-6.0.10
+0000000000000000000000000000000000000000 6.0.11
+c1f4671012217e27ee6fedb519da6eecb6b164d8 sao-6.0.11
+0000000000000000000000000000000000000000 6.0.12
+2d40a627f2215c62800149562d033a18d550eabc sao-6.0.12
+0000000000000000000000000000000000000000 6.0.13
+31cb176af93153cff7f9b0ad024ce2d3ecac44c1 sao-6.0.13
+0000000000000000000000000000000000000000 6.0.14
+440b2885e1659393f469358808a8b83ccb08c12c sao-6.0.14
+0000000000000000000000000000000000000000 6.0.15
+845114a2dc0253d6cb66883089996adffed70188 sao-6.0.15
+0000000000000000000000000000000000000000 6.0.16
+89d9b0b02548363e7dfc984e594d09eff061e29c sao-6.0.16
+0000000000000000000000000000000000000000 6.0.17
+f95deaf6c5404e617fe522d98520c1ba829c64b3 sao-6.0.17
+0000000000000000000000000000000000000000 6.0.18
+056876b48b55163bfb276ed713fbc8d3c7ec3209 sao-6.0.18
+0000000000000000000000000000000000000000 6.0.19
+3fc2510a1f70752c9489a924727c11951eb5171f sao-6.0.19
+0000000000000000000000000000000000000000 6.0.2
+a8121f01d452fd877749cf304dd691618553fccb sao-6.0.2
+0000000000000000000000000000000000000000 6.0.20
+1491afc63d061116473998f40335b1901c62f7c8 sao-6.0.20
+0000000000000000000000000000000000000000 6.0.21
+8f4439b7d4a4908f44c9e6d93b3a45fd8fd39350 sao-6.0.21
+0000000000000000000000000000000000000000 6.0.22
+0263312e30f850a6637f1c920dbff1c929bf9ded sao-6.0.22
+0000000000000000000000000000000000000000 6.0.23
+5b249c3acf2243f294089418a325bbdcab7c57ad sao-6.0.23
+0000000000000000000000000000000000000000 6.0.24
+7fd7e8a5ae84dab88f322e900d26cbd2e7115292 sao-6.0.24
+0000000000000000000000000000000000000000 6.0.3
+90177ab7f46ac9703f9130f36f87d696774506be sao-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+c1b6c469704c89d22f838a7c387f8ce2db6c04e8 sao-6.0.4
+0000000000000000000000000000000000000000 6.0.5
+d37b211c91cc908fb3dbdc3ea8b52af50ef325a2 sao-6.0.5
+0000000000000000000000000000000000000000 6.0.6
+76abf46e661d7f2b5d95bf13fddf107f31d47105 sao-6.0.6
+0000000000000000000000000000000000000000 6.0.7
+722e116a59f5a1ba61aede38920e03a05a7d7ce4 sao-6.0.7
+0000000000000000000000000000000000000000 6.0.8
+262af554d965998030b6b5b9441bc9469dab2311 sao-6.0.8
+0000000000000000000000000000000000000000 6.0.9
+caafedc5aba43c65c49eeddf28ee41d8d35d2108 sao-6.0.9
+4b876ac37410e223bc3628256425d80398d051c6 4.8.0
+144f9950fba568bd77ac0eecd02c7b0d0a98ba87 5.0.0
+ed88584857aa1b39459a420270c0253d460cfe48 5.2.0
+ed46c63b027820aa6e605bb53040f4ed4d133813 5.4.0
+d2db68823a8225ff32842da4e948c1c01197e5cc 5.6.0
+eeab3256f17f6b9bc111d74d6d7f984e75d70f17 5.8.0
+4d33daf649c10711b782ef82b71e49d1a725ccee 6.0.0
+ed86455b7bf99bb7a18309e809adc54e6a4864d8 6.0.1
+0000000000000000000000000000000000000000 4.8.0
+4b876ac37410e223bc3628256425d80398d051c6 trytond-gis-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+144f9950fba568bd77ac0eecd02c7b0d0a98ba87 trytond-gis-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+ed88584857aa1b39459a420270c0253d460cfe48 trytond-gis-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+ed46c63b027820aa6e605bb53040f4ed4d133813 trytond-gis-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+d2db68823a8225ff32842da4e948c1c01197e5cc trytond-gis-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+eeab3256f17f6b9bc111d74d6d7f984e75d70f17 trytond-gis-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+4d33daf649c10711b782ef82b71e49d1a725ccee trytond-gis-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+ed86455b7bf99bb7a18309e809adc54e6a4864d8 trytond-gis-6.0.1
+951bb3311b916cb893adc5294cfb3216d2940169 1.0.0
+9f5ce178a7c403a0865fd4b6c1a82a911df0e998 1.2.0
+e2d31d59de7745de70199b7c340d78b7c4775723 1.4.0
+64691214959ac19983f3b3d1dbb89ff693d1545c 1.6.0
+af3a6063b46bf8739a513a06400fbb9858b5869b 1.8.0
+3475040a8fe081b1b8609350186b779cc640fba4 2.0.0
+1df3f0702c621e65279af52d1f87725747ae8fa4 2.2.0
+640af4420c8eace7ee59a432bec54692f4808b20 2.4.0
+36530840a1d0dce354bbaa58ec849a409d306d83 2.6.0
+2893d6c3efd6df3759ab09a28ea16773a160118e 2.8.0
+759c6ff44b90b8c685e9d9a4124bcd85af204649 3.0.0
+b3d84aa2c3a6ed3b76bfb58a40fc687f68824c29 3.2.0
+f0a9fa755cde703be54efd747f376b096ea8316c 3.4.0
+1e4ba5a3f16e6afd59131b49841eb004e706619d 3.6.0
+0a29a9dba7f56fbdef067772eea3f037934999c9 3.8.0
+49a0caa894dae201ed4ec707f277d9859b5521fb 4.0.0
+eb8949ec5bcedba563b5799f1315a0cecfee61f6 4.2.0
+f253ce8ed02f4c46a69b8b2f29311ad8959698be 4.4.0
+e7a6d0e8002237f624ecc8a45a6a472f7baadd08 4.6.0
+321b0104a732419c11aa4926785502e0615b89c9 4.8.0
+e8cadc044d59edff8a2ca73932c723d507517ec8 5.0.0
+ef34e4e92d45ab2b2b2956bbb6aa8b3ca259eb13 5.2.0
+32170ff46339dbc8609225791ab737a0f3eb0291 5.4.0
+5738a22adbb45390167194e4089adc46c6b638a3 5.6.0
+e21456b81972188261b8a6fc876afc18f641c85b 5.8.0
+2164597ffa5f4f0443e4804944b30f5491070990 6.0.0
+12a321529713d3e0b04fa94883baf66bddf76b75 6.0.1
+10e05cdf4fb3fcd545d8b47d03df8cfb78b38a76 6.0.2
+7b3f3676cf9d72147edcdb0cd477b77b1af7af9e 6.0.3
+68ea8ab81fc3d67e3efe925c3694644a46b7c111 6.0.4
+133f0b26de213e0b5668ae891e176de8f79025fc 6.0.5
+1719ce1a669285333424c02c9e3e45fd636b995c 6.0.6
+67fe2d478dbf413873c0919cfd5d6f3f6f4c2275 6.0.7
+ed230154446f04aed350b7fd0d416a80145645ee 6.0.8
+df3e4a189c249ff54e118a4943c03ecaab5fee60 6.0.9
+32f14e8a77caa727f2dfcec93aa15e05f45ad0b6 6.0.10
+6cb11cbdabc3b93d9698fc17653e8cb24b8154d4 6.0.11
+f34c0f0f0010e95ba38d3378f2e86d7e7a966516 6.0.12
+c1e2890b414d6d9c0bae303577fb784c8e8c715b 6.0.13
+78607bfea2986fe335c98a6ef87905cded1f5b2d 6.0.14
+26fba5237ff3ec9aed2d8aebdc1115e595e76c0b 6.0.15
+c4cf78bb401aec7d52a007eb7bda958658edaf95 6.0.16
+246ad7a2addde11a7b3e828ace36cf5fb1bc6696 6.0.17
+ca63f7f2eef1998de82eae76636c00211f0e3a80 6.0.18
+2973349bc8ca02dc5aba4fbf6a2e4ba270af9780 6.0.19
+9d5f5e04e2b0105bf4ca644bf98811d267054514 6.0.20
+221212011e95b8004c93ec76d21f5ffa12e866ee 6.0.21
+3ff41e43408ddccd4ce91170b6536a2f5cd0112b 6.0.22
+7d81a0faef794489d63fb164d0fb2ba2196c878b 6.0.23
+9b36d68c67a48a2203ef3598f5379d708781dc9e 6.0.24
+0000000000000000000000000000000000000000 1.0.0
+951bb3311b916cb893adc5294cfb3216d2940169 trytond-1.0.0
+0000000000000000000000000000000000000000 1.2.0
+9f5ce178a7c403a0865fd4b6c1a82a911df0e998 trytond-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+e2d31d59de7745de70199b7c340d78b7c4775723 trytond-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+64691214959ac19983f3b3d1dbb89ff693d1545c trytond-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+af3a6063b46bf8739a513a06400fbb9858b5869b trytond-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+3475040a8fe081b1b8609350186b779cc640fba4 trytond-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+1df3f0702c621e65279af52d1f87725747ae8fa4 trytond-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+640af4420c8eace7ee59a432bec54692f4808b20 trytond-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+36530840a1d0dce354bbaa58ec849a409d306d83 trytond-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+2893d6c3efd6df3759ab09a28ea16773a160118e trytond-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+759c6ff44b90b8c685e9d9a4124bcd85af204649 trytond-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+b3d84aa2c3a6ed3b76bfb58a40fc687f68824c29 trytond-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+f0a9fa755cde703be54efd747f376b096ea8316c trytond-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+1e4ba5a3f16e6afd59131b49841eb004e706619d trytond-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+0a29a9dba7f56fbdef067772eea3f037934999c9 trytond-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+49a0caa894dae201ed4ec707f277d9859b5521fb trytond-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+eb8949ec5bcedba563b5799f1315a0cecfee61f6 trytond-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+f253ce8ed02f4c46a69b8b2f29311ad8959698be trytond-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+e7a6d0e8002237f624ecc8a45a6a472f7baadd08 trytond-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+321b0104a732419c11aa4926785502e0615b89c9 trytond-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+e8cadc044d59edff8a2ca73932c723d507517ec8 trytond-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+ef34e4e92d45ab2b2b2956bbb6aa8b3ca259eb13 trytond-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+32170ff46339dbc8609225791ab737a0f3eb0291 trytond-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+5738a22adbb45390167194e4089adc46c6b638a3 trytond-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+e21456b81972188261b8a6fc876afc18f641c85b trytond-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+2164597ffa5f4f0443e4804944b30f5491070990 trytond-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+12a321529713d3e0b04fa94883baf66bddf76b75 trytond-6.0.1
+0000000000000000000000000000000000000000 6.0.10
+32f14e8a77caa727f2dfcec93aa15e05f45ad0b6 trytond-6.0.10
+0000000000000000000000000000000000000000 6.0.11
+6cb11cbdabc3b93d9698fc17653e8cb24b8154d4 trytond-6.0.11
+0000000000000000000000000000000000000000 6.0.12
+f34c0f0f0010e95ba38d3378f2e86d7e7a966516 trytond-6.0.12
+0000000000000000000000000000000000000000 6.0.13
+c1e2890b414d6d9c0bae303577fb784c8e8c715b trytond-6.0.13
+0000000000000000000000000000000000000000 6.0.14
+78607bfea2986fe335c98a6ef87905cded1f5b2d trytond-6.0.14
+0000000000000000000000000000000000000000 6.0.15
+26fba5237ff3ec9aed2d8aebdc1115e595e76c0b trytond-6.0.15
+0000000000000000000000000000000000000000 6.0.16
+c4cf78bb401aec7d52a007eb7bda958658edaf95 trytond-6.0.16
+0000000000000000000000000000000000000000 6.0.17
+246ad7a2addde11a7b3e828ace36cf5fb1bc6696 trytond-6.0.17
+0000000000000000000000000000000000000000 6.0.18
+ca63f7f2eef1998de82eae76636c00211f0e3a80 trytond-6.0.18
+0000000000000000000000000000000000000000 6.0.19
+2973349bc8ca02dc5aba4fbf6a2e4ba270af9780 trytond-6.0.19
+0000000000000000000000000000000000000000 6.0.2
+10e05cdf4fb3fcd545d8b47d03df8cfb78b38a76 trytond-6.0.2
+0000000000000000000000000000000000000000 6.0.20
+9d5f5e04e2b0105bf4ca644bf98811d267054514 trytond-6.0.20
+0000000000000000000000000000000000000000 6.0.21
+221212011e95b8004c93ec76d21f5ffa12e866ee trytond-6.0.21
+0000000000000000000000000000000000000000 6.0.22
+3ff41e43408ddccd4ce91170b6536a2f5cd0112b trytond-6.0.22
+0000000000000000000000000000000000000000 6.0.23
+7d81a0faef794489d63fb164d0fb2ba2196c878b trytond-6.0.23
+0000000000000000000000000000000000000000 6.0.24
+9b36d68c67a48a2203ef3598f5379d708781dc9e trytond-6.0.24
+0000000000000000000000000000000000000000 6.0.3
+7b3f3676cf9d72147edcdb0cd477b77b1af7af9e trytond-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+68ea8ab81fc3d67e3efe925c3694644a46b7c111 trytond-6.0.4
+0000000000000000000000000000000000000000 6.0.5
+133f0b26de213e0b5668ae891e176de8f79025fc trytond-6.0.5
+0000000000000000000000000000000000000000 6.0.6
+1719ce1a669285333424c02c9e3e45fd636b995c trytond-6.0.6
+0000000000000000000000000000000000000000 6.0.7
+67fe2d478dbf413873c0919cfd5d6f3f6f4c2275 trytond-6.0.7
+0000000000000000000000000000000000000000 6.0.8
+ed230154446f04aed350b7fd0d416a80145645ee trytond-6.0.8
+0000000000000000000000000000000000000000 6.0.9
+df3e4a189c249ff54e118a4943c03ecaab5fee60 trytond-6.0.9
+923b3073b686c6dc5a921d0561c934adf3eeb879 1.0.0
+9a6434d63616f46520b6fa1b2be31906ff6f4f6a 1.2.0
+de84c1443d4bad908eabb99c381578b988c2117f 1.4.0
+3976912b23dfc5db2525d4c2e55d17f099d9492d 1.6.0
+8aa050da53cbdfabe1353a37da91c011b7fff549 1.8.0
+1876747b3f963ba6011b4bcf6968e681624c6e24 2.0.0
+5364f8ca6cd2cccfb5f7f39c69bb20bae2b5f495 2.2.0
+fe15da23f7333e0e90d2693aadddf6bed53ed602 2.4.0
+d069f9f1cdc3fea39e71415268582abb2b333ea1 2.6.0
+21fbf8bd36096d926c472acfecd3963369204af8 2.8.0
+9197d90b0257ec7c4576a38092fd592b3e87f7a4 3.0.0
+9721289ee2fdaab8b990de9327c3eab87363c88c 3.2.0
+8e5cba59137f9d0a063fa6d7855e09a51bc5889c 3.4.0
+1ac658605d42d82988cfb232afebfe359aba7776 3.6.0
+f4b9c8a84cf61935afec788c3c639982731452ef 3.8.0
+44d8ed92ff90cf98c4c01d37f12d344d9d66e7f1 4.0.0
+94037cff031ef897c9533a579356977c8a3cf695 4.2.0
+763dc5d8e1d7e483edbf9977dd96afc114555555 4.4.0
+d7ed5002e47249d019fbc546f6ac562db44c54f2 4.6.0
+2a2b48ea60fbb5201ea12443000d3a106a2fa27c 4.8.0
+70ade9d1fe04c734fe2dd7d35dd75b13f1af902a 5.0.0
+d5652dee45a43fccc1f33d39050af6e00e073273 5.2.0
+9f3fbb33df184ca19350cc71054dd9afd55f1cb7 5.4.0
+45d3f736ffb4396ee0dac0e2110fcc17237337ba 5.6.0
+df9de0ceeb27b38b165da7526accad0ad6682e86 5.8.0
+d18d03f0c540dfd2aae81dfaac048378a62c0ef6 6.0.0
+6cdc11292120ffb6df929721adfd738c4916a594 6.0.1
+23df79b60988e64c45be329933d803e0add7ae20 6.0.2
+5ab29a68b330847559add6204df341aeec38c223 6.0.3
+4493ce6c2dfcebde5701360689c635dbd6253d10 6.0.4
+0a8b71b80cc781e88f6a5a7467be9cdb3de50562 6.0.5
+be96d41f66a7bae727ecaf072a955ada01cd73e8 6.0.6
+0d0d910f4edfa1e493d8526dea6bc5f2ad78c30e 6.0.7
+1f7935eb899fb1ccdd363a085ba3a7a24349a3be 6.0.8
+375c664763440caa3f3ac4cdff2f694eedab7f7c 6.0.9
+a8f9ff596e3476c4fa73002524a78011b62b7fb8 6.0.10
+986c3f1e1d5ee57983adf34bf84c348abdba5b42 6.0.11
+e2cd492204aa2dd300eaaad5caca022b0114bea2 6.0.12
+1cbf7901b52d92f993ceba19357085386475c08d 6.0.13
+1474928ec1aa12d34e5fd79675bb284890bafd76 6.0.14
+0ee8d81a43a12bdd3064bcc100ef4a35ab86bfdb 6.0.15
+d1f3f6a0d5722332cddd2cb0837a266e5f5a1881 6.0.16
+dd458525c9d4c92eca991b832f06ec46a639c3a4 6.0.17
+40c3f7f6d487197698ac644ef28fa09dbce7e46a 6.0.18
+bd7b3f9a3c2f9cda09c2d5f89ed1c1f92dd78ff3 6.0.19
+4b448222df4c6c37b0223112c0c2c14f09675d34 6.0.20
+90566b9897fd57fb36e427dd7d8f2bbfa0a9ed5f 6.0.21
+0000000000000000000000000000000000000000 1.0.0
+923b3073b686c6dc5a921d0561c934adf3eeb879 tryton-1.0.0
+0000000000000000000000000000000000000000 1.2.0
+9a6434d63616f46520b6fa1b2be31906ff6f4f6a tryton-1.2.0
+0000000000000000000000000000000000000000 1.4.0
+de84c1443d4bad908eabb99c381578b988c2117f tryton-1.4.0
+0000000000000000000000000000000000000000 1.6.0
+3976912b23dfc5db2525d4c2e55d17f099d9492d tryton-1.6.0
+0000000000000000000000000000000000000000 1.8.0
+8aa050da53cbdfabe1353a37da91c011b7fff549 tryton-1.8.0
+0000000000000000000000000000000000000000 2.0.0
+1876747b3f963ba6011b4bcf6968e681624c6e24 tryton-2.0.0
+0000000000000000000000000000000000000000 2.2.0
+5364f8ca6cd2cccfb5f7f39c69bb20bae2b5f495 tryton-2.2.0
+0000000000000000000000000000000000000000 2.4.0
+fe15da23f7333e0e90d2693aadddf6bed53ed602 tryton-2.4.0
+0000000000000000000000000000000000000000 2.6.0
+d069f9f1cdc3fea39e71415268582abb2b333ea1 tryton-2.6.0
+0000000000000000000000000000000000000000 2.8.0
+21fbf8bd36096d926c472acfecd3963369204af8 tryton-2.8.0
+0000000000000000000000000000000000000000 3.0.0
+9197d90b0257ec7c4576a38092fd592b3e87f7a4 tryton-3.0.0
+0000000000000000000000000000000000000000 3.2.0
+9721289ee2fdaab8b990de9327c3eab87363c88c tryton-3.2.0
+0000000000000000000000000000000000000000 3.4.0
+8e5cba59137f9d0a063fa6d7855e09a51bc5889c tryton-3.4.0
+0000000000000000000000000000000000000000 3.6.0
+1ac658605d42d82988cfb232afebfe359aba7776 tryton-3.6.0
+0000000000000000000000000000000000000000 3.8.0
+f4b9c8a84cf61935afec788c3c639982731452ef tryton-3.8.0
+0000000000000000000000000000000000000000 4.0.0
+44d8ed92ff90cf98c4c01d37f12d344d9d66e7f1 tryton-4.0.0
+0000000000000000000000000000000000000000 4.2.0
+94037cff031ef897c9533a579356977c8a3cf695 tryton-4.2.0
+0000000000000000000000000000000000000000 4.4.0
+763dc5d8e1d7e483edbf9977dd96afc114555555 tryton-4.4.0
+0000000000000000000000000000000000000000 4.6.0
+d7ed5002e47249d019fbc546f6ac562db44c54f2 tryton-4.6.0
+0000000000000000000000000000000000000000 4.8.0
+2a2b48ea60fbb5201ea12443000d3a106a2fa27c tryton-4.8.0
+0000000000000000000000000000000000000000 5.0.0
+70ade9d1fe04c734fe2dd7d35dd75b13f1af902a tryton-5.0.0
+0000000000000000000000000000000000000000 5.2.0
+d5652dee45a43fccc1f33d39050af6e00e073273 tryton-5.2.0
+0000000000000000000000000000000000000000 5.4.0
+9f3fbb33df184ca19350cc71054dd9afd55f1cb7 tryton-5.4.0
+0000000000000000000000000000000000000000 5.6.0
+45d3f736ffb4396ee0dac0e2110fcc17237337ba tryton-5.6.0
+0000000000000000000000000000000000000000 5.8.0
+df9de0ceeb27b38b165da7526accad0ad6682e86 tryton-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+d18d03f0c540dfd2aae81dfaac048378a62c0ef6 tryton-6.0.0
+0000000000000000000000000000000000000000 6.0.1
+6cdc11292120ffb6df929721adfd738c4916a594 tryton-6.0.1
+0000000000000000000000000000000000000000 6.0.10
+a8f9ff596e3476c4fa73002524a78011b62b7fb8 tryton-6.0.10
+0000000000000000000000000000000000000000 6.0.11
+986c3f1e1d5ee57983adf34bf84c348abdba5b42 tryton-6.0.11
+0000000000000000000000000000000000000000 6.0.12
+e2cd492204aa2dd300eaaad5caca022b0114bea2 tryton-6.0.12
+0000000000000000000000000000000000000000 6.0.13
+1cbf7901b52d92f993ceba19357085386475c08d tryton-6.0.13
+0000000000000000000000000000000000000000 6.0.14
+1474928ec1aa12d34e5fd79675bb284890bafd76 tryton-6.0.14
+0000000000000000000000000000000000000000 6.0.15
+0ee8d81a43a12bdd3064bcc100ef4a35ab86bfdb tryton-6.0.15
+0000000000000000000000000000000000000000 6.0.16
+d1f3f6a0d5722332cddd2cb0837a266e5f5a1881 tryton-6.0.16
+0000000000000000000000000000000000000000 6.0.17
+dd458525c9d4c92eca991b832f06ec46a639c3a4 tryton-6.0.17
+0000000000000000000000000000000000000000 6.0.18
+40c3f7f6d487197698ac644ef28fa09dbce7e46a tryton-6.0.18
+0000000000000000000000000000000000000000 6.0.19
+bd7b3f9a3c2f9cda09c2d5f89ed1c1f92dd78ff3 tryton-6.0.19
+0000000000000000000000000000000000000000 6.0.2
+23df79b60988e64c45be329933d803e0add7ae20 tryton-6.0.2
+0000000000000000000000000000000000000000 6.0.20
+4b448222df4c6c37b0223112c0c2c14f09675d34 tryton-6.0.20
+0000000000000000000000000000000000000000 6.0.21
+90566b9897fd57fb36e427dd7d8f2bbfa0a9ed5f tryton-6.0.21
+0000000000000000000000000000000000000000 6.0.3
+5ab29a68b330847559add6204df341aeec38c223 tryton-6.0.3
+0000000000000000000000000000000000000000 6.0.4
+4493ce6c2dfcebde5701360689c635dbd6253d10 tryton-6.0.4
+0000000000000000000000000000000000000000 6.0.5
+0a8b71b80cc781e88f6a5a7467be9cdb3de50562 tryton-6.0.5
+0000000000000000000000000000000000000000 6.0.6
+be96d41f66a7bae727ecaf072a955ada01cd73e8 tryton-6.0.6
+0000000000000000000000000000000000000000 6.0.7
+0d0d910f4edfa1e493d8526dea6bc5f2ad78c30e tryton-6.0.7
+0000000000000000000000000000000000000000 6.0.8
+1f7935eb899fb1ccdd363a085ba3a7a24349a3be tryton-6.0.8
+0000000000000000000000000000000000000000 6.0.9
+375c664763440caa3f3ac4cdff2f694eedab7f7c tryton-6.0.9
diff --git a/modules/product/.drone.yml b/modules/product/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/product/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/product/.flake8 b/modules/product/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/product/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/product/CHANGELOG b/modules/product/CHANGELOG
new file mode 100644
index 0000000000..ff4335659f
--- /dev/null
+++ b/modules/product/CHANGELOG
@@ -0,0 +1,125 @@
+Version 6.0.3 - 2021-10-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.2 - 2021-09-16
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.1 - 2021-09-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+* Deactivate variants when product is deactivated
+* Allow multiple templates to be added/removed on a category
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+* Allow the product template code to be set from a sequence
+* Set code column first in template tree view
+* Add default order on product and template
+* Check price_decimal configuration
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+* Add round_price
+* Make product code unique
+* Add code to template as variant prefix code
+* Hide product fields inherited from template when empty
+* Skip default products when template is created from product
+* Search also on variant name when searching on template record name
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+* Allow the product code to be set by a sequence
+* Allow UoM conversion between different categories
+* Add product identifiers
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+* Remove starting wildcard when searching on codes and numbers
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+* Enforce digits length on Rounding Precision on Unit of Measure
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+* Show all products by category
+* Limit cost method to fixed for service
+* Move cost_price from Template to Product
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+* Add ceil and floor as uom rounding
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+* Add relate from Template to Products
+
+Version 4.0.0 - 2016-05-02
+* Bug fixes (see mercurial logs for details)
+* Replace category by categories on Template
+* Add Python3 support
+* Add configuration for default cost price method
+* Change Uom.round into an instance method
+* Add Function fields on Product from Template
+
+Version 3.8.0 - 2015-11-02
+* Bug fixes (see mercurial logs for details)
+* Be more strict on unit of measure conversion
+
+Version 3.6.0 - 2015-04-20
+* Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+* Ensure that uom rouding is always greather than zero
+* Add price_digits
+* Add parameter price_decimal
+
+Version 3.4.0 - 2014-10-20
+* Bug fixes (see mercurial logs for details)
+
+Version 3.2.0 - 2014-04-21
+* Bug fixes (see mercurial logs for details)
+
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+
+Version 2.8.0 - 2013-04-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.6.0 - 2012-10-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.4.0 - 2012-04-24
+* Bug fixes (see mercurial logs for details)
+* Remove special uom search clause
+* New product types: Goods, Assets and Service
+* Category is no more required on product
+
+Version 2.2.0 - 2011-10-24
+* Bug fixes (see mercurial logs for details)
+
+Version 2.0.0 - 2011-04-26
+* Bug fixes (see mercurial logs for details)
+
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
+Version 1.6.0 - 2010-05-09
+* Bug fixes (see mercurial logs for details)
+* Improve computation precision of UOM convertion
+
+Version 1.4.0 - 2009-10-19
+* Bug fixes (see mercurial logs for details)
+
+Version 1.2.0 - 2009-04-20
+* Bug fixes (see mercurial logs for details)
+* Allow egg installation
+
+Version 1.0.0 - 2008-11-17
+* Initial release
diff --git a/modules/product/COPYRIGHT b/modules/product/COPYRIGHT
new file mode 100644
index 0000000000..14e1e43ebe
--- /dev/null
+++ b/modules/product/COPYRIGHT
@@ -0,0 +1,17 @@
+Copyright (C) 2008-2021 Cédric Krier.
+Copyright (C) 2008-2013 Bertrand Chenal.
+Copyright (C) 2008-2021 B2CK SPRL.
+Copyright (C) 2004-2008 Tiny SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/product/LICENSE b/modules/product/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/product/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/product/MANIFEST.in b/modules/product/MANIFEST.in
new file mode 100644
index 0000000000..94499680c6
--- /dev/null
+++ b/modules/product/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
+include icons/LICENSE
diff --git a/modules/product/README.rst b/modules/product/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/product/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/product/__init__.py b/modules/product/__init__.py
new file mode 100644
index 0000000000..4314810344
--- /dev/null
+++ b/modules/product/__init__.py
@@ -0,0 +1,33 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import ir
+from . import uom
+from . import category
+from . import product
+from . import configuration
+from .product import price_digits, round_price
+from .uom import uom_conversion_digits
+
+__all__ = [price_digits, round_price, uom_conversion_digits]
+
+
+def register():
+ Pool.register(
+ ir.Configuration,
+ uom.UomCategory,
+ uom.Uom,
+ category.Category,
+ product.Template,
+ product.Product,
+ product.ProductIdentifier,
+ product.ProductListPrice,
+ # before ProductCostPrice for migration
+ product.ProductCostPriceMethod,
+ product.ProductCostPrice,
+ product.TemplateCategory,
+ product.TemplateCategoryAll,
+ configuration.Configuration,
+ configuration.ConfigurationDefaultCostPriceMethod,
+ module='product', type_='model')
diff --git a/modules/product/category.py b/modules/product/category.py
new file mode 100644
index 0000000000..e62f351b76
--- /dev/null
+++ b/modules/product/category.py
@@ -0,0 +1,38 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, ModelSQL, fields, tree
+from trytond.pyson import PYSONEncoder
+
+
+class Category(tree(separator=' / '), ModelSQL, ModelView):
+ "Product Category"
+ __name__ = "product.category"
+ name = fields.Char('Name', required=True, translate=True)
+ parent = fields.Many2One(
+ 'product.category', "Parent", select=True,
+ help="Used to add structure above the category.")
+ childs = fields.One2Many(
+ 'product.category', 'parent', string="Children",
+ help="Used to add structure below the category.")
+ templates = fields.Many2Many(
+ 'product.template-product.category', 'category', 'template',
+ "Products")
+
+ @classmethod
+ def __setup__(cls):
+ super(Category, cls).__setup__()
+ cls._order.insert(0, ('name', 'ASC'))
+ cls._buttons.update({
+ 'add_products': {
+ 'icon': 'tryton-add',
+ },
+ })
+
+ @classmethod
+ @ModelView.button_action('product.act_category_product')
+ def add_products(cls, categories):
+ return {
+ 'res_id': [categories[0].id],
+ 'pyson_domain': PYSONEncoder().encode(
+ [('id', '=', categories[0].id)]),
+ }
diff --git a/modules/product/category.xml b/modules/product/category.xml
new file mode 100644
index 0000000000..f17d27027c
--- /dev/null
+++ b/modules/product/category.xml
@@ -0,0 +1,106 @@
+
+
+
+
+
+ product.category
+ tree
+
+ category_list
+
+
+ product.category
+ tree
+
+ childs
+ category_tree
+
+
+ product.category
+ form
+
+ category_form
+
+
+ product.category
+ form
+
+ category_product_form
+
+
+
+ Categories
+ product.category
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Categories
+ product.category
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Add products
+ product.category
+
+
+
+
+
+
+
+
+ add_products
+ Add products
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product/configuration.py b/modules/product/configuration.py
new file mode 100644
index 0000000000..7b20f5153d
--- /dev/null
+++ b/modules/product/configuration.py
@@ -0,0 +1,73 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond import backend
+from trytond.model import (ModelView, ModelSQL, ModelSingleton,
+ MultiValueMixin, ValueMixin, fields)
+from trytond.pool import Pool
+from trytond.tools.multivalue import migrate_property
+from trytond.pyson import Id
+
+default_cost_price_method = fields.Selection(
+ 'get_cost_price_methods', "Default Cost Method",
+ help="The default cost price method for new products.")
+
+
+@classmethod
+def get_cost_price_methods(cls):
+ pool = Pool()
+ Template = pool.get('product.template')
+ field_name = 'cost_price_method'
+ return (Template.fields_get([field_name])[field_name]['selection']
+ + [(None, '')])
+
+
+class Configuration(ModelSingleton, ModelSQL, ModelView, MultiValueMixin):
+ 'Product Configuration'
+ __name__ = 'product.configuration'
+
+ default_cost_price_method = fields.MultiValue(default_cost_price_method)
+ get_cost_price_methods = get_cost_price_methods
+ product_sequence = fields.Many2One('ir.sequence', "Variant Sequence",
+ domain=[
+ ('sequence_type', '=', Id('product', 'sequence_type_product')),
+ ],
+ help="Used to generate the last part of the product code.")
+ template_sequence = fields.Many2One('ir.sequence', "Product Sequence",
+ domain=[
+ ('sequence_type', '=', Id('product', 'sequence_type_template')),
+ ],
+ help="Used to generate the first part of the product code.")
+
+ @classmethod
+ def default_default_cost_price_method(cls, **pattern):
+ return cls.multivalue_model(
+ 'default_cost_price_method').default_default_cost_price_method()
+
+
+class ConfigurationDefaultCostPriceMethod(ModelSQL, ValueMixin):
+ "Product Configuration Default Cost Price Method"
+ __name__ = 'product.configuration.default_cost_price_method'
+ default_cost_price_method = default_cost_price_method
+ get_cost_price_methods = get_cost_price_methods
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+
+ super(ConfigurationDefaultCostPriceMethod, cls).__register__(
+ module_name)
+
+ if not exist:
+ cls._migrate_property([], [], [])
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.append('default_cost_price_method')
+ value_names.append('default_cost_price_method')
+ migrate_property(
+ 'product.configuration', field_names, cls, value_names,
+ fields=fields)
+
+ @classmethod
+ def default_default_cost_price_method(cls):
+ return 'fixed'
diff --git a/modules/product/configuration.xml b/modules/product/configuration.xml
new file mode 100644
index 0000000000..4cf2ce46d6
--- /dev/null
+++ b/modules/product/configuration.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+ product.configuration
+ form
+ configuration_form
+
+
+
+ Configuration
+ product.configuration
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fixed
+
+
+
diff --git a/modules/product/doc/conf.py b/modules/product/doc/conf.py
new file mode 100644
index 0000000000..8513b72dd2
--- /dev/null
+++ b/modules/product/doc/conf.py
@@ -0,0 +1,61 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+modules_url = 'https://docs.tryton.org/projects/modules-{module}/en/{series}/'
+trytond_url = 'https://docs.tryton.org/projects/server/en/{series}/'
+
+
+def get_info():
+ import configparser
+ import os
+ import subprocess
+ import sys
+
+ module_dir = os.path.dirname(os.path.dirname(__file__))
+
+ config = configparser.ConfigParser()
+ config.read_file(open(os.path.join(module_dir, 'tryton.cfg')))
+ info = dict(config.items('tryton'))
+
+ result = subprocess.run(
+ [sys.executable, 'setup.py', '--name'],
+ stdout=subprocess.PIPE, check=True, cwd=module_dir)
+ info['name'] = result.stdout.decode('utf-8').strip()
+
+ result = subprocess.run(
+ [sys.executable, 'setup.py', '--version'],
+ stdout=subprocess.PIPE, check=True, cwd=module_dir)
+ version = result.stdout.decode('utf-8').strip()
+ if 'dev' in version:
+ info['series'] = 'latest'
+ else:
+ info['series'] = '.'.join(version.split('.', 2)[:2])
+
+ for key in {'depends', 'extras_depend'}:
+ info[key] = info.get(key, '').strip().splitlines()
+ info['modules'] = set(info['depends'] + info['extras_depend'])
+ info['modules'] -= {'ir', 'res'}
+
+ return info
+
+
+info = get_info()
+
+master_doc = 'index'
+project = info['name']
+release = version = info['series']
+default_role = 'ref'
+highlight_language = 'none'
+extensions = [
+ 'sphinx.ext.intersphinx',
+ ]
+intersphinx_mapping = {
+ 'trytond': (trytond_url.format(series=version), None),
+ }
+intersphinx_mapping.update({
+ m: (modules_url.format(
+ module=m.replace('_', '-'), series=version), None)
+ for m in info['modules']
+ })
+
+del get_info, info, modules_url, trytond_url
diff --git a/modules/product/doc/configuration.rst b/modules/product/doc/configuration.rst
new file mode 100644
index 0000000000..c2e8e83bfe
--- /dev/null
+++ b/modules/product/doc/configuration.rst
@@ -0,0 +1,41 @@
+*************
+Configuration
+*************
+
+The *Product Module* uses some settings from the ``[product]`` section of the
+:doc:`configuration file `.
+
+.. _config-product.price_decimal:
+
+``price_decimal``
+=================
+
+The ``price_decimal`` setting defines how many decimal places are used when
+storing `Products' ` unit prices.
+
+.. warning::
+
+ Once the database has been created you cannot reduce this value, doing so
+ will break your system's data integrity.
+ Also if you want to increase this value you must also manually change it in
+ the database `IR Configuration `.
+
+The default value is: ``4``
+
+.. _config-product.uom_conversion_decimal:
+
+``uom_conversion_decimal``
+==========================
+
+The value from the ``uom_conversion_decimal`` setting defines the number of
+decimal places used when storing the conversion rates and factors between
+`Units of Measure `.
+
+.. warning::
+
+ Once the database has been created you cannot reduce this value, doing so
+ will break your system's data integrity.
+ Also if you want to increase this value you must also manually change it in
+ the database `IR Configuration `.
+
+The default value is: ``12``
diff --git a/modules/product/doc/design.rst b/modules/product/doc/design.rst
new file mode 100644
index 0000000000..7cab0fa30d
--- /dev/null
+++ b/modules/product/doc/design.rst
@@ -0,0 +1,168 @@
+******
+Design
+******
+
+The *Product Module* introduces the following concepts:
+
+.. _concept-product:
+
+Product
+=======
+
+The *Product* is the main concept introduced by the *Product Module*.
+It represents an item or service that Tryton stores information about, and is
+often something that gets bought, sold, or produced.
+
+In Tryton product definitions are made up from two parts, the
+`Product Template ` and the
+`Product Variant `.
+Both of these are sometimes referred to as the *Product*, depending on the
+context.
+
+Each product template can have many different product variants, but each
+product variant is based exclusively on one product template.
+
+A product's full code is made up from a prefix code which is defined on the
+product template and a suffix code which is specified on the product variant.
+The full product code can then be used as the product's |SKU|_.
+
+.. |SKU| replace:: :abbr:`SKU (Stock Keeping Unit)`
+.. _SKU: https://en.wikipedia.org/wiki/Stock_keeping_unit
+
+.. _model-product.template:
+
+Product Template
+----------------
+
+The *Product Template* defines the set of properties common to a group of
+`Product Variants `.
+These properties include things like its list price, its type, its code, what
+`Categories ` it is in, and what
+`Units of Measure ` are used by default for quantities of
+the product.
+
+.. seealso::
+
+ A list of product templates can be found by opening the main menu item:
+
+ |Product --> Products|__
+
+ .. |Product --> Products| replace:: :menuselection:`Product --> Products`
+ __ https://demo.tryton.org/model/product.template
+
+.. _model-product.product:
+
+Product Variant
+---------------
+
+Each *Product Variant* inherits many of its properties from its
+`Product Template `.
+It does, however, have some properties that are specific to each variant
+such as the description, cost price, and suffix code which is important to
+distinguish between different variants.
+
+The identifiers that are used to refer to a product are also specific to a
+product variant.
+A product identifier is made up from a type and a code.
+
+Some of the supported types of identifier include:
+
+* International Article Number (EAN)
+* International Standard Audiovisual Number (ISAN)
+* International Standard Book Number (ISBN)
+* International Standard Identifier for Libraries (ISIL)
+* International Securities Identification Number (ISIN)
+* International Standard Music Number (ISMN)
+
+.. seealso::
+
+ A list of all the product variants is available from the main menu item:
+
+ |Product --> Products --> Variants|__
+
+ .. |Product --> Products --> Variants| replace:: :menuselection:`Product --> Products --> Variants`
+ __ https://demo.tryton.org/model/product.product
+
+.. _model-product.category:
+
+Category
+========
+
+The product *Category* concept provides a flexible way of grouping
+`Product Templates ` together.
+The categories can be structured by giving them a parent category and some
+sub-categories.
+
+.. seealso::
+
+ A list of product categories can be found by opening the main menu item:
+
+ |Product --> Categories|__
+
+ .. |Product --> Categories| replace:: :menuselection:`Product --> Categories`
+ __ https://demo.tryton.org/model/product.category
+
+.. _model-product.uom:
+
+Unit of Measure
+===============
+
+The *Unit of Measure* concept provides the units by which the quantity of a
+`Product ` is measured.
+These are things like, meter, mile, kilogram, hour, gallon, and so on.
+
+Each unit of measure belongs to a
+`Unit of Measure Category `.
+
+Quantities can be converted to a different unit of measure from the same
+category using the unit of measures' rates or factors.
+It is also possible to specify the rounding precision and number of decimal
+digits used when rounding or displaying values from the unit of measure.
+
+.. seealso::
+
+ The units of measure can be found using the main menu item:
+
+ |Product --> Units of Measure|__
+
+ .. |Product --> Units of Measure| replace:: :menuselection:`Product --> Units of Measure`
+ __ https://demo.tryton.org/model/product.uom
+
+.. _model-product.uom.category:
+
+Unit of Measure Category
+========================
+
+A *Unit of Measure Category* is used to group together
+`Units of Measure ` that are used to measure the same type
+of property.
+These are things like length, weight, time or volume.
+
+.. seealso::
+
+ The units of measure can be found using the main menu item:
+
+ |Product --> Units of Measure --> Categories|__
+
+ .. |Product --> Units of Measure --> Categories| replace:: :menuselection:`Product --> Units of Measure --> Categories`
+ __ https://demo.tryton.org/model/product.uom.category
+
+.. _model-product.configuration:
+
+Configuration
+=============
+
+The product *Configuration* contains the settings which are used to configure
+the behaviour and default values for things associated with products.
+
+There are configuration options for the sequences to use to automatically
+generate codes for `Products `.
+
+.. seealso::
+
+ The product configuration can be found using the main menu item:
+
+ |Product --> Configuration --> Product Configuration|__
+
+ .. |Product --> Configuration --> Product Configuration| replace:: :menuselection:`Product --> Configuration --> Product Configuration`
+ __ https://demo.tryton.org/model/product.configuration/1
diff --git a/modules/product/doc/index.rst b/modules/product/doc/index.rst
new file mode 100644
index 0000000000..e96110887b
--- /dev/null
+++ b/modules/product/doc/index.rst
@@ -0,0 +1,15 @@
+##############
+Product Module
+##############
+
+The *Product Module* defines the essential concepts needed to describe
+products in Tryton.
+It lets you define the basic properties of products and their variants,
+and allows you to record how the quantity of a product is measured.
+
+.. toctree::
+ :maxdepth: 2
+
+ usage
+ configuration
+ design
diff --git a/modules/product/doc/usage.rst b/modules/product/doc/usage.rst
new file mode 100644
index 0000000000..570316a6f2
--- /dev/null
+++ b/modules/product/doc/usage.rst
@@ -0,0 +1,74 @@
+*****
+Usage
+*****
+
+The items found under the [:menuselection:`Product`] main menu item allow you
+to view and manage the products on your system.
+
+.. _Using product templates and variants:
+
+Using product templates and variants
+====================================
+
+Tryton makes it easy to create `Products ` which have
+one or more slightly different `Variants `.
+
+A simple example of where you could use this is in a company that supplies
+clothes.
+Each type of shirt may come in a range of different sizes, but most of the
+properties of the shirt, such as the name, unit of measurement, categories,
+and so on, would be the same.
+So in this case you would create a single *Product* to represent the shirt,
+and a *Variant* for each of the different sizes.
+Structuring your products like this can help you manage and update them.
+
+.. tip::
+
+ You may find that your products are not suited to being structured in this
+ way.
+ If so, don't worry, when you create a new *Product* from the
+ [:menuselection:`Product --> Products`] menu item a single variant is
+ automatically created for you and displayed as part of the product.
+
+.. _Categorising products:
+
+Categorising products
+=====================
+
+It can be a good idea to organise your `Products ` into
+groups.
+This makes it much easier to find and manage them effectively, especially if
+you have a lot of products on your system.
+
+The product `Categories ` are designed for this
+purpose.
+You can create categories with any name you want, and then add the appropriate
+categories to each product.
+Each product can belong to as many, or as few, categories as required.
+The categories can also be organised into a
+structure, with each category having a parent category and some subcategories.
+This can help you classify your products more finely.
+
+For example, a clothes supplier may use these categories::
+
+ Accessories
+ Clothes
+ Shirts
+ Short sleeves
+ Long sleeves
+ Jumpers
+ Range
+ Spring Summer
+ Autumn Winter
+ Christmas
+
+Based on these categories, you may decide that a particular lightweight shirt
+belongs in the ``Clothes / Shirts / Short sleeves`` and
+``Range / Spring Summer`` categories.
+
+.. tip::
+
+ To get a list of all the products in a category first open the
+ [:menuselection:`Product --> Categories`] menu item.
+ Then when you open one of the categories listed here you will get a list
+ of all the products in that category.
diff --git a/modules/product/exceptions.py b/modules/product/exceptions.py
new file mode 100644
index 0000000000..609f13efbc
--- /dev/null
+++ b/modules/product/exceptions.py
@@ -0,0 +1,20 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.model.exceptions import ValidationError
+
+
+class TemplateValidationError(ValidationError):
+ pass
+
+
+class ProductValidationError(TemplateValidationError):
+ pass
+
+
+class UOMValidationError(ValidationError):
+ pass
+
+
+class InvalidIdentifierCode(ValidationError):
+ pass
diff --git a/modules/product/icons/LICENSE b/modules/product/icons/LICENSE
new file mode 100644
index 0000000000..7a4a3ea242
--- /dev/null
+++ b/modules/product/icons/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/modules/product/icons/tryton-product.svg b/modules/product/icons/tryton-product.svg
new file mode 100644
index 0000000000..cdffc1d75c
--- /dev/null
+++ b/modules/product/icons/tryton-product.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/product/ir.py b/modules/product/ir.py
new file mode 100644
index 0000000000..056177baa8
--- /dev/null
+++ b/modules/product/ir.py
@@ -0,0 +1,24 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.config import config
+from trytond.model import fields
+from trytond.pool import PoolMeta
+
+price_decimal = config.getint('product', 'price_decimal', default=4)
+
+
+class Configuration(metaclass=PoolMeta):
+ __name__ = 'ir.configuration'
+ product_price_decimal = fields.Integer("Product Price Decimal")
+
+ @classmethod
+ def default_product_price_decimal(cls):
+ return price_decimal
+
+ def check(self):
+ super().check()
+ if self.product_price_decimal != price_decimal:
+ raise ValueError(
+ "The price_decimal %s in [product] configuration section "
+ "is different from the value %s in 'ir.configuration'." % (
+ price_decimal, self.product_price_decimal))
diff --git a/modules/product/locale/bg.po b/modules/product/locale/bg.po
new file mode 100644
index 0000000000..cdcad26c72
--- /dev/null
+++ b/modules/product/locale/bg.po
@@ -0,0 +1,1088 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Продукт"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Наследници"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Родител"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Продукти по местонахождения"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Щаблон за продукт"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Щаблон за продукт"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr ""
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Фабрична цена"
+
+#, fuzzy
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Шаблон"
+
+#, fuzzy
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Код"
+
+#, fuzzy
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Вид"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Каталожна цена"
+
+#, fuzzy
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Шаблон"
+
+#, fuzzy
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Категории"
+
+#, fuzzy
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Код"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Консуматив"
+
+#, fuzzy
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Фабрична цена"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Фабрична цена"
+
+#, fuzzy
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Фабрична цена"
+
+#, fuzzy
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "Мер. ед. по подрабиране"
+
+#, fuzzy
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Категория мер. ед. по подразбиране"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Каталожна цена"
+
+#, fuzzy
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Каталожна цена"
+
+#, fuzzy
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Каталожна цена"
+
+#, fuzzy
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Щаблон за продукт"
+
+#, fuzzy
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Вид"
+
+#, fuzzy
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Категории"
+
+#, fuzzy
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Категории"
+
+#, fuzzy
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Код"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Консуматив"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Фабрична цена"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "Мер. ед. по подрабиране"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Категория мер. ед. по подразбиране"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Каталожна цена"
+
+#, fuzzy
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Каталожна цена"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Име"
+
+#, fuzzy
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Продукти"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Вид"
+
+#, fuzzy
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Категория"
+
+#, fuzzy
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Шаблон"
+
+#, fuzzy
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Категория"
+
+#, fuzzy
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Шаблон"
+
+#, fuzzy
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Категория мер. ед."
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Цифри за показване"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Коефициент"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Отношение"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Точност на закръгление"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Символ"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Име"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"Коефициент в тази формула:\n"
+"1 (баз. единица) = коеф. (тази единица)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"Коефициент в тази формула:\n"
+"1 (баз. единица) = коеф. (тази единица)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Продукти по местонахождения"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Настройки"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Продукти"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Продукти"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Категория на продукт"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Продукти по местонахождения"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Категории"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Продукти по местонахождения"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Продукти"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Настройки"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Product"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Продукти"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Настройки"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Продукти по местонахождения"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Категория на продукт"
+
+#, fuzzy
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Product Configuration"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr ""
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Щаблон за продукт"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Продукт"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Щаблон за продукт"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr ""
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Мерни единици"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Carat"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Cubic centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Cubic foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Cubic inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Cubic meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Day"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hour"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mile"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Ounce"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Pound"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Second"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Square centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Square foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Square inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Square meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Square yard"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unit"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Work Day"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lbs"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Мерни единици"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Length"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Surface"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Time"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Units"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Weight"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Product Administration"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Средна"
+
+#, fuzzy
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Фиксирана"
+
+#, fuzzy
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Активи"
+
+#, fuzzy
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Стока"
+
+#, fuzzy
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Услуга"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Средна"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Фиксирана"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Активи"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Стока"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Услуга"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Наследници"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Щаблон за продукт"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Основен"
diff --git a/modules/product/locale/ca.po b/modules/product/locale/ca.po
new file mode 100644
index 0000000000..24e7bdb44d
--- /dev/null
+++ b/modules/product/locale/ca.po
@@ -0,0 +1,997 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Decimals del preu de cost del producte"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Fills"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Productes"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Mètode de cost per defecte"
+
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Seqüencia de la variant"
+
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Seqüencia del producte"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Mètode de cost per defecte"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Preu de cost"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Mètode de cost"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Plantilla"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Codi"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Tipus"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Preu de venda"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Plantilla"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Codi"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr "Codi només lectura"
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Consumible"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Preu de cost"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Mètode de cost"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Mètodes de cost"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Preu de cost"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Preu de cost"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "UdM per defecte"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Categoria UdM per defecte"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Dígits de l'unitat per defecte"
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr "Identificadors"
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Preu de venda"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Preu de venda"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Preus de venda"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr "Codi prefix"
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr "Codi sufix"
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Plantilla de producte"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Tipus"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Codi"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr "Code només lectura"
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Consumible"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Preu de cost"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Mètode de cost"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Mètodes de cost"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "UdM per defecte"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Categoria UdM per defecte"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Dígits de l'unitat per defecte"
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Preu de venda"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Preus de venda"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Tipus"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Plantilla"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Plantilla"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Decimals a mostrar"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Factor"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Conversió"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Precisió d'arrodoniment"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Símbol"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Unitats de mesura"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr "Utilitzat per afegir una estructura per sota la categoria."
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr "Utilitzat per afegir una estructura per sobre la categoria."
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "El mètode de cost per defecte per als nous productes."
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr "Utilitzada per generar la part final del codi del producte."
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr "Utilitzada per generar la part inicial del codi del producte."
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "El mètode de cost per defecte per als nous productes."
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr "El product que s'identifica pel codi."
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Les categories a les que pertany el producte.\n"
+"Utilitzat per agrupar productes similars."
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr "El identificador únic de la variant."
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Marqueu per permetre l'assignació de moviments d'existències independentment"
+" del nivell d'existències."
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+"El import que costa comprar o fabricar la variant, o dur a terme el servei."
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "El mètode utilitzat per calcular el preu de cost."
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"La unitat de mesura per defecte del producte.\n"
+"S'utilitza internament per a calcular els nivells d'existències dels bens i actius."
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr "Altres identificadors associats a la variant."
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "El preu al que normalment es ven el producte."
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr "El identificador únic del producte (aka SKU)."
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+"El producte que defineix les propietats comunes que s'hereten a la variant."
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Les categories a les que pertany el producte.\n"
+"Utilitzat per agrupar productes similars."
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Marqueu per permetre la reserva de moviments d'existències independentment "
+"del nivell d'existències."
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+"El import que costa comprar o fabricar el producte, o dur a terme el servei."
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "El mètode utilitzat per calcular el preu de cost."
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"La unitat de mesura per defecte del producte.\n"
+"S'utilitza internament per a calcular els nivells d'existències dels bens i actius."
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "El preu al que normalment es ven el producte."
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr "Les diferents variants que té el producte."
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+"La categoria que conté la unitat de mesura.\n"
+"Es pot realitzar conversions entre diferents unitats de mesura si pertanyen a la mateixa categoria."
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr "El nombre de dígits a mostrar desprès del separador decimal."
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"El coeficient de la fórmula:\n"
+"coeficient (unitat base) = 1 (aquesta unitat)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"El coeficient de la fórmula:\n"
+"1 (unitat base) = coeficient (aquesta unitat)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr "La pressió utilitzada per arrodonir els valors."
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr "El símbol que representa la unitat de mesura."
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Afegeix productes"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Arbre de categories"
+
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Productes per categoria"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Productes"
+
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Unitats de mesura"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr "El \"%(type)s\" \"%(code)s\" del producte \"%(product)s\" no és vàlid."
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr "El codi dels productes actius ha de ser únic."
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr "El factor i el rati de la Udm \"%(uom)s\" són incompatibles."
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr "No podeu modificar la categoria de la UdM \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr "No podeu modificar el factor de la UdM \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+"Si la UdM encara no s'ha fet servir es podrà eliminiar. Si noh ha de ser "
+"desactivada i en podeu crear una de nova."
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr "No podeu modificar el rati de la UdM \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr "El rati i el factor no poden ser els dos igual a zero."
+
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Afegeix productes"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Arbre de categories"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Productes"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Productes"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Unitats de mesura"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Categoria de producte"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Configuració de productes"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Configuració del mètode de cost per defecte del producte"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Preu de cost del producte"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Mètode de cost per producte"
+
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Identificador de producte"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Preu de venda del producte"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Variant de producte"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Plantilla de producte"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Plantilla - Categoria"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Plantilla - Totes les categories"
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Unitat de mesura"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Àrea"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Quirat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "Centímetre"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Centímetre cúbic"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Peu cúbic"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Polzada cúbica"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Metre cúbic"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Dia"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Peu"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Galó"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectàrea"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hora"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Polzada"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Quilogram"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Quilòmetre"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Litre"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Metre"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Milla"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Mil·límetre"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minut"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Unça"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Lliura"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Segon"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Centímetre quadrat"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Peu quadrat"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Polzada quadrada"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Metre quadrat"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Iarda quadrada"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Dia de treball"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Iarda"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "peu³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "pul³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "peu"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "pul"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "peu²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Categoria d'unitat de mesura"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Longitud"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Superfície"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Temps"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Unitats"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volum"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Pes"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Administració de productes"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr "Número d'article internacional (EAN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr "Número Internacional d'itenficador de Valors (ISIN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr "Número estàndard Internacional del Audiovisual (ISAN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr "Número estàndard Internacional de Llibres (ISBN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr "Número estàndard Internacional del Lllibreries (ISIL)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr "Número estàndard Internacional de Música (ISMN)"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Mitjana"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Actius"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Béns"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Serveis"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Mitjana"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Actius"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Béns"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Serveis"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Fills"
+
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Seqüències"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "General"
diff --git a/modules/product/locale/cs.po b/modules/product/locale/cs.po
new file mode 100644
index 0000000000..01c177be81
--- /dev/null
+++ b/modules/product/locale/cs.po
@@ -0,0 +1,1003 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr ""
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Products"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Product by Category"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Product by Category"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr ""
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr ""
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr ""
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr ""
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr ""
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr ""
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Namu"
+
+#, fuzzy
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr ""
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr ""
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr ""
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr ""
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr ""
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Namu"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Products"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Product by Category"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Products"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+#, fuzzy
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Product by Category"
+
+#, fuzzy
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Product Configuration"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr ""
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Product by Category"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr ""
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr ""
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr ""
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr ""
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Carat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Cubic centimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Cubic foot"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Cubic inch"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Cubic meter"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Day"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Foot"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hour"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Inch"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mile"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Ounce"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Pound"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Second"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Square centimeter"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Square foot"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Square inch"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Square meter"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Square yard"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unit"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Work Day"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Units of Measure"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Length"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Surface"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Time"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Units"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Weight"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Product Administration"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr ""
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr ""
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr ""
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Product by Category"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr ""
diff --git a/modules/product/locale/de.po b/modules/product/locale/de.po
new file mode 100644
index 0000000000..fd02a61c79
--- /dev/null
+++ b/modules/product/locale/de.po
@@ -0,0 +1,1003 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Nachkommastellen Artikelpreis"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Untergeordnet (Kategorien)"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Übergeordnet (Kategorie)"
+
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Artikel"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Standardbestandsbewertungsmethode"
+
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Nummernkreis Variante"
+
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Nummernkreis Artikel"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Standardbestandsbewertungsmethode"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Einstandspreis"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Bestandsbewertungsmethode"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Vorlage"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Listenpreis"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Vorlage"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Artikelkategorien"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Artikelkategorien"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Artikelnummer"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr "Artikelnummer ist nur lesbar"
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Verbrauchsmaterial"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Einstandspreis"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Bestandsbewertungsmethode"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Bestandsbewertungsmethoden"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Maßeinheit Einstandspreis"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Einstandspreise"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "Standardeinheit"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Standardmaßeinheit Kategorie"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Nachkommastellen Standardmaßeinheit"
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr "Identifikatoren"
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Listenpreis"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Listenpreis"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Listenpreise"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr "Artikelnummer Präfix"
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr "Artikelnummer Suffix"
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Artikelvorlage"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Artikelkategorien"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Artikelkategorien"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Artikelnummer"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr "Artikelnummer ist nur lesbar"
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Verbrauchsmaterial"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Einstandpreis"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Bestandsbewertungsmethode"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Bestandsbewertungsmethoden"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "Standardeinheit"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Standardkategorie Maßeinheit"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Nachkommastellen Standardmaßeinheit"
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Listenpreis"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Listenpreise"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Varianten"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Artikelkategorie"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Vorlage für Steuerkonto"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Artikelkategorie"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Vorlage"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Angezeigte Nachkommastellen"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Faktor"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Kehrwert"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Rundungsgenauigkeit"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Symbol"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Maßeinheiten"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr "Erlaubt den Aufbau einer Struktur unterhalb dieser Kategorie."
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr "Erlaubt den Aufbau einer Struktur oberhalb dieser Kategorie."
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "Die Standardbestandsbewertungsmethode für neue Artikel."
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr "Wird zum Generieren des hinteren Teils der Artikelnummer genutzt."
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr "Wird zum Generieren des vorderen Teils der Artikelnummer genutzt."
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "Die Standardbestandsbewertungsmethode für neue Artikel."
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr "Der Artikel, dem dieser Identifikator zugeordnet ist."
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Die Kategorien denen der Artikel zugeordnet ist.\n"
+"Wird benutzt um gleichartige Artikel zu gruppieren."
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr "Ein eindeutiger Identifikator für die Variante."
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Auswählen, um Lagerbewegungen unabhängig vom Lagerbestand reservieren zu "
+"dürfen."
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+"Der Betrag, den es kostet, den Artikel einzukaufen oder herzustellen bzw. "
+"die Dienstleistung auszuführen."
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "Die Methode zur Berechnung der Lagerbestandsbewertung."
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"Die Standardmaßeinheit für den Artikel.\n"
+"Wird intern beim Berechnen der Lagerbestände von Waren und Anlagen benutzt."
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr "Andere zur Variante gehörende Identifikatoren."
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "Der Standardpreis zu dem der Artikel verkauft wird."
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr "Der eindeutige Identifikator für den Artikel (z.B. SKU)."
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+"Der Artikel der die gemeinsamen Eigenschaften beschreibt, die von der "
+"Variante geerbt werden."
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Die Kategorien denen der Artikel zugeordnet ist.\n"
+"Wird benutzt um gleichartige Artikel zu gruppieren."
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Auswählen, um Lagerbewegungen unabhängig vom Lagerbestand reservieren zu "
+"dürfen."
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+"Der Betrag, den es kostet, den Artikel einzukaufen oder herzustellen bzw. "
+"die Dienstleistung auszuführen."
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "Die Methode zur Berechnung der Lagerbestandsbewertung."
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"Die Standardmaßeinheit für den Artikel.\n"
+"Wird intern beim Berechnen der Lagerbestände von Waren und Anlagen benutzt."
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "Der Standardpreis zu dem der Artikel verkauft wird."
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr "Die verschiedenen Varianten die vom Artikel erben."
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+"Die Maßeinheit gehört zu dieser Größenart.\n"
+"Nur innerhalb einer Größenart kann zwischen verschiedenen Maßeinheiten umgerechnet werden."
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr "Die Anzahl der Nachkommastellen die angezeigt werden sollen."
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"Der Faktor für die Formel: \n"
+"Faktor x Basiseinheit = 1 x diese Einheit"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"Der Kehrwert vom Faktor für die Formel: \n"
+"1 x Basiseinheit = Kehrwert x diese Einheit"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr "Die Genauigkeit auf die Werte gerundet werden."
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr "Das Symbol mit dem die Maßeinheit repräsentiert wird."
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Artikel hinzufügen"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Varianten"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Varianten"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Artikel nach Kategorie"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Artikel"
+
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Maßeinheiten"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+"Der \"%(code)s\" für den Identifikator %(type)s von Artikel \"%(product)s\" "
+"ist ungültig."
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr "Die Artikelnummer eines aktiven Artikels muss eindeutig sein."
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+"Inkompatible Kombinaton aus Faktor und Kehrwert auf Maßeinheit \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr "Die Kategorie der Maßeinheit \"%(uom)s\" kann nicht geändert werden."
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr "Der Faktor der Maßeinheit \"%(uom)s\" kann nicht geändert werden."
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+"Sofern die Maßeinheit noch nicht verwendet wurde, kann sie gelöscht werden. "
+"Andernfalls kann sie deaktiviert und eine neue Maßeinheit erstellt werden."
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr "Der Kehrwert der Maßeinheit \"%(uom)s\" kann nicht geändert werden."
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr "Faktor und Kehrwert können nicht beide Null sein."
+
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Artikel hinzufügen"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Varianten"
+
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Auswertungen"
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Artikel"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Maßeinheiten"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Artikel Kategorie"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Einstellungen Artikel"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Einstellungen Artikel Standardbestandsbewertungsmethode"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Artikel Einstandspreis"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Artikel Bestandsbewertungsmethode"
+
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Artikelidentifikator"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Artikel Listenpreis"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Artikel Variante"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Artikelvorlage"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Artikelvorlage - Kategorie"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Artikelvorlage - Alle Kategorien"
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Maßeinheit"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Ar"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Karat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "Zentimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Kubikzentimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Kubikfuß"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Kubikzoll"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Kubikmeter"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Tag"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Fuß"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallone"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gramm"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hektar"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Stunde"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Zoll"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogramm"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Meile"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Unze"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Pfund"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Sekunde"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Quadratzentimeter"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Quadratfuß"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Quadratzoll"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Quadratmeter"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Quadratyard"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Stück"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Arbeitstag"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "Stk."
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "At."
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Größenart"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Länge"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Fläche"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Zeit"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Stück"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volumen"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Gewicht"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Artikel Administration"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr "Internationale Artikelnummer (IAN/EAN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr "Internationale Wertpapierkennnummer (ISIN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr "International Standard Audiovisual Number (ISAN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr "Internationale Standardbuchnummer (ISBN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr "International Standard Identifier for Libraries (ISIL)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr "Internationale Standardmusiknummer (ISMN)"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Gleitender Durchschnitt"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Festwert"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Anlagegut"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Ware"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Dienstleistung"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Durchschnitt"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Anlagegut"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Ware"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Dienstleistung"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Untergeordnet (Kategorien)"
+
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Nummernkreise"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Allgemein"
diff --git a/modules/product/locale/es.po b/modules/product/locale/es.po
new file mode 100644
index 0000000000..0d2a3ddea7
--- /dev/null
+++ b/modules/product/locale/es.po
@@ -0,0 +1,997 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Decimales del precio del producto"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Hijos"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Método de coste por defecto"
+
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Secuencia de la variante"
+
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Secuencia del producto"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Método de coste por defecto"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Precio de coste"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Método de costo"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Plantilla"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Precio de venta"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Plantilla"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr "Código solo lectura"
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Consumible"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Precio de coste"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Método de coste"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Métodos de coste"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Precio de coste"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Precio de coste"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "UdM por defecto"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Categoria UdM por defecto"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Decimales de unidad por defecto"
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr "Identificadores"
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Precio de venta"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Precio de venta"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Precios de venta"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr "Código prefijo"
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr "Código sufijo"
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Plantilla de producto"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr "Código solo lectura"
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Consumible"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Precio de coste"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Método de coste"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Métodos de coste"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "UdM por defecto"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Categoria UdM por defecto"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Decimales de unidad por defecto"
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Precio de venta"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Precios de venta"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Plantilla"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Plantilla"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Decimales a mostrar"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Factor"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Conversión"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Precisión de redondeo"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Símbolo"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Unidades de medida"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr "Utilizado para añadir una estructura por debajo de la categoría."
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr "Utilizado para añadir una estructura por encima de la categoría."
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "El método de coste por defecto para los nuevos productos."
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr "Utilizado para generar la parte final del código del producto."
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr "Utilizado para generar la parte inicial del código del producto."
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "El método de coste por defecto para los nuevos productos."
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr "El producto que se identifica por el código."
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Las categorías a las que pertenece el producto.\n"
+"Utilizado para agrupar productos similares."
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr "El identificador único de la variante."
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Marcar para permitir la asignación de movimientos de existencias "
+"independientemente del nivel de existencias."
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+"El importe que cuesta comprar o fabricar la variante, o dar el servicio."
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "El método utilizado para calcular el precio de coste."
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"La unidad de medida por defecto del prodcuto.\n"
+"Se utiliza internamente para calcular los niveles de existencias de los bienes y los activos."
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr "Otros identificadores associados a la variante."
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "El precio al que normalmente se vende el producto."
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr "El identificador único del producto (aka SKU)."
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+"El producto que define las propiedades comunes que se heredan a la variante."
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Las categorías a las que pertenece el producto.\n"
+"Utilizado para agrupar productos similares."
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Marcar para permitir la reserva de movimientos de existencias "
+"independientemente del nivel de existencias."
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+"El importe que cuesta comprar o fabricar el producto, o dar el servicio."
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "El método utilizado para calcular el precio de coste."
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"La unidad de medida por defecto del prodcuto.\n"
+"Se utiliza internamente para calcular los niveles de existencias de los bienes y los activos."
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "El precio al que normalmente se vende el producto."
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr "Las diferentes variantes que tiene el producto."
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+"La categoría que contiene la unidad de medida.\n"
+"Se puede realizar conversiones entre distintas unidades de medida si pertenecen a la misma categoría."
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr "El número de dígitos a mostrar después del separador decimal."
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"El coeficiente de la fórmula:\n"
+"coeficiente (unidad base) = 1 (esta unidad)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"El coeficiente de la fórmula:\n"
+"1 (unidad base) = coeficiente (esta unidad)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr "La presición utilizada para redondear los valores."
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr "El símbolo que representa la unidad de medida."
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Añadir productos"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Árbol de categorías"
+
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Productos por categoría"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Unidades de medida"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr "El \"%(type)s\" \"%(code)s\" del producto \"%(product)s\" no es valido."
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr "El código de los productos activos debe ser único."
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr "El factor y el ratio de la UdM \"%(uom)s\" son incompatibles."
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr "No podéis modificar la categoría de la UdM \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr "No podéis modificar el factor de la UdM \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+"Si la UdM aún no esta en uso podrá ser eliminada. Sinó debe ser desactivada "
+"y podéis crear una de nueva."
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr "No podéis modificar el ratio de la UdM \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr "El ratio i el factor no pueden ser a la vez zero."
+
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Añadir productos"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Árbol de categorías"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Productos"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Unidades de medida"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Categoría de producto"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Configuración de productos"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Configuración del método de coste por defecto del producto"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Precio de coste del producto"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Método de coste por producto"
+
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Identificador de producto"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Precio de venta del producto"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Variante de producto"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Plantilla de producto"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Plantilla - Categoría"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Plantilla - Todas las categorías"
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Unidad de medida"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Área"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Quilate"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "Centímetro"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Centímetro cúbico"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Pie cúbico"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Pulgada cúbica"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Metro cúbico"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Día"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Pie"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Galón"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gramo"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectárea"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hora"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Pulgada"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogramo"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilómetro"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Litro"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Metro"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Milla"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Milímetro"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minuto"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Onza"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Libra"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Segundo"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Centímetro cuadrado"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Pie cuadrado"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Pulgada cuadrada"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Metro cuadrado"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Yarda cuadrada"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Día de trabajo"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yarda"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "pie³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "pie"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "pie²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Categoría de la Unidad de medida"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Longitud"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Superficie"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Tiempo"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Unidades"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volumen"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Peso"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Administración de productos"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr "Número de articulo internacional (EAN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr "Numero Internacional de Identificación de Valores (ISIN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr "Número Estándar Internacional de Audiovisual (ISAN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr "Número Estándar Internacional de Libros (ISBN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr "Número Estándar Internacional de Librerias (ISIL)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr "Número Estándar Internacional de Música (ISMN)"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Promedio"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Fijo"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Activos"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Bienes"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Servicios"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Promedio"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fijo"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Activos"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Bienes"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Servicios"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Hijos"
+
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Secuencias"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "General"
diff --git a/modules/product/locale/es_419.po b/modules/product/locale/es_419.po
new file mode 100644
index 0000000000..145a891cc1
--- /dev/null
+++ b/modules/product/locale/es_419.po
@@ -0,0 +1,1010 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr ""
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Configuración de producto"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Método de costo por defecto"
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Configuración de producto"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Configuración de producto"
+
+#, fuzzy
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Método de costo por defecto"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Precio de costo"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr ""
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Precio de costo"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Categorías"
+
+#, fuzzy
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Precio de costo"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Precio de costo"
+
+#, fuzzy
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Precio de costo"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Categoría de UdM por defecto"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Precio de costo"
+
+#, fuzzy
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Precio de costo"
+
+#, fuzzy
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Precio de costo"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr ""
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Categorías"
+
+#, fuzzy
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Precio de costo"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Categoría de UdM por defecto"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Precio de costo"
+
+#, fuzzy
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Precio de costo"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr ""
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr ""
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr ""
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr ""
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr ""
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr ""
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr ""
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr ""
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categorías"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Configuración de producto"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categorías"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configuración de producto"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variantes"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Configuración de producto"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variantes"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Configuración de producto"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categorías"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variantes"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configuración de producto"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr ""
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Configuración de producto"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr ""
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Configuración de producto"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr ""
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr ""
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr ""
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr ""
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr ""
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr ""
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Artículos"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Servicio"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr ""
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Artículos"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Servicio"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Configuración de producto"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr ""
diff --git a/modules/product/locale/et.po b/modules/product/locale/et.po
new file mode 100644
index 0000000000..254b8bf51d
--- /dev/null
+++ b/modules/product/locale/et.po
@@ -0,0 +1,995 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Toote omahind"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Alam"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Nimi"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Ülem"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Tooted"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Vaikimisi kulumeetod"
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Kauba mall"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Kauba mall"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Vaikimisi kulumeetod"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Ostuhind"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Omahinna meetod"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Mall"
+
+#, fuzzy
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Kood"
+
+#, fuzzy
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Tüüp"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Müügihind"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Mall"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Kategooriad"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Kategooriad"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Kood"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Tarvikud"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Ostuhind"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Omahinna meetod"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Omahinna meetod"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Ostuhind"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Ostuhinnad"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "Vaikimisi ühik"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Vaikimisi kategooria ühik"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Kirjeldus"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Müügihind"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Müügihind"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Müügihinnad"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Nimi"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Kauba mall"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Tüüp"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Kategooriad"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Kategooriad"
+
+#, fuzzy
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Kood"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Tarvikud"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Ostuhind"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Omahinna meetod"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Omahinna meetod"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "Vaikimisi ühik"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Vaikimisi kategooria ühik"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Müügihind"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Müügihinnad"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Nimi"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Variandid"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Tüüp"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Kategooria"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Mall"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Kategooria"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Mall"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Kategooria"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Näita numbriväärtusi"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Faktor"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Nimi"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Kurss"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Ümardamise täpsus"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Sümbol"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Nimi"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Mõõtühik"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Kategooriad"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Tooted"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Kategooriad"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variandid"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variandid"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Tooted kategooria lõikes"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Tooted"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Kategooriad"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Mõõtühik"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Tooted"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variandid"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Kategooriad"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Kategooriad"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variandid"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Tooted"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Kategooriad"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Mõõtühik"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Toote kategooria"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Toote seadistus"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Toote seadistus vaikimisi omahinna meetod"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Toote omahind"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Toote omahinna meetod"
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Kauba mall"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Toote müügihind"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Toote variant"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Kauba mall"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Mall - Kategooria"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Mall - kõik kategooriad"
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Mõõtühik"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Aar"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Karaat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "sentimeeter"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Kuupmeeter"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Kuupjalg"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Kuuptoll"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Kuupmeeter"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Päev"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Jalg"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gramm"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hektar"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Tund"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Toll"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogramm"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilomeeter"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liiter"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meeter"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Miil"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeeter"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minut"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Unts"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Nael"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Sekund"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Ruutsentimeeter"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Ruutjalg"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Ruuttoll"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Ruutmeeter"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Ruutjard"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Ühik"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Tööpäev"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Jard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Mõõtühik"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Pikkus"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Pindala"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Aeg"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Ühikud"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Maht"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Kaal"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Toote administreerimine"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Keskmine"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Fikseeritud"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Põhivara"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Kaup"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Teenus"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Keskmine"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fikseeritud"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Põhivarad"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Kaubad"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Teenus"
+
+#, fuzzy
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Alam"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Kauba mall"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Üldine"
diff --git a/modules/product/locale/fa.po b/modules/product/locale/fa.po
new file mode 100644
index 0000000000..56dd941334
--- /dev/null
+++ b/modules/product/locale/fa.po
@@ -0,0 +1,999 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "ارزش بها محصول"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "زیر مجموعه"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "منبع"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "محصولات"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "روش هزینه پیش فرض"
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "الگوی محصول"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "الگوی محصول"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "روش هزینه پیش فرض"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "ارزش بها"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "روش ارزش بها"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "الگو"
+
+#, fuzzy
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "کد"
+
+#, fuzzy
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "نوع"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "لیست قیمت"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "الگو"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "دسته بندی ها"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "دسته بندی ها"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "کد"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "مصرفی"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "ارزش بها"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "روش ارزش بها"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "روش های ارزش بها"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "ارزش بها"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "قیمت های هزینه"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "واحد اندازه گیری پیش فرض"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "زیرمجموعه واحد اندازه گیری پیش فرض"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "شرح"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "لیست قیمت"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "لیست قیمت"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "لیست قیمت ها"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "الگوی محصول"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "نوع"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "دسته بندی ها"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "دسته بندی ها"
+
+#, fuzzy
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "کد"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "مصرفی"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "ارزش بها"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "روش ارزش بها"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "روش های ارزش بها"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "واحد اندازه گیری پیش فرض"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "زیرمجموعه واحد اندازه گیری پیش فرض"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "لیست قیمت"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "لیست قیمت ها"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "متغیرها"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "نوع"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "دستهبندی"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "الگو"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "دستهبندی"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "الگو"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "دستهبندی"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "نمایش ارقام"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "عامل"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "نرخ"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "گرد کردن دقیق"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "نماد"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "نام"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "واحدهای اندازه گیری"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"ضریب برای فرمول: \n"
+"coef (واحد پایه) = 1 (این واحد)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"ضریب برای فرمول:\n"
+"1 (واحد پایه) = coef (این واحد)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "دسته بندی ها"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "محصولات"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "دسته بندی ها"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "متغیرها"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "متغیرها"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "محصول بوسیله زیرمجموعه"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "محصولات"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "دسته بندی ها"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "واحدهای اندازه گیری"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "محصولات"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "متغیرها"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "دسته بندی ها"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "دسته بندی ها"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "متغیرها"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "محصولات"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "دسته بندی ها"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "واحدهای اندازه گیری"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "زیرمجموعه محصولات"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "پیکربندی محصول"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "پیکربندی محصول روش ارزش بها پیش فرض"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "ارزش بها محصول"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "روش ارزش بها محصول"
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "الگوی محصول"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "لیست قیمت محصول"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "تنوع محصول"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "الگوی محصول"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "الگوی - زیرمجموعه"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "الگوی - تمام زیرمجموعه"
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "واحد اندازه گیری"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "هست"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "عیار"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "سانتی متر"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "سانتی متر مکعب"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "فوت مکعب"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "اینچ مکعب"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "متر مکعب"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "روز"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "فوت"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "گالن"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "گرم"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "هکتار"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "ساعت"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "اینچ"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "کیلوگرم"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "کیلومتر"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "لیتر"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "متر"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "مایل"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "میلیمتر"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "دقیقه"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "اونس"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "پوند"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "ثانیه"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "سانتی متر مربع"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "فوت مربع"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "اینچ مربع"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "متر مربع"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "یارد مربع"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "واحد"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "روز کاری"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "یارد"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "واحد اندازه گیری"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "طول"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "سطح"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "زمان"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "واحدها"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "حجم/اندازه"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "وزن"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "مدیریت محصول"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "متوسط"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "درست شد"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "دارایی های"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "کالاها"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "خدمات"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "متوسط"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "درست شد"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "دارایی های"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "کالاها"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "خدمات"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "زیر مجموعه"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "الگوی محصول"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "عمومی"
diff --git a/modules/product/locale/fi.po b/modules/product/locale/fi.po
new file mode 100644
index 0000000000..45bd37523c
--- /dev/null
+++ b/modules/product/locale/fi.po
@@ -0,0 +1,998 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr ""
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Products"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Product by Category"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Product by Category"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr ""
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr ""
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr ""
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr ""
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr ""
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr ""
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr ""
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr ""
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr ""
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr ""
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr ""
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr ""
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr ""
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr ""
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr ""
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Products"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Product by Category"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Products"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+#, fuzzy
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Product by Category"
+
+#, fuzzy
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Product Configuration"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr ""
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Product by Category"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr ""
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr ""
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr ""
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr ""
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Carat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Cubic centimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Cubic foot"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Cubic inch"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Cubic meter"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Day"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Foot"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hour"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Inch"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mile"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Ounce"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Pound"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Second"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Square centimeter"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Square foot"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Square inch"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Square meter"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Square yard"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unit"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Work Day"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Units of Measure"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Length"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Surface"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Time"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Units"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Weight"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Product Administration"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr ""
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr ""
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr ""
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Product by Category"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr ""
diff --git a/modules/product/locale/fr.po b/modules/product/locale/fr.po
new file mode 100644
index 0000000000..5fb79c7671
--- /dev/null
+++ b/modules/product/locale/fr.po
@@ -0,0 +1,999 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Décimal de prix de revient de produit"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Enfants"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Produits"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Méthode de coût par défaut"
+
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Séquence de variantes"
+
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Séquence de produit"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Méthode de coût par défaut"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Prix de revient"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Méthode de prix de revient"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Modèle"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Prix listé"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Modèle"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr "Code en lecture seule"
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Consommable"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Prix de revient"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Méthode de prix de revient"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Méthodes de prix de revient"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Prix de revient"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Prix de revient"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "UDM par défaut"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Catégorie d'UDM par défaut"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Décimales d'unité par défaut"
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr "Identifiants"
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Prix listé"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Prix listé"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Prix listés"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr "Code préfixe"
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr "Code suffixe"
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Modèle produit"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr "Code en lecture seule"
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Consommable"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Prix de revient"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Méthode de prix de revient"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Méthodes de prix de revient"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "UDM par défaut"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Catégorie d'UDM par défaut"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Décimales d'unité par défaut"
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Prix listé"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Prix listés"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Modèle"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Modèle"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Décimales affichées"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Facteur"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Taux"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Précision d'arrondi"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Symbole"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Unités de mesure"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr "Utilisé pour ajouter une structure sous la catégorie."
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr "Utilisé pour ajouter une structure au-dessus de la catégorie."
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "La méthode du prix de revient par défaut pour les nouveaux produits."
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr "Utilisé pour générer la dernière partie du code produit."
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr "Utilisé pour générer la première partie du code produit."
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "La méthode du prix de revient par défaut pour les nouveaux produits."
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr "Le produit identifié par le code."
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Les catégories dans lesquelles se trouve le produit.\n"
+"Utilisé pour regrouper des produits similaires."
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr "Un identifiant unique pour la variante."
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Cochez cette case pour permettre l'attribution des mouvements de stock quel "
+"que soit le niveau de stock."
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+"Le montant qu'il coûte pour acheter ou fabriquer la variante, ou exécuter le"
+" service."
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "La méthode utilisée pour calculer le prix de revient."
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"L'unité de mesure standard pour le produit.\n"
+"Utilisé en interne lors du calcul des niveaux de stock de biens et d'actifs."
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr "Autres identifiants associés à la variante."
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "Le prix standard auquel le produit est vendu."
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr "L'identifiant unique du produit (alias UGS)."
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+"Le produit qui définit les propriétés communes héritées par la variante."
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Les catégories dans lesquelles se trouve le produit.\n"
+"Utilisé pour regrouper des produits similaires."
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Cochez cette case pour permettre l'attribution des mouvements de stock quel "
+"que soit le niveau de stock."
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+"Le montant qu'il coûte pour acheter ou fabriquer la variante, ou exécuter le"
+" service."
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "La méthode utilisée pour calculer le prix de revient."
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"L'unité de mesure standard pour le produit.\n"
+"Utilisé en interne lors du calcul des niveaux de stock de biens et d'actifs."
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "Le prix standard auquel le produit est vendu."
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr "Les différentes variantes du produit."
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+"La catégorie contenant l'unité de mesure.\n"
+"Les conversions entre différentes unités de mesure peuvent être effectuées si elles appartiennent à la même catégorie."
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr "Le nombre de chiffres à afficher après le séparateur de décimal."
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"Le coefficient de la formule :\n"
+"coefficient (unité de base) = 1 (cette unité)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"Le coefficient pour la formule :\n"
+"1 (unité de base) = coef (cette unité)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr "La précision à laquelle les valeurs sont arrondies."
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr "Le symbole qui représente l'unité de mesure."
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Ajouter des produits"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Produit par catégorie"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Produits"
+
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Unités de mesure"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr "Le %(type)s « %(code)s » du produit « %(product)s » n'est pas valide."
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr "Le code des produits actifs doit être unique."
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr "Facteur et taux incompatibles sur l’UDM « %(uom)s »."
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr "Vous ne pouvez pas modifier la catégorie d’UDM « %(uom)s »."
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr "Vous ne pouvez pas modifier le facteur de l'UDM « %(uom)s »."
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+"Si le UDM n'est toujours pas utilisé, vous pouvez la supprimer, sinon vous "
+"pouvez la désactiver et en créer une nouvelle."
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr "Vous ne pouvez pas modifier le taux de l'UDM « %(uom)s »."
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr "Le taux et le facteur ne peuvent pas être tous deux égaux à zéro."
+
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Ajouter des produits"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapports"
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Produits"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Unités de mesure"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Catégorie de produit"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Configuration produit"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Configuration produit de la méthode de coût par défaut"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Produit Prix de revient"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Méthode de prix de revient de produit"
+
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Identifiant de produit"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Produit Prix listé"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Variante produit"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Modèle produit"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Modèle - Catégorie"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Modèle - Catégorie Toutes"
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Unité de mesure"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Carat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimètre"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Centimètre cube"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Pied cubique"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Pouce cubique"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Mètre cube"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Jour"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Pied"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gramme"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Heure"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Pouce"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogramme"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilomètre"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Litre"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Mètre"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mille"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimètre"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Once"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Livre"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Seconde"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Centimètre carré"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Pied carré"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Pouce carré"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Mètre carré"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Yard carré"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Jour de travail"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "j"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "po"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "pi²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "po²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "jt"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Longueur"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Surface"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Heure"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Unités"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Poids"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Administration des produits"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr "Numéro d'article international"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr "Numéro international d'identification de titres"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr "Numéro audiovisuel international standard"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr "Numéro international normalisé de livre"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr "Identifiant international standard pour les bibliothèques"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr "Numéro international normalisé de musique"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Moyenne"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Fixe"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Actifs"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Biens"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Service"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Moyenne"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fixé"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Actifs"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Biens"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Service"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Enfants"
+
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Séquences"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Général"
diff --git a/modules/product/locale/hu.po b/modules/product/locale/hu.po
new file mode 100644
index 0000000000..236bb73d0b
--- /dev/null
+++ b/modules/product/locale/hu.po
@@ -0,0 +1,1004 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Cikk változat"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Alkategóriák"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Fölérendelt"
+
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Termékek"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Alapértelmezett költségár számítási mód"
+
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Változatok sorszámozása"
+
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Termék sorszámozása"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Alapértelmezett költségár számítási mód"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Költségár"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Költségár számítás módja"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Sablon"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Kód"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Típus"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Listaár"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Sablon"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Kategóriák"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Kategóriák"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Cikkszám"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr "Szám csak olvasható"
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Fogyóeszköz"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Költségár"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Költségár számítás módja"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Költségár"
+
+#, fuzzy
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Beszerzési ár"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "Alapegység"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Alapértelmezett ME kategória"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Leírás"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr "Azonosítók"
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Listaár"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Listaár"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Listaárak"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Terméksablon"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Típus"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Kategóriák"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Kategóriák"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Cikkszám"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr "Szám csak olvasható"
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Fogyóeszköz"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Költségár"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Költségár számítás módja"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "Alap ME"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Alapértelmezett ME kategória"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Listaár"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Listaárak"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Változatok"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Típus"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Kategória"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Sablon"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Kategória"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Sablon"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Kategória"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Tizedes vessző utáni számjegyek"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Szorzó"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Érték"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Kerekítési pontosság"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Szimbólum"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Mértékegységek"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr "Itt egyből megadhatja az alkategóriákat."
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr "Itt megadhatja vagy létrehozhatja a főkategóriát."
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"A termék kategóriái.\n"
+"Hasonló termékek csoportosítására szolgálnak."
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Jelölje be, hogy a készletmozgásokat a készletszinttől függetlenül "
+"rendelkezésre lehessen állítani."
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+"Az a pénzösszeg, amennyibe a változat beszerzése, gyártása vagy a "
+"szolgáltatás igénybe vétele kerül."
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "A költségár számításának módja."
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"A termék alapértelmezett mértékegysége.\n"
+"A készletet ebben a mértékegységben vezeti a rendszer."
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr "A termékváltozat további azonosítói."
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "A termék értékesítésekor használt alapár."
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr "A terméknek a cégen belüli egyedi azonosítója (cikkszám)."
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+"Az a termék, amely meghatározza a változatok által örökölt közös "
+"tulajdonságokat."
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"A termék kategóriái.\n"
+"Hasonló termékek csoportosítására szolgálnak."
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Jelölje be, hogy a készletmozgásokat a készletszinttől függetlenül "
+"rendelkezésre lehessen állítani."
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr "Ennyibe kerül a terméket beszerezni vagy a szolgáltatást nyújtani."
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "A költségár számításának módja."
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"A termék alapértelmezett mértékegysége.\n"
+"A készletet ebben a mértékegységben vezeti a rendszer."
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "A termék értékesítésekor használt alapár."
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr "A termék változatai."
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr "A tizedesvessző után ennyi számjegyet jelenít meg a rendszer."
+
+#, fuzzy
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"A központi egység faktora egy mértékegységnek mindig 1.\n"
+"Képlet: ez az egység=faktor*központi egység\n"
+"A reciprok faktor mező automatikusan az itt megadott értékből lesz kiszámolva"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"A reciproka a központi egység faktora egy mértékegységnek mindig 1.\n"
+"Képlet: központi egység=reciprok*ez az egység\n"
+"A faktor mező automatikusan az itt megadott értékből lesz kiszámolva"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Kategóriák"
+
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Termékek hozzáadása"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Kategóriák"
+
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Beállítások"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Változatok"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Változatok"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Termékek kategóriánként"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Termékek"
+
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Kategóriák"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Mértékegységek"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Termékek hozzáadása"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Változat"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Kategóriák"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Kategóriák"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Beállítások"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Változatok"
+
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Beállítások"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Jelentések"
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Termékek"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Kategóriák"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Mértékegységek"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Termék kategória"
+
+#, fuzzy
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Product Configuration"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr ""
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Cikk sablon"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr ""
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Cikk változat"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Terméksablon"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr ""
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr ""
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Mértékegység"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Ár"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Karát"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "Centiméter"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Köbcentiméter"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Köbláb"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Köbhüvelyk"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Köbméter"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Nap"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Láb"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gramm"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hektár"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Óra"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Hüvelyk"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogramm"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilométer"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Méter"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mérföld"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Milliméter"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Perc"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Uncia"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Font"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Másodperc"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Négyzetcentiméter"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Négyzetláb"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Négyzethüvelyk"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Négyzetméter"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Négyzetyard"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Darab"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Munkanap"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "t"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "ó"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "db"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Mértékegység"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Hossz"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Terület"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Időpont"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Egységek"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Térfogat"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Súly"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Product Administration"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr "Globális Kereskedelmi Áruazonosító Szám (GTIN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr "Nemzetközi Szabványos Könyvazonosító (ISBN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr "Nemzetközi Szabványos Kottaazonosító (ISMN)"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Átlag"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Eszközök"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Áru"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Szolgáltatás"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Átlag"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Eszközök"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Áru"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Szolgáltatás"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Alkategóriák"
+
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Sorszámozások"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Általános"
diff --git a/modules/product/locale/id.po b/modules/product/locale/id.po
new file mode 100644
index 0000000000..ff62556899
--- /dev/null
+++ b/modules/product/locale/id.po
@@ -0,0 +1,984 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr ""
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Cabang"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Induk"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Produk"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Urutan Produk"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Urutan Produk"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr ""
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Templat"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Kode"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Templat"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Kategori"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Kategori"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Kode"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr ""
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr ""
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Deskripsi"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr ""
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr ""
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr ""
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr ""
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Kode"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr ""
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr ""
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr ""
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Templat"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Templat"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr ""
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr ""
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr ""
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr ""
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr ""
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Satuan Ukuran"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Produk"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Kategori"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Satuan Ukuran"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Produk"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Kategori-kategori"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Kategori-kategori"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Satuan Ukuran"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Kategori Produk"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Konfigurasi Produk"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr ""
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Pengenal Produk"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr ""
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr ""
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr ""
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr ""
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr ""
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Satuan Ukuran"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Karat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "sentimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Centimeter kubik"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Kaki kubik"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Inci kubik"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Meter kubik"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Hari"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Kaki"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Galon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hektar"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Jam"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Inci"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Menit"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Ons"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Detik"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Centimeter persegi"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Kaki persegi"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Inci persegi"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Meter persegi"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Yard persegi"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr ""
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr ""
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Kategori Satuan Ukuran"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Waktu"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr ""
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Berat"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Aktiva"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Barang"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Jasa"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr ""
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Aktiva"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Barang"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Jasa"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Cabang"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Urutan Produk"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Umum"
diff --git a/modules/product/locale/it.po b/modules/product/locale/it.po
new file mode 100644
index 0000000000..1cfe5cf82e
--- /dev/null
+++ b/modules/product/locale/it.po
@@ -0,0 +1,1003 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Prezzo del prodotto"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Figlio"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Prodotti"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Metodo di costo predefinito"
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Modello prodotto"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Modello prodotto"
+
+#, fuzzy
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Metodo di costo predefinito"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Costo"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Modello"
+
+#, fuzzy
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Codice"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Listino prezzi"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Modello"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Categorie"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Categorie"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Codice"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Consumabile"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Costo"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Costo"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Costi"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "UdM predefinita"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr ""
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Descrizione"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Listino prezzi"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Listino prezzi"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Listino prezzi"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Modello prodotto"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Categorie"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Categorie"
+
+#, fuzzy
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Codice"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Consumabile"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Costo"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "UdM predefinita"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr ""
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Listino prezzi"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Listino prezzi"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Varianti"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Modello"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Modello"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Categoria"
+
+#, fuzzy
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Posizioni"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Fattore"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Cambio"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Precisione di arrotondamento"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Simbolo"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Nome"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"Il coefficiente per la formula:\n"
+"coef (unità base) = 1 (questa unità)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"Il coefficiente per la formula:\n"
+"1 (unità base) = coef (questa unità)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categorie"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Prodotti"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categorie"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variants"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Product by Category"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Prodotti"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Categorie"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Prodotti"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Varianti"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categorie"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categorie"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Prodotti"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categorie"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Categoria Prodotto"
+
+#, fuzzy
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Product Configuration"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Prezzo del prodotto"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Modello prodotto"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Prezzo di listino dei prodotti"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Variante prodotto"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Modello prodotto"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr ""
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Unità di misura"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Carat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Cubic centimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Cubic foot"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Cubic inch"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Cubic meter"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Day"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Foot"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hour"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Inch"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mile"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Ounce"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Pound"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Second"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Square centimeter"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Square foot"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Square inch"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Square meter"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Square yard"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unità"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Work Day"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Unità di misura"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Lunghezza"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Surface"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Tempo"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Unità"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Peso"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Amministrazione prodotto"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Media"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Fissa"
+
+#, fuzzy
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Immobilizzazioni"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Beni"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Servizio"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Media"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fissa"
+
+#, fuzzy
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Immobilizzazioni"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Beni"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Servizio"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Figlio"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Modello prodotto"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Generale"
diff --git a/modules/product/locale/lo.po b/modules/product/locale/lo.po
new file mode 100644
index 0000000000..286bcd776e
--- /dev/null
+++ b/modules/product/locale/lo.po
@@ -0,0 +1,1098 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "ຜະລິດຕະພັນຍ່ອຍ"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "ໝວດຍ່ອຍ"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "ບັນຊີແມ່"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Products"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "ວິທີຄິດໄລ່ລາຄາເດີມ"
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "ຮ່າງແບບຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "ຮ່າງແບບຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "ວິທີຄິດໄລ່ລາຄາເດີມ"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "ລາຄາຄິດໄລ່"
+
+#, fuzzy
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "ຮ່າງແບບ"
+
+#, fuzzy
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "ລະຫັດ"
+
+#, fuzzy
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "ຊະນິດ"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "ລາຄາຂາຍ"
+
+#, fuzzy
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "ຮ່າງແບບ"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "ປະເພດ"
+
+#, fuzzy
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "ປະເພດ"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "ລະຫັດ"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "ວັດຖຸສິ້ນເປືອງ"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "ລາຄາຄິດໄລ່"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "ລາຄາຄິດໄລ່"
+
+#, fuzzy
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "ລາຄາຄິດໄລ່"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "ຫົວໜ່ວຍເດີມ"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "ປະເພດຫົວໜ່ວຍເດີມ"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "ຄຳອະທິບາຍ"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "ລາຄາຂາຍ"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "ລາຄາຂາຍ"
+
+#, fuzzy
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "ລາຄາຂາຍ"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "ຮ່າງແບບຜະລິດຕະພັນ"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "ຊະນິດ"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "ປະເພດ"
+
+#, fuzzy
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "ປະເພດ"
+
+#, fuzzy
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "ລະຫັດ"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "ວັດຖຸສິ້ນເປືອງ"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "ລາຄາຄິດໄລ່"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "ຫົວໜ່ວຍເດີມ"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "ປະເພດຫົວໜ່ວຍເດີມ"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "ລາຍການລາຄາ"
+
+#, fuzzy
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "ລາຄາຂາຍ"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "ຜະລິດຕະພັນຍ່ອຍ"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "ປະເພດ"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "ປະເພດ"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "ຮ່າງແບບ"
+
+#, fuzzy
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "ປະເພດ"
+
+#, fuzzy
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "ຮ່າງແບບ"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "ປະເພດ"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "ສະແດງເລກເສດ"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "ປັດໄຈຄູນ"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "ອັດຕາ"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "ປັດໂຕເລກມົນ"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "ສັນຍະລັກ"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"ຄ່າສຳປະສິດຂອງສູດ:\n"
+"coef (ໜ່ວຍພຶ້ນຖານ)= 1 (ໜ່ວຍນີ້)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"ຄ່າສຳປະສິດຂອງສູດ:\n"
+"1 (ໜ່ວຍພຶ້ນຖານ)= coef (ໜ່ວຍນີ້)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Product by Category"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "ປະເພດ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "ຜະລິດຕະພັນຍ່ອຍ"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Product"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "ປະເພດຜະລິດຕະພັນ"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "ກຳນົດຄ່າຜະລິດຕະພັນ"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr ""
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "ຮ່າງແບບຜະລິດຕະພັນ"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr ""
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "ຜະລິດຕະພັນຍ່ອຍ"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "ຮ່າງຂໍ້ມູນຜະລິດຕະພັນ"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "ຮ່າງແບບ - ປະເພດ"
+
+#, fuzzy
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "ຮ່າງແບບ - ປະເພດ"
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "ໜ່ວຍວັດແທກ"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Carat"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Cubic centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Cubic foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Cubic inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Cubic meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Day"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hour"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mile"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Ounce"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Pound"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Second"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Square centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Square foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Square inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Square meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Square yard"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unit"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Work Day"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "ໜ່ວຍວັດແທກ"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Length"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Surface"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Time"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Units"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Weight"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Product Administration"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "ສະເລັ່ຍ"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "ຄົງທີ່"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "ຊັບສິນ"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "ສິນຄ້າ"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "ການບໍລິການ"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "ສະເລັ່ຍ"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "ຄົງທີ່"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "ຊັບສິນ"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "ສິນຄ້າ"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "ບໍລິການ"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "ໝວດຍ່ອຍ"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "ຮ່າງແບບຜະລິດຕະພັນ"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "ທົ່ວໄປ"
diff --git a/modules/product/locale/lt.po b/modules/product/locale/lt.po
new file mode 100644
index 0000000000..f8da483fe0
--- /dev/null
+++ b/modules/product/locale/lt.po
@@ -0,0 +1,998 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Prekės savikaina"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Dukterinės"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Pavadinimas"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Motininė"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Prekės"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Numatytasis savikainos metodas"
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Numeruotė"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Numeruotė"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Numatytasis savikainos metodas"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Savikaina"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Savikainos metodas"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Prekės šablonas"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Kodas"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Tipas"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Pardavimo kaina"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Prekės šablonas"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Kategorijos"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Kategorijos"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Kodas"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Vartojamoji"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Savikaina"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Savikainos metodas"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Savikainos skaičiavimo metodai"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Savikaina"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Savikainos"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "Numatytasis mato vienetas"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Numatytojo mato vieneto kategorija"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Aprašymas"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr "Identifikatoriai"
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Pardavimo kaina"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Pardavimo kaina"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Pardavimo kainos"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Pavadinimas"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Prekės šablonas"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Tipas"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Kategorijos"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Kategorijos"
+
+#, fuzzy
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Kodas"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Vartojamoji"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Savikaina"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Savikainos metodas"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Savikainos skaičiavimo metodai"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "Numatytasis mato vienetas"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Numatytojo mato vieneto kategorija"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Pardavimo kaina"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Pardavimo kainos"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Pavadinimas"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Variantai"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Tipas"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Kategorija"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Prekės šablonas"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Kategorija"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Prekės šablonas"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Kategorija"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Rodomų skaičių po kablelio skaičius"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Perskaičiavimo į pagrindinį mato vienetą koeficientas"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Pavadinimas"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Pagrindinio mato vieneto koeficientas"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Apvalinimo tikslumas"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Simbolis"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Pavadinimas"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Mato vienetai"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr "Šio identifikatoriaus aprašoma prekė."
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr "Pridėkite kitus prekės identifikatorius."
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr "Pridėkite kitus prekės identifikatorius."
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"Koeficientas formulei:\n"
+"koeficientas (pagrindinis vienetas) = 1 (šis mato vienetas)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"Koeficientas formulei:\n"
+"1 (bazinis vienetas) = koeficientas (šis vienetas)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Kategorijos"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Prekės"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Kategorijos"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variantai"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variantai"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Prekės pagal kategoriją"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Prekės"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Kategorijos"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Mato vienetai"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Prekės"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variantai"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Kategorijos"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Kategorijos"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variantai"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Prekės"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Kategorijos"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Mato vienetai"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Prekės kategorija"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Prekės nuostatos"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Numatytasis savikainos skaičiavimo būdas"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Prekės savikaina"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Prekės savikainos skaičiavimo būdas"
+
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Prekės identifikatorius"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Prekės kaina"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Prekės variantas"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Prekės šablonas"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Šablono kategorija"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Šablonas - visos kategorijos"
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Mato vienetas"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Aras"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Karatas"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "Centimetras"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Kubinis centimetras"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Kubinė pėda"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Kubinis colis"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Kubinis metras"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Diena"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Pėda"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Galonas"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gramas"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hektaras"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Valanda"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Colis"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogramas"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometras"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Litras"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Metras"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mylia"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimetras"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minutė"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Uncija"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Svaras"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Sekundė"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Kvadratins centimetras"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Kvadratinė pėda"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Kvadratinis colis"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Kvadratinis metras"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Kvadratinis jardas"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Vienetas"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Darbo diena"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Jardas"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "val"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "vnt"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "dd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Mato vienetas"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Ilgis"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Paviršius"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Laikas"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Vienetai"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Tūris"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Svoris"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Prekių valdymas"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr "Tarptautinis artikulas"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr "Tarptautinis saugumo numeris"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr "Tarptautinis standartinis audiovizualinis numeris"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr "Tarptautinis standartinis knygos numeris"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr "Tarptautinis standartinis bibliotekų identifikatorius"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr "Tarptautinis standartinis muzikos numeris"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Vidutinė"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Fiksuota"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Ilgalaikis turtas"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Prekės"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Paslaugos"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Vidutinė kaina"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fiksuota"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Ilgalaikis turtas"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Prekės"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Paslaugos"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Dukterinė"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Numeruotė"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Pagrindinis"
diff --git a/modules/product/locale/nl.po b/modules/product/locale/nl.po
new file mode 100644
index 0000000000..a3f39aca67
--- /dev/null
+++ b/modules/product/locale/nl.po
@@ -0,0 +1,1003 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Productprijs decimaal (kostprijs?)"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Onderliggende niveaus"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Producten"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Standaard kostenmethode"
+
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Variantsequentie"
+
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Productvolgorde"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Standaard kostenmethode"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Kostprijs"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Kostprijsmethode"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Sjabloon"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Catalogusprijs"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Sjabloon"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr "Code Alleen lezen"
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "verbruiksartikelen"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Kostprijs"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Kostprijsmethode"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Kostprijsmethode"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Kostprijs"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Kostprijs"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "Standaard maateenheid"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Standaard maateenheid-categorie"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "standaard maateenheid decimalen"
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Omschrijving"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr "identificaties"
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Catalogusprijs"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Catalogusprijs"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Catalogusprijs"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr "Code voorvoegsel"
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr "Achtervoegsel Code"
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Productsjabloon"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr "Code Alleen lezen"
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "verbruiksartikelen"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Kostprijs"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Kostprijsmethode"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Kostprijsmethode"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "Standaard ME"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Standaard maateenheid-categorie"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "standaard maateenheid decimalen"
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Catalogusprijs"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Catalogusprijs"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "varianten"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Sjabloon"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Sjabloon"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Zichtbare decimalen"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Faktor"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Verhouding"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Afronding"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Symbool"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Maateenheden"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr "Wordt gebruikt om structuur onder de categorie toe te voegen."
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr "Wordt gebruikt om structuur boven de categorie toe te voegen."
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "De standaard kostprijsmethode voor nieuwe producten."
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr "Wordt gebruikt om het laatste deel van de productcode te genereren."
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr "Wordt gebruikt om het eerste deel van de productcode te genereren."
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "De standaard kostprijsmethode voor nieuwe producten."
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr "Het product geïdentificeerd door de code."
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"De categorieën waarin het product zich bevindt.\n"
+"Gebruikt om soortgelijke producten te groeperen."
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr "Een unieke ID voor de variant."
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Vink deze optie aan om toe te staan dat voorraadbewegingen worden "
+"toegewezen, ongeacht het voorraadniveau."
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+"Het bedrag dat het kost om de variant aan te schaffen, te maken of de dienst"
+" uit te voeren."
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "De methode die wordt gebruikt om de kostprijs te berekenen."
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"De standaard maateenheid voor het product.\n"
+"Intern gebruikt bij het berekenen van de voorraadniveaus van goederen en activa."
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr "Andere ID's die aan de variant zijn gekoppeld."
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "De standaardprijs waarvoor het product wordt verkocht."
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr "De unieke ID voor het product (ook bekend als SKU)."
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+"Het product dat de gemeenschappelijke eigenschappen van de variant "
+"definieert."
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"De categorieën waarin het product zich bevindt.\n"
+"Gebruikt om soortgelijke producten te groeperen."
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Vink deze optie aan om toe te staan dat voorraadbewegingen worden "
+"toegewezen, ongeacht het voorraadniveau."
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+"Het bedrag dat het kost om de variant aan te schaffen, te maken of de dienst"
+" uit te voeren."
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "De methode die wordt gebruikt om de kostprijs te berekenen."
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"De standaard maateenheid voor het product.\n"
+"Intern gebruikt bij het berekenen van de voorraadniveaus van goederen en activa."
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "De standaardprijs waarvoor het product wordt verkocht."
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr "De verschillende varianten waarin het product geleverd wordt."
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+"De categorie die de maateenheid bevat.\n"
+"Conversies tussen verschillende maateenheden kunnen worden gedaan als ze in dezelfde categorie vallen."
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr "Het aantal cijfers dat moet worden weergegeven na het decimaalteken."
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"De coëfficiënt voor de formule:\n"
+"coëfficiënt (basiseenheid) = 1 (deze eenheid)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"De coëfficiënt voor deze formule:\n"
+"1(basiseenheid) = coëf (deze eenheid)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr "De nauwkeurigheid waarop waarden zijn afgerond."
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr "Het symbool dat de maateenheid vertegenwoordigt."
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Producten toevoegen"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categorieën"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "varianten"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "varianten"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Product per categorie"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Producten"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Maateenheden"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr "Het %(type)s \"%(code)s\" voor product \"%(product)s\" is niet geldig."
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr "Code van actief product moet uniek zijn."
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr "Onverenigbare factor en tarief op standaard maateenheid \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr "U kunt de standaardmaateenheidscategorie \"%(uom)s\" niet wijzigen."
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr "U kunt de factor maateenheid \"% (uom) s\" niet wijzigen."
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+"Als de maateenheid nog niet wordt gebruikt, kunt u deze verwijderen, anders "
+"kunt u deze deactiveren en een nieuwe maken."
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr "U kunt de waarde van de maateenheid \"%(uom)s\" niet wijzigen."
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr "De waarde en factor kunnen niet beiden gelijk zijn aan nul."
+
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Producten toevoegen"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "varianten"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapporten"
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Producten"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Maateenheden"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Product categorie"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Product configuratie"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Productconfiguratie Standaard kostprijsmethode"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Productkostprijs"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Product kostprijs methode"
+
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Product identificator"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Product prijs lijst"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Productvariant"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Productsjabloon"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Sjabloon - Categorie"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Sjabloon - Alle Categorieën"
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Maateenheden"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Karaat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Kubieke centimeter"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Kubieke voet"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Kubieke inch"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Kubieke meter"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Dag"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Voet"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Uur"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Inch"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mijl"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "ons"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Pond"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Seconde"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Vierkante centimeter"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Vierkante voet"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Vierkante inch"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Vierkante meter"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Vierkante yard"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Werkdag"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Categorie maateenheid"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Lengte"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Oppervlakte"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Tijd"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "eenheden"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Gewicht"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Productbeheer"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr "Internationaal artikelnummer"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr "internationaal veilighieds idendificatie nummer (ISIN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr "Internationaal standaard audiovisueel nummer"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr "Internationaal Standaard Boek Nummer (ISBN)"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr "Internationale standaardidentificatie voor bibliotheken"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr "Internationaal standaard muzieknummer"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Gemiddeld"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Vast"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Activa"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Goederen"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Diensten"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Gemiddeld"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Vast"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Activa"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Goederen"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Service"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Onderliggende niveaus"
+
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Reeksen"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Algemeen"
diff --git a/modules/product/locale/pl.po b/modules/product/locale/pl.po
new file mode 100644
index 0000000000..dcb97ae6c6
--- /dev/null
+++ b/modules/product/locale/pl.po
@@ -0,0 +1,1003 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Cena produktu po przecinku"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Kategorie podrzędne"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Kategoria nadrzędna"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Produkty"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Domyślna metoda kosztowa"
+
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Sekwencja wariantu produktu"
+
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Sekwencja produktu"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Domyślna metoda kosztowa"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Cena kosztów"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Metoda wyceny zapasów"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Szablon"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Kod"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Cena sprzedaży"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Szablon"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Kategorie"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Kategorie"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Kod"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr "Kod tylko do odczytu"
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Artykuły konsumpcyjne"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Cena kosztów"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Metoda wyceny zapasów"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Metody wyceny zapasów"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Cena kosztów"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Ceny kosztów"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "Domyślna jm"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Domyślna kategoria jm"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr "Identyfikatory"
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Cena sprzedaży"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Cena sprzedaży"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Ceny sprzedaży"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr "Prefiks kodu"
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr "Sufiks kodu"
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Szablon produktu"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Kategorie"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Kategorie"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Kod"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr "Kod tylko do odczytu"
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Artykuły konsumpcyjne"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Cena kosztów"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Metoda wyceny zapasów"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Metody wyceny zapasów"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "Domyślna jm"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Domyślna kategoria jm"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Cena sprzedaży"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Ceny sprzedaży"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Warianty"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Kategoria"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Szablon"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Kategoria"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Szablon"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Kategoria"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Cyfry wyświetlane"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Współczynnik"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Kurs"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Dokładność"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Symbol"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Jednostki miary"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr "Służy do dodawania struktury poniżej kategorii."
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr "Służy do dodawania struktury powyżej kategorii."
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "Domyślna metoda wyceny zapasów dla nowych produktów."
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr "Służy do generowania końcowej części kodu produktu."
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr "Służy do generowania początkowej części kodu produktu."
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "Domyślna metoda wyceny zapasów dla nowych produktów."
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr "Produkt identyfikowany kodem."
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Kategorie, do których należy produkt.\n"
+"Służy do grupowania razem podobnych produktów."
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr "Unikalny identyfikator wariantu."
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Zaznacz, aby zezwolić na przenoszenie zapasów niezależnie od poziomu "
+"zapasów."
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr "Koszt zakupu, wykonania wariantu produktu lub wykonania usługi."
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "Metoda użyta do obliczenia kosztu własnego."
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"Standardowa jednostka miary dla produktu.\n"
+"Używane wewnętrznie przy obliczaniu stanów magazynowych towarów i aktywów."
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr "Inne identyfikatory powiązane z wariantem produktu."
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "Standardowa cena, za jaką sprzedawany jest produkt."
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr "Unikalny identyfikator produktu (znany również jako SKU)."
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+"Produkt, który definiuje typowe właściwości dziedziczone przez wariant "
+"produktu."
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Kategorie, do których należy produkt.\n"
+"Służy do grupowania razem podobnych produktów."
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Zaznacz, aby zezwolić na przenoszenie zapasów niezależnie od poziomu "
+"zapasów."
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr "Koszt zakupu, wytworzenia produktu lub wykonania usługi."
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "Metoda użyta do obliczenia kosztu własnego."
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"Standardowa jednostka miary dla produktu.\n"
+"Używana przy obliczaniu stanów magazynowych towarów i aktywów."
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "Standardowa cena, za jaką sprzedawany jest produkt."
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr "Różne warianty produktu."
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+"Kategoria zawierająca jednostkę miary.\n"
+"Konwersje między różnymi jednostkami miary można dokonać, jeśli należą one do tej samej kategorii."
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr "Liczba cyfr po separatorze dziesiętnym."
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"Współczynnik dla wzoru:\n"
+"współczynnik (jednostka podstawowa) = 1 (ta jednostka)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"Współczynnik dla wzoru:\n"
+"1 (jednostka bazowa) = coef (ta jednostka)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr "Dokładność, z jaką wartości są zaokrąglane."
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr "Symbol reprezentujący jednostkę miary."
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Kategorie"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Produkty"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Kategorie"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Warianty"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Warianty"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Produkt wg kategorii"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Produkty"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Kategorie"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Jednostki miary"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr "%(type) s \"% (code) s” dla produktu \"% (product) s” jest nieprawidłowy."
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr "Kod aktywnego produktu musi być unikalny."
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+"Niezgodne wartości współczynnika i stawki w jednostce miary „% (uom) s”."
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr "Nie możesz modyfikować kategorii JM \"% (uom) s”."
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr "Nie możesz modyfikować kategorii JM \"% (uom) s”."
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+"Jeśli jednostka miary nadal nie jest używana, możesz ją usunąć, w przeciwnym"
+" razie możesz ją dezaktywować i utworzyć nową."
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr "Nie można modyfikować stawki jednostki miary \"% (uom) s”."
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr "Stawka i współczynnik nie mogą być równe zeru."
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Produkty"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Wariant"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Kategorie"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Kategorie"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Warianty"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Produkty"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Kategorie"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Jednostki miary"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Produkt wg kategorii"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Konfiguracja produktu"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Konfiguracja domyślnej metody wyceny zapasów"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Cena kosztów produktu"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Metoda wyceny zapasów produktów"
+
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Identyfikator produktu"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Cena sprzedaży produktu"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Wariant produktu"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Szablon produktu"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Szablon - Kategoria"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Szablon - Wszystkie kategorie"
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Jednostka miary"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Ar"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Karat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centymetr"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Centymetr sześcienny"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Stopa sześcienna"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Cal sześcienny"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Metr sześcienny"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Dzień"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Stopa"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Galon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hektar"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Godzina"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Cal"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometr"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Litr"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Metr"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mila"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Milimetr"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minuta"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Uncja"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Funt"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Sekunda"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Centymetr kwadratowy"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Stopa kwadratowa"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Cal kwadratowy"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Metr kwadratowy"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Jard kwadratowy"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Jednostka"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Dzień roboczy"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Jard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "szt."
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Kategoria jednostek miary"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Długość"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Powierzchnia"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Czas"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Sztuki"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Objętość"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Waga"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Administracja ustawieniami produktu"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr "Międzynarodowy numer artykułu"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr "Międzynarodowy numer identyfikacyjny papierów wartościowych"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr "Międzynarodowy Standardowy Numer Audiowizualny"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr "Międzynarodowy standardowy numer książki"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr "Międzynarodowy identyfikator standardu dla bibliotek"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr "Międzynarodowy standardowy numer muzyczny"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Średnia"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Stała"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Majątek"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Towar"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Usługa"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Średnia"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Stała"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Majątek"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Towar"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Usługa"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Kategorie podrzędne"
+
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Sekwencje"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Ogólne"
diff --git a/modules/product/locale/pt.po b/modules/product/locale/pt.po
new file mode 100644
index 0000000000..cf657c0676
--- /dev/null
+++ b/modules/product/locale/pt.po
@@ -0,0 +1,999 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Preço de Custo do Produto"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Filhos"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Pai"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Produtos"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Método de Custo Padrão"
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Modelo de produto"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Modelo de produto"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Método de Custo Padrão"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Preço de Custo"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Método de preço de custo"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Modelo"
+
+#, fuzzy
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Código"
+
+#, fuzzy
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Preço de tabela"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Modelo"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Categorias"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Categorias"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Consumível"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Preço de Custo"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Método do preço de custo"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Métodos dos preços de custo"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Preço de custo"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Preço de Custo"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "UDM padrão"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Categoria Padrão para UDM"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Descrição"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Preço de Tabela"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Preço de tabela"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Preços de tabela"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Modelo de produto"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Categorias"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Categorias"
+
+#, fuzzy
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Consumível"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Preço de custo"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Método do preço de custo"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Métodos dos preços de custo"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "UDM padrão"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Categoria padrão para UDM"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Preço de tabela"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Preços de tabela"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Variante"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Modelo"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Modelo"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Dígitos a exibir"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Fator"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Taxa"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Precisão para arredondamento"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Símbolo"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Nome"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Unidades de Medida"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"Coeficiente para a fórmula:\n"
+"coef (unidade de base) = 1 (esta unidade)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"Coeficiente para a fórmula:\n"
+"1 (unidade de base) = coef (esta unidade)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categorias"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Produtos"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categorias"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configuração"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variantes"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Produto por Categoria"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Produtos"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Categorias"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Unidades de Medida"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Produtos"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Variante"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categorias"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categorias"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuração"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variantes"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configuração"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Produtos"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categorias"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Unidades de Medida"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Categoria do produto"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Configuração do Produto"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Configuração do Produto Método de Preço de Custo Padrão"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Preço de Custo do Produto"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Método do preço de custo do produto"
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Modelo de produto"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Preço de Tabela do Produto"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Variante do Produto"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Modelo de produto"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Modelo - Categoria"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Modelo - Todas as Categorias"
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Unidade de Medida"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Quilate"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centímetro"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Centímetro cúbico"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Pé cúbico"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Polegada cúbica"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Metro cúbico"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Dia"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Pé"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Galão"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Grama"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hora"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Polegada"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Quilograma"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Quilômetro"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Litro"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Metro"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Milha"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Milímetro"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minuto"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Onça"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Libra"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Segundo"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Centímetro quadrado"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Pé quadrado"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Polegada quadrada"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Metro quadrado"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Jarda quadrada"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unidade"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Dia de trabalho"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Jarda"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "dt"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Unidade de Medida"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Comprimento"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Superfície"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Tempo"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Unidades"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Peso"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Administração de produtos"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Média"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Fixo"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Ativos"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Mercadorias"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Serviço"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Média"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fixo"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Ativos"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Mercadorias"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Serviço"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Filhos"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Modelo de produto"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Geral"
diff --git a/modules/product/locale/ro.po b/modules/product/locale/ro.po
new file mode 100644
index 0000000000..6a594165e4
--- /dev/null
+++ b/modules/product/locale/ro.po
@@ -0,0 +1,998 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Zecimale Preț Produs"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Copii"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Părinte"
+
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Produse"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Metoda cost implicit"
+
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Secvența produs"
+
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Secvența produs"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Metoda cost implicit"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Cost"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Metoda a pretului de cost"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Șablon"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Cod"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Lista de preturi"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Șablon"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Categorii"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Categorii"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Cod"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr "Cod numai pentru citit"
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Consumabil"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Cost"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Metoda a pretului de cost"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Metode Pret cost"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Cost"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Costuri"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "UM Implicita"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Categorie implicita al UM"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Zecimale Implicite al Unității"
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Descriere"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr "Identificatorii"
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Lista de preturi"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Lista de preturi"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Prețuri de lista"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr "Cod Prefix"
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr "Cod Suffix"
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Șablon Produs"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Categorii"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Categorii"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Cod"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr "Cod numai pentru citit"
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Consumabil"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Cost"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Metoda a pretului de cost"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Metode Pret cost"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "UM Implicita"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Categorie implicita al UM"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Zecimale Implicite al Unității"
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Lista de preturi"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Prețuri de lista"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Variante"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Șablon"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Șablon"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Afișare zecimale"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Factor"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Impozit"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Precizia rotunjire"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Simbol"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Unitați de masura"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr "Folosit pentru a adăuga structură sub categorie."
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr "Folosit pentru a adăuga structură deasupra categoriei."
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "Metoda implicita pentru costul produselor noi."
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr "Folosit pentru a genera codul produsului."
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr "Utilizat pentru a genera prima parte al codului produsului."
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "Metoda prețului de cost implicit pentru produsele noi."
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr "Produsul identificat prin cod."
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Categoriile în care se află produsul.\n"
+"Folosit pentru a grupa produse similare împreună."
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr "Un identificator unic pentru variantă."
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Bifați pentru a permite mișcari de stoc indiferent de nivelul stocului."
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+"Suma de cost pentru a achiziționa sau a produce varianta, sau a efectua "
+"serviciul."
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "Metoda utilizată pentru calcularea a costului."
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"Unitatea standard de măsură pentru produs.\n"
+"Folosit intern la calcularea nivelului stocului de bunuri și active."
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr "Alți identificatori asociați cu varianta."
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "Prețul standard la care se vinde produsul."
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr "Identificatorul unic pentru produs (adica SKU)."
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+"Produsul care defineşte proprietăţi comune care vor fi moştenite de "
+"varianta."
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"Categoriile în care se află produsul.\n"
+"Folosit pentru a grupa produse similare împreună."
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+"Bifați pentru a permite mișcari de stoc indiferent de nivelul stocului."
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+"Sumă care costă achiziţia sau producţia produsului, sau pentru a executa "
+"serviciul."
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "Metoda utilizată pentru calcularea a costului."
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"Unitatea standard de măsură pentru produs.\n"
+"Folosit intern la calcularea nivelului stocului de bunuri și active."
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "Prețul standard la care se vinde produsul."
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr "Variantele care există pentru acest produs."
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+"Categoria care conţine unitatea de măsură.\n"
+"Conversii între diferite unităţii de măsură pot fi efectuate dacă fac parte din acelaşi categorie."
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr "Numărul de cifre de afişat după zecimal."
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"Coeficientul al formulei.\n"
+"coeficient (unitate de bază) = 1 (din această unitate)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"Coeficientul pentru formulă:\n"
+"1 (unitate de bază) = coef. (această unitate)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr "Precizia la care sunt rotunjite valori."
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr "Simbolul care reprezintă unitatea de măsură."
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categorii"
+
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Adăugare Produse"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categorii"
+
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configurare"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variante"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variante"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Produs în Categorie"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Produse"
+
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Categorii"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Unități de Măsura"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr "%(type)s \"%(code)s\" nu este valabil pentru produsul \"%(product)s\"."
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr "Codul al unui produs activ trebuie să fie unic."
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr "Factor şi rata incompatibil pentru UM \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr "Nu se poate modifică categorie de UM \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr "Nu se poate modifică factorul al Unitaţii de Masură \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+"Dacă UM nu este utilizată se poate şterge, altfel se poate dezactiva în "
+"vedere creării unei noi UM."
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr "Nu se poate modifică rate al UM \"%(uom)s\"."
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr "Rata şi factor nu pot ambele sa fii egale cu zero."
+
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Adăugare Produse"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Varianta"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categorii"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categorii"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configurare"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variante"
+
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configurare"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Raportare"
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Produse"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categorii"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Unitați de masura"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Categorie de Produse"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Configurare Produs"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Configurare de Produs Metodă Implicită pentru Cost"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Cost al Produsului"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Metodă Cost al Produsului"
+
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Identificator Produs"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Preţ de Lista Produs"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Varianta Produs"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Șablon Produs"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Şablon - Categorie"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Şablon - Categorie Toate"
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Unitați de masura"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Sunt"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Carat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimetru"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Centimetru cub"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Picior cub"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Țol cub"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Metru cub"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Zi"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Picior"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Galon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectar"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Ora"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Țol"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometru"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Litru"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Metru"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Milă"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Milimetru"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minut"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Uncie"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Livră"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Secunda"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Centimetru pătrat"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Picior Pătrat"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Ţol Pătrat"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Metru patrat"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Iard Pătrat"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unitate"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Zi de lucru"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Iard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "buc"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Unitați de masura"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Lungime"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Suprafața"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Timp"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Unitați"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volum"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Greutate"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Administrare Produs"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr "Cod International Articol"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Mediu"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Active"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Marfa"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Serviciu"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Mediu"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Active"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Marfa"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Serviciu"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Copii"
+
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Secvențe"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "General"
diff --git a/modules/product/locale/ru.po b/modules/product/locale/ru.po
new file mode 100644
index 0000000000..7f8136634f
--- /dev/null
+++ b/modules/product/locale/ru.po
@@ -0,0 +1,1110 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Вид продукта"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Подчиненные"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Предок"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Products"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Шаблон продукта"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Шаблон продукта"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr ""
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Себестоимость"
+
+#, fuzzy
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Продукция"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Шаблон"
+
+#, fuzzy
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Код"
+
+#, fuzzy
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Продукция"
+
+#, fuzzy
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Тип"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Цена"
+
+#, fuzzy
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Шаблон"
+
+#, fuzzy
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Категории"
+
+#, fuzzy
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Код"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Потребляемый"
+
+#, fuzzy
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Себестоимость"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Себестоимость"
+
+#, fuzzy
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Себестоимость"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "Ед.измерения по умолчанию"
+
+#, fuzzy
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Категория ед.измерения по умолчанию"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Цена"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Цена"
+
+#, fuzzy
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Цена"
+
+#, fuzzy
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Шаблон продукта"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Тип"
+
+#, fuzzy
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Категории"
+
+#, fuzzy
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Категории"
+
+#, fuzzy
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Код"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Потребляемый"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Себестоимость"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "Ед.измерения по умолчанию"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Категория ед.измерения по умолчанию"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Цена"
+
+#, fuzzy
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Цена"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Разновидности"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Тип"
+
+#, fuzzy
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Категория"
+
+#, fuzzy
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Шаблон"
+
+#, fuzzy
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Категория"
+
+#, fuzzy
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Шаблон"
+
+#, fuzzy
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Категория ед. измерения"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Кол-во знаков после запятой"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Коэффициент к основной единице"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Коэфициент основной единицы"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Точность округления"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Условное обозначение"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"Коэффициент по формуле:\n"
+"коэффициент в этом поле (базовая единица) = 1 (этой ед. измерения)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"Коэффициент по формуле:\n"
+"1 (базовая единица) = коэффициенту (этой ед.измерения)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Конфигурация"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Разновидности"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Product by Category"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Категории"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Разновидности"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Продукция"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Конфигурация"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Product"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Конфигурация"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Категория продукции"
+
+#, fuzzy
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Product Configuration"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr ""
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Шаблон продукта"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr ""
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Вид продукта"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Шаблон продукта"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr ""
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Единица измерения"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Carat"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Cubic centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Cubic foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Cubic inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Cubic meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Day"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hour"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mile"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Ounce"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Pound"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Second"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Square centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Square foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Square inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Square meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Square yard"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unit"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Work Day"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "фунт"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Единица измерения"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Length"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Surface"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Time"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Units"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Weight"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Product Administration"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Средняя цена"
+
+#, fuzzy
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Фиксированная цена"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Активы"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Товары"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Услуги"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Средняя цена"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Фиксированная цена"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Активы"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Товары"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Услуги"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Подчиненные"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Шаблон продукта"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Основные"
diff --git a/modules/product/locale/sl.po b/modules/product/locale/sl.po
new file mode 100644
index 0000000000..b06d600a05
--- /dev/null
+++ b/modules/product/locale/sl.po
@@ -0,0 +1,1062 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Nabavna cena izdelka"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Podkategorije"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "Matična kategorija"
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Products"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Privzeti obračun"
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Predloga"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Predloga"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Privzeti obračun"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Nabavna cena"
+
+#, fuzzy
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Predloga"
+
+#, fuzzy
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Šifra"
+
+#, fuzzy
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Prodajna cena"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Predloga"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Kategorije"
+
+#, fuzzy
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Kategorije"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Šifra"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Potrošni material"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Nabavna cena"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Nabavna cena"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Nabavne cene"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "Privzeta ME"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Privzeta kategorija ME"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Prodajna cena"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Prodajna cena"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Prodajne cene"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Predloga"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Kategorije"
+
+#, fuzzy
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Kategorije"
+
+#, fuzzy
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Šifra"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Potrošni material"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Nabavna cena"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr ""
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr ""
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "Privzeta ME"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Privzeta kategorija ME"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Prodajna cena"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Prodajne cene"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Različice"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Kategorija"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Predloga"
+
+#, fuzzy
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Kategorija"
+
+#, fuzzy
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Predloga"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Kategorija"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "Decimalke"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Faktor"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "Razmerje"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "Zaokroževanje"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "Simbol"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Naziv"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"Koeficient za formulo:\n"
+"koef * (osnovna enota) = 1 (ta enota)"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"Koeficient za formulo:\n"
+"1 (osnovna enota) = koef * (ta enota)"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Product by Category"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Kategorije"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Različice"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Product"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Units of Measure"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Kategorija izdelkov"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Konfiguracija izdelkov"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "Konfiguracija privzetega obračuna nabavne cene"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Nabavna cena izdelka"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Predloga"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Prodajna cena izdelka"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Različica"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Predloga izdelka"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Predloga - Kategorija"
+
+#, fuzzy
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Predloga - Kategorija"
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Merska enota"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Carat"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Cubic centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Cubic foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Cubic inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Cubic meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Day"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hour"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mile"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Ounce"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Pound"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Second"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Square centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Square foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Square inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Square meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Square yard"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unit"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Work Day"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Merska enota"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Length"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Surface"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Time"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Units"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Weight"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Product Administration"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Povprečna cena"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Fiksna"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Osnovna sredstva"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Blago"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Storitev"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Povprečna cena"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Fiksna"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Osnovna sredstva"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Blago"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Storitev"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Podkategorije"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Predloga"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Splošno"
diff --git a/modules/product/locale/tr.po b/modules/product/locale/tr.po
new file mode 100644
index 0000000000..d1d29a47f9
--- /dev/null
+++ b/modules/product/locale/tr.po
@@ -0,0 +1,1050 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "Ürün Maliyet Fiyatı"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "Alt Öğe"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "Ad"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "Products"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Varsayılan Maliyet Metodu"
+
+#, fuzzy
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "Ürün Şablonu"
+
+#, fuzzy
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "Ürün Şablonu"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "Varsayılan Maliyet Metodu"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "Şirket"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "Maliyet Bedeli"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "Ürün"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "Şirket"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Maliyet Bedeli Metodu"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "Şablon"
+
+#, fuzzy
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "Kod"
+
+#, fuzzy
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "Ürün"
+
+#, fuzzy
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "Şirket"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "Liste Fiyatı"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "Şablon"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "Kategoriler"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "Kategoriler"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "Kod"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "Sarf Malzemesi"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "Maliyet Bedeli"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Maliyet Bedeli Metodu"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Maliyet Bedeli Metodları"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "Maliyet Bedeli"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "Maliyet Bedelleri"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "Varsayılam Ölçüm Birimi"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Varsayılan Ölçüm Birim Kategorisi"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "Tanım"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr ""
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "Liste Fiyatı"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "Liste Fiyatı"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "Liste Fiyatları"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "Ad"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr ""
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr ""
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "Ürün Şablonu"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "Kategoriler"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "Kategoriler"
+
+#, fuzzy
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "Kod"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr ""
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "Sarf Malzemesi"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "Maliyet Bedeli"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "Maliyet Bedeli Methodu"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "Maliyet Bedeli Metodları"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "Varsayılan Ölçü Birimi"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "Varsayılan Ölçü Birimi Kategorisi"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "Liste Fiyatı"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "Liste Fiyatları"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "Ad"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "Varyantlar"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "Taslak"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "Taslak"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr ""
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "Faktör"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "Ad"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr ""
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr ""
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr ""
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "Ad"
+
+#, fuzzy
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "Ölçü birimi"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr ""
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr ""
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr ""
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr ""
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr ""
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr ""
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr ""
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr ""
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr ""
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr ""
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr ""
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr ""
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr ""
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr ""
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr ""
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr ""
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "Ürün ölçüm birimi kategorisi "
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "Kategoriler"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "Ölçü birimi"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "Varyantlar"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "Ürün"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "Product"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "Variants"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "Ölçü birimi"
+
+#, fuzzy
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "Ürün ölçüm birimi kategorisi "
+
+#, fuzzy
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "Product Configuration"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr ""
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "Ürün Maliyet Fiyatı"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "Ürün Maliyet Fiyat Metodu"
+
+#, fuzzy
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "Ürün Şablonu"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "Ürün Liste Fiyatı"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "Ürün Varyant"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "Ürün Taslağı"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "Taslak - Kategori"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "Taslak - Tüm Kategori"
+
+#, fuzzy
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "Ölçü birimi"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "Are"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "Carat"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "Cubic centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "Cubic foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "Cubic inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "Cubic meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "Day"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "Foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "Gallon"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "Gram"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "Hectare"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "Hour"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "Inch"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "Kilogram"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "Kilometer"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "Liter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "Meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "Mile"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "Millimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "Minute"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "Ounce"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "Pound"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "Second"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "Square centimeter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "Square foot"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "Square inch"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "Square meter"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "Square yard"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "Unit"
+
+#, fuzzy
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "Work Day"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "Yard"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+#, fuzzy
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "Ölçü birimi"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "Length"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "Surface"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "Time"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "Units"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "Volume"
+
+#, fuzzy
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "Weight"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "Product Administration"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr ""
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr ""
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "Ortalama"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "Sabitlenmiş"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "Varlıklar"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "Mallar"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "Servis"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "Ortalama"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "Sabitlenmiş"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "Varlıklar"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "Mallar"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "Servis"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "Alt Öğe"
+
+#, fuzzy
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "Ürün Şablonu"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "Genel"
diff --git a/modules/product/locale/zh_CN.po b/modules/product/locale/zh_CN.po
new file mode 100644
index 0000000000..3ce6abcde7
--- /dev/null
+++ b/modules/product/locale/zh_CN.po
@@ -0,0 +1,991 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:ir.configuration,product_price_decimal:"
+msgid "Product Price Decimal"
+msgstr "产品价格小数"
+
+msgctxt "field:product.category,childs:"
+msgid "Children"
+msgstr "子类别"
+
+msgctxt "field:product.category,name:"
+msgid "Name"
+msgstr "名称"
+
+msgctxt "field:product.category,parent:"
+msgid "Parent"
+msgstr "父类别"
+
+msgctxt "field:product.category,templates:"
+msgid "Products"
+msgstr "产品"
+
+msgctxt "field:product.configuration,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "默认的成本法"
+
+msgctxt "field:product.configuration,product_sequence:"
+msgid "Variant Sequence"
+msgstr "产品变体序列"
+
+msgctxt "field:product.configuration,template_sequence:"
+msgid "Product Sequence"
+msgstr "产品序列"
+
+msgctxt ""
+"field:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "Default Cost Method"
+msgstr "默认的成本法"
+
+msgctxt "field:product.cost_price,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:product.cost_price,cost_price:"
+msgid "Cost Price"
+msgstr "成本价"
+
+msgctxt "field:product.cost_price,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:product.cost_price_method,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:product.cost_price_method,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "成本价法"
+
+msgctxt "field:product.cost_price_method,template:"
+msgid "Template"
+msgstr "模板"
+
+msgctxt "field:product.identifier,code:"
+msgid "Code"
+msgstr "代码"
+
+msgctxt "field:product.identifier,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:product.identifier,type:"
+msgid "Type"
+msgstr "类型"
+
+msgctxt "field:product.list_price,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:product.list_price,list_price:"
+msgid "List Price"
+msgstr "定价"
+
+msgctxt "field:product.list_price,template:"
+msgid "Template"
+msgstr "模板"
+
+msgctxt "field:product.product,categories:"
+msgid "Categories"
+msgstr "类别"
+
+msgctxt "field:product.product,categories_all:"
+msgid "Categories"
+msgstr "类别"
+
+msgctxt "field:product.product,code:"
+msgid "Code"
+msgstr "代码"
+
+msgctxt "field:product.product,code_readonly:"
+msgid "Code Readonly"
+msgstr "只读代码"
+
+msgctxt "field:product.product,consumable:"
+msgid "Consumable"
+msgstr "消耗品"
+
+msgctxt "field:product.product,cost_price:"
+msgid "Cost Price"
+msgstr "成本价"
+
+msgctxt "field:product.product,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "成本价法"
+
+msgctxt "field:product.product,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "成本价法"
+
+msgctxt "field:product.product,cost_price_uom:"
+msgid "Cost Price"
+msgstr "成本价"
+
+msgctxt "field:product.product,cost_prices:"
+msgid "Cost Prices"
+msgstr "成本价"
+
+msgctxt "field:product.product,default_uom:"
+msgid "Default UOM"
+msgstr "默认计量单位"
+
+msgctxt "field:product.product,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "默认计量单位类别"
+
+msgctxt "field:product.product,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "默认计量单位有效数字"
+
+msgctxt "field:product.product,description:"
+msgid "Description"
+msgstr "描述"
+
+msgctxt "field:product.product,identifiers:"
+msgid "Identifiers"
+msgstr "标识"
+
+msgctxt "field:product.product,list_price:"
+msgid "List Price"
+msgstr "定价"
+
+msgctxt "field:product.product,list_price_uom:"
+msgid "List Price"
+msgstr "定价"
+
+msgctxt "field:product.product,list_prices:"
+msgid "List Prices"
+msgstr "定价"
+
+msgctxt "field:product.product,name:"
+msgid "Name"
+msgstr "名称"
+
+msgctxt "field:product.product,prefix_code:"
+msgid "Prefix Code"
+msgstr "前缀代码"
+
+msgctxt "field:product.product,suffix_code:"
+msgid "Suffix Code"
+msgstr "后缀代码"
+
+msgctxt "field:product.product,template:"
+msgid "Product Template"
+msgstr "产品模板"
+
+msgctxt "field:product.product,type:"
+msgid "Type"
+msgstr "类型"
+
+msgctxt "field:product.template,categories:"
+msgid "Categories"
+msgstr "类别"
+
+msgctxt "field:product.template,categories_all:"
+msgid "Categories"
+msgstr "类别"
+
+msgctxt "field:product.template,code:"
+msgid "Code"
+msgstr "代码"
+
+msgctxt "field:product.template,code_readonly:"
+msgid "Code Readonly"
+msgstr "代码(只读)"
+
+msgctxt "field:product.template,consumable:"
+msgid "Consumable"
+msgstr "消耗品"
+
+msgctxt "field:product.template,cost_price:"
+msgid "Cost Price"
+msgstr "成本价"
+
+msgctxt "field:product.template,cost_price_method:"
+msgid "Cost Price Method"
+msgstr "成本价法"
+
+msgctxt "field:product.template,cost_price_methods:"
+msgid "Cost Price Methods"
+msgstr "成本价法"
+
+msgctxt "field:product.template,default_uom:"
+msgid "Default UOM"
+msgstr "默认计量单位"
+
+msgctxt "field:product.template,default_uom_category:"
+msgid "Default UOM Category"
+msgstr "默认计量单位类别"
+
+msgctxt "field:product.template,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "默认计量单位有效数字"
+
+msgctxt "field:product.template,list_price:"
+msgid "List Price"
+msgstr "定价"
+
+msgctxt "field:product.template,list_prices:"
+msgid "List Prices"
+msgstr "定价"
+
+msgctxt "field:product.template,name:"
+msgid "Name"
+msgstr "名称"
+
+msgctxt "field:product.template,products:"
+msgid "Variants"
+msgstr "变体"
+
+msgctxt "field:product.template,type:"
+msgid "Type"
+msgstr "类型"
+
+msgctxt "field:product.template-product.category,category:"
+msgid "Category"
+msgstr "类别"
+
+msgctxt "field:product.template-product.category,template:"
+msgid "Template"
+msgstr "模板"
+
+msgctxt "field:product.template-product.category.all,category:"
+msgid "Category"
+msgstr "类别"
+
+msgctxt "field:product.template-product.category.all,template:"
+msgid "Template"
+msgstr "模板"
+
+msgctxt "field:product.uom,category:"
+msgid "Category"
+msgstr "类别"
+
+msgctxt "field:product.uom,digits:"
+msgid "Display Digits"
+msgstr "显示数位"
+
+msgctxt "field:product.uom,factor:"
+msgid "Factor"
+msgstr "换算因子"
+
+msgctxt "field:product.uom,name:"
+msgid "Name"
+msgstr "名称"
+
+msgctxt "field:product.uom,rate:"
+msgid "Rate"
+msgstr "换算率"
+
+msgctxt "field:product.uom,rounding:"
+msgid "Rounding Precision"
+msgstr "舍入精度"
+
+msgctxt "field:product.uom,symbol:"
+msgid "Symbol"
+msgstr "符号"
+
+msgctxt "field:product.uom.category,name:"
+msgid "Name"
+msgstr "名称"
+
+msgctxt "field:product.uom.category,uoms:"
+msgid "Units of Measure"
+msgstr "计量单位"
+
+msgctxt "help:product.category,childs:"
+msgid "Used to add structure below the category."
+msgstr "用于在类别下面添加结构."
+
+msgctxt "help:product.category,parent:"
+msgid "Used to add structure above the category."
+msgstr "用于在类别上面添加结构."
+
+msgctxt "help:product.configuration,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "新产品默认使用的成本价格方法."
+
+msgctxt "help:product.configuration,product_sequence:"
+msgid "Used to generate the last part of the product code."
+msgstr "用于生成产品代码的最后一部分."
+
+msgctxt "help:product.configuration,template_sequence:"
+msgid "Used to generate the first part of the product code."
+msgstr "用于生成产品代码的第一部分."
+
+msgctxt ""
+"help:product.configuration.default_cost_price_method,default_cost_price_method:"
+msgid "The default cost price method for new products."
+msgstr "新产品默认使用的成本价格方法."
+
+msgctxt "help:product.identifier,product:"
+msgid "The product identified by the code."
+msgstr "此代码标识的产品."
+
+msgctxt "help:product.product,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"产品所属类别.\n"
+"用于将类似的产品聚在一组."
+
+msgctxt "help:product.product,code:"
+msgid "A unique identifier for the variant."
+msgstr "变体的唯一标识符."
+
+msgctxt "help:product.product,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr "选中此项后,将允许不考虑库存水平的情况下,分配库存移动."
+
+msgctxt "help:product.product,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the variant, or carry out the "
+"service."
+msgstr "购买或制作产品变体或执行服务所需的费用."
+
+msgctxt "help:product.product,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "用于计算成本价的方法."
+
+msgctxt "help:product.product,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"产品的标准计量单位.\n"
+"在计算货物和资产的库存水平时内部使用."
+
+msgctxt "help:product.product,identifiers:"
+msgid "Other identifiers associated with the variant."
+msgstr "变体的其它标识符."
+
+msgctxt "help:product.product,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "产品销售的标准价格."
+
+msgctxt "help:product.product,suffix_code:"
+msgid "The unique identifier for the product (aka SKU)."
+msgstr "产品的唯一标识符(也称为SKU)."
+
+msgctxt "help:product.product,template:"
+msgid ""
+"The product that defines the common properties inherited by the variant."
+msgstr "用来定义公共属性的产品,这些公共属性会被产品的变体继承."
+
+msgctxt "help:product.template,categories:"
+msgid ""
+"The categories that the product is in.\n"
+"Used to group similar products together."
+msgstr ""
+"产品所属类别.\n"
+"用来将类似的产品分组."
+
+msgctxt "help:product.template,consumable:"
+msgid "Check to allow stock moves to be assigned regardless of stock level."
+msgstr "选中此项后,将允许在不考虑库存水平的情况下,分配库存移动."
+
+msgctxt "help:product.template,cost_price:"
+msgid ""
+"The amount it costs to purchase or make the product, or carry out the "
+"service."
+msgstr "购买或制造产品或提供服务所需的费用."
+
+msgctxt "help:product.template,cost_price_method:"
+msgid "The method used to calculate the cost price."
+msgstr "用于计算成本价的方法."
+
+msgctxt "help:product.template,default_uom:"
+msgid ""
+"The standard unit of measure for the product.\n"
+"Used internally when calculating the stock levels of goods and assets."
+msgstr ""
+"产品标准计量单位.\n"
+"在计算货物和资产的库存水平时内部使用."
+
+msgctxt "help:product.template,list_price:"
+msgid "The standard price the product is sold at."
+msgstr "产品销售的标准价格."
+
+msgctxt "help:product.template,products:"
+msgid "The different variants the product comes in."
+msgstr "产品不同变体."
+
+msgctxt "help:product.uom,category:"
+msgid ""
+"The category that contains the unit of measure.\n"
+"Conversions between different units of measure can be done if they are in the same category."
+msgstr ""
+"计量单位类别.\n"
+"属于同类别的计量单位之间可以相互转换."
+
+msgctxt "help:product.uom,digits:"
+msgid "The number of digits to display after the decimal separator."
+msgstr "小数点后显示的数字位数."
+
+msgctxt "help:product.uom,factor:"
+msgid ""
+"The coefficient for the formula:\n"
+"coefficient (base unit) = 1 (this unit)"
+msgstr ""
+"公式系数:\n"
+"系数 X 基本单位 = 1 X 当前单位"
+
+msgctxt "help:product.uom,rate:"
+msgid ""
+"The coefficient for the formula:\n"
+"1 (base unit) = coef (this unit)"
+msgstr ""
+"换算公式的系数:\n"
+"1 X 基本单位 = 系数 X 当前单位"
+
+msgctxt "help:product.uom,rounding:"
+msgid "The accuracy to which values are rounded."
+msgstr "四舍五入精度."
+
+msgctxt "help:product.uom,symbol:"
+msgid "The symbol that represents the unit of measure."
+msgstr "表示计量单位的符号."
+
+msgctxt "model:ir.action,name:act_category_list"
+msgid "Categories"
+msgstr "类别"
+
+msgctxt "model:ir.action,name:act_category_product"
+msgid "Add products"
+msgstr "添加产品"
+
+msgctxt "model:ir.action,name:act_category_tree"
+msgid "Categories"
+msgstr "类别"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_configuration_form"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.action,name:act_product_form"
+msgid "Variants"
+msgstr "变体"
+
+msgctxt "model:ir.action,name:act_product_from_template"
+msgid "Variants"
+msgstr "变体"
+
+msgctxt "model:ir.action,name:act_template_by_category"
+msgid "Product by Category"
+msgstr "按类别划分的产品"
+
+msgctxt "model:ir.action,name:act_template_form"
+msgid "Products"
+msgstr "产品"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_uom_category_form"
+msgid "Categories"
+msgstr "类别"
+
+msgctxt "model:ir.action,name:act_uom_form"
+msgid "Units of Measure"
+msgstr "计量单位"
+
+msgctxt "model:ir.message,text:msg_invalid_code"
+msgid "The %(type)s \"%(code)s\" for product \"%(product)s\" is not valid."
+msgstr "%(type)s \"%(code)s\" 对产品 \"%(product)s\" 是无效的."
+
+msgctxt "model:ir.message,text:msg_product_code_unique"
+msgid "Code of active product must be unique."
+msgstr "已启用产品的代码不能重复."
+
+msgctxt "model:ir.message,text:msg_uom_incompatible_factor_rate"
+msgid "Incompatible factor and rate values on UOM \"%(uom)s\"."
+msgstr "与计量单位 \"%(uom)s\" 不兼容的换算因子和换算率."
+
+msgctxt "model:ir.message,text:msg_uom_modify_category"
+msgid "You cannot modify the category of UOM \"%(uom)s\"."
+msgstr "你不能改变计量单位 \"%(uom)s\" 的类别."
+
+msgctxt "model:ir.message,text:msg_uom_modify_factor"
+msgid "You cannot modify the factor of UOM \"%(uom)s\"."
+msgstr "你不能编辑计量单位 \"%(uom)s\" 的换算因子."
+
+msgctxt "model:ir.message,text:msg_uom_modify_options"
+msgid ""
+"If the UOM is still not used, you can delete it otherwise you can deactivate"
+" it and create a new one."
+msgstr "如果计量单位一直没有使用过,你可以删除。否则你可以停用它并且新建一个。"
+
+msgctxt "model:ir.message,text:msg_uom_modify_rate"
+msgid "You cannot modify the rate of UOM \"%(uom)s\"."
+msgstr "你不能修改计量单位 \"%(uom)s\" 的换算率."
+
+msgctxt "model:ir.message,text:msg_uom_no_zero_factor_rate"
+msgid "Rate and factor can not be both equal to zero."
+msgstr "换算率和换算因子不能同时为零."
+
+msgctxt "model:ir.model.button,string:category_add_products_button"
+msgid "Add products"
+msgstr "添加产品"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_product"
+msgid "Variant"
+msgstr "变体"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_template"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "model:ir.ui.menu,name:menu_category_list"
+msgid "Categories"
+msgstr "类别"
+
+msgctxt "model:ir.ui.menu,name:menu_category_tree"
+msgid "Categories"
+msgstr "类别"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.ui.menu,name:menu_main_product"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "model:ir.ui.menu,name:menu_product"
+msgid "Variants"
+msgstr "变体"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_configuration"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_template"
+msgid "Products"
+msgstr "产品设置"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_category_form"
+msgid "Categories"
+msgstr "类别"
+
+msgctxt "model:ir.ui.menu,name:menu_uom_form"
+msgid "Units of Measure"
+msgstr "计量单位"
+
+msgctxt "model:product.category,name:"
+msgid "Product Category"
+msgstr "按类别划分的产品"
+
+msgctxt "model:product.configuration,name:"
+msgid "Product Configuration"
+msgstr "产品设置"
+
+msgctxt "model:product.configuration.default_cost_price_method,name:"
+msgid "Product Configuration Default Cost Price Method"
+msgstr "产品设置 - 默认的成本价法"
+
+msgctxt "model:product.cost_price,name:"
+msgid "Product Cost Price"
+msgstr "产品成本价"
+
+msgctxt "model:product.cost_price_method,name:"
+msgid "Product Cost Price Method"
+msgstr "产品成本价法"
+
+msgctxt "model:product.identifier,name:"
+msgid "Product Identifier"
+msgstr "产品标识"
+
+msgctxt "model:product.list_price,name:"
+msgid "Product List Price"
+msgstr "产品定价"
+
+msgctxt "model:product.product,name:"
+msgid "Product Variant"
+msgstr "产品变体"
+
+msgctxt "model:product.template,name:"
+msgid "Product Template"
+msgstr "产品模板"
+
+msgctxt "model:product.template-product.category,name:"
+msgid "Template - Category"
+msgstr "模板 - 类别"
+
+msgctxt "model:product.template-product.category.all,name:"
+msgid "Template - Category All"
+msgstr "模板 -所有类别"
+
+msgctxt "model:product.uom,name:"
+msgid "Unit of Measure"
+msgstr "计量单位"
+
+msgctxt "model:product.uom,name:uom_are"
+msgid "Are"
+msgstr "公亩"
+
+msgctxt "model:product.uom,name:uom_carat"
+msgid "Carat"
+msgstr "克拉"
+
+msgctxt "model:product.uom,name:uom_centimeter"
+msgid "centimeter"
+msgstr "厘米"
+
+msgctxt "model:product.uom,name:uom_cubic_centimeter"
+msgid "Cubic centimeter"
+msgstr "立方厘米"
+
+msgctxt "model:product.uom,name:uom_cubic_foot"
+msgid "Cubic foot"
+msgstr "立方英尺"
+
+msgctxt "model:product.uom,name:uom_cubic_inch"
+msgid "Cubic inch"
+msgstr "立方英寸"
+
+msgctxt "model:product.uom,name:uom_cubic_meter"
+msgid "Cubic meter"
+msgstr "立方米"
+
+msgctxt "model:product.uom,name:uom_day"
+msgid "Day"
+msgstr "天"
+
+msgctxt "model:product.uom,name:uom_foot"
+msgid "Foot"
+msgstr "英尺"
+
+msgctxt "model:product.uom,name:uom_gallon"
+msgid "Gallon"
+msgstr "加仑"
+
+msgctxt "model:product.uom,name:uom_gram"
+msgid "Gram"
+msgstr "加仑"
+
+msgctxt "model:product.uom,name:uom_hectare"
+msgid "Hectare"
+msgstr "公顷"
+
+msgctxt "model:product.uom,name:uom_hour"
+msgid "Hour"
+msgstr "小时"
+
+msgctxt "model:product.uom,name:uom_inch"
+msgid "Inch"
+msgstr "英寸"
+
+msgctxt "model:product.uom,name:uom_kilogram"
+msgid "Kilogram"
+msgstr "千克"
+
+msgctxt "model:product.uom,name:uom_kilometer"
+msgid "Kilometer"
+msgstr "千米"
+
+msgctxt "model:product.uom,name:uom_liter"
+msgid "Liter"
+msgstr "公升"
+
+msgctxt "model:product.uom,name:uom_meter"
+msgid "Meter"
+msgstr "米"
+
+msgctxt "model:product.uom,name:uom_mile"
+msgid "Mile"
+msgstr "英里"
+
+msgctxt "model:product.uom,name:uom_millimeter"
+msgid "Millimeter"
+msgstr "毫米"
+
+msgctxt "model:product.uom,name:uom_minute"
+msgid "Minute"
+msgstr "分钟"
+
+msgctxt "model:product.uom,name:uom_ounce"
+msgid "Ounce"
+msgstr "盎司"
+
+msgctxt "model:product.uom,name:uom_pound"
+msgid "Pound"
+msgstr "英镑"
+
+msgctxt "model:product.uom,name:uom_second"
+msgid "Second"
+msgstr "秒钟"
+
+msgctxt "model:product.uom,name:uom_square_centimeter"
+msgid "Square centimeter"
+msgstr "平方厘米"
+
+msgctxt "model:product.uom,name:uom_square_foot"
+msgid "Square foot"
+msgstr "平方英尺"
+
+msgctxt "model:product.uom,name:uom_square_inch"
+msgid "Square inch"
+msgstr "平方英寸"
+
+msgctxt "model:product.uom,name:uom_square_meter"
+msgid "Square meter"
+msgstr "平方米"
+
+msgctxt "model:product.uom,name:uom_square_yard"
+msgid "Square yard"
+msgstr "平方码"
+
+msgctxt "model:product.uom,name:uom_unit"
+msgid "Unit"
+msgstr "单位"
+
+msgctxt "model:product.uom,name:uom_work_day"
+msgid "Work Day"
+msgstr "工作日"
+
+msgctxt "model:product.uom,name:uom_yard"
+msgid "Yard"
+msgstr "码"
+
+msgctxt "model:product.uom,symbol:uom_are"
+msgid "a"
+msgstr "a"
+
+msgctxt "model:product.uom,symbol:uom_carat"
+msgid "c"
+msgstr "c"
+
+msgctxt "model:product.uom,symbol:uom_centimeter"
+msgid "cm"
+msgstr "cm"
+
+msgctxt "model:product.uom,symbol:uom_cubic_centimeter"
+msgid "cm³"
+msgstr "cm³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_foot"
+msgid "ft³"
+msgstr "ft³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_inch"
+msgid "in³"
+msgstr "in³"
+
+msgctxt "model:product.uom,symbol:uom_cubic_meter"
+msgid "m³"
+msgstr "m³"
+
+msgctxt "model:product.uom,symbol:uom_day"
+msgid "d"
+msgstr "d"
+
+msgctxt "model:product.uom,symbol:uom_foot"
+msgid "ft"
+msgstr "ft"
+
+msgctxt "model:product.uom,symbol:uom_gallon"
+msgid "gal"
+msgstr "gal"
+
+msgctxt "model:product.uom,symbol:uom_gram"
+msgid "g"
+msgstr "g"
+
+msgctxt "model:product.uom,symbol:uom_hectare"
+msgid "ha"
+msgstr "ha"
+
+msgctxt "model:product.uom,symbol:uom_hour"
+msgid "h"
+msgstr "h"
+
+msgctxt "model:product.uom,symbol:uom_inch"
+msgid "in"
+msgstr "in"
+
+msgctxt "model:product.uom,symbol:uom_kilogram"
+msgid "kg"
+msgstr "kg"
+
+msgctxt "model:product.uom,symbol:uom_kilometer"
+msgid "km"
+msgstr "km"
+
+msgctxt "model:product.uom,symbol:uom_liter"
+msgid "l"
+msgstr "l"
+
+msgctxt "model:product.uom,symbol:uom_meter"
+msgid "m"
+msgstr "m"
+
+msgctxt "model:product.uom,symbol:uom_mile"
+msgid "mi"
+msgstr "mi"
+
+msgctxt "model:product.uom,symbol:uom_millimeter"
+msgid "mm"
+msgstr "mm"
+
+msgctxt "model:product.uom,symbol:uom_minute"
+msgid "min"
+msgstr "min"
+
+msgctxt "model:product.uom,symbol:uom_ounce"
+msgid "oz"
+msgstr "oz"
+
+msgctxt "model:product.uom,symbol:uom_pound"
+msgid "lb"
+msgstr "lb"
+
+msgctxt "model:product.uom,symbol:uom_second"
+msgid "s"
+msgstr "s"
+
+msgctxt "model:product.uom,symbol:uom_square_centimeter"
+msgid "cm²"
+msgstr "cm²"
+
+msgctxt "model:product.uom,symbol:uom_square_foot"
+msgid "ft²"
+msgstr "ft²"
+
+msgctxt "model:product.uom,symbol:uom_square_inch"
+msgid "in²"
+msgstr "in²"
+
+msgctxt "model:product.uom,symbol:uom_square_meter"
+msgid "m²"
+msgstr "m²"
+
+msgctxt "model:product.uom,symbol:uom_square_yard"
+msgid "yd²"
+msgstr "yd²"
+
+msgctxt "model:product.uom,symbol:uom_unit"
+msgid "u"
+msgstr "u"
+
+msgctxt "model:product.uom,symbol:uom_work_day"
+msgid "wd"
+msgstr "wd"
+
+msgctxt "model:product.uom,symbol:uom_yard"
+msgid "yd"
+msgstr "yd"
+
+msgctxt "model:product.uom.category,name:"
+msgid "Unit of Measure Category"
+msgstr "计量单位类别"
+
+msgctxt "model:product.uom.category,name:uom_cat_length"
+msgid "Length"
+msgstr "长度"
+
+msgctxt "model:product.uom.category,name:uom_cat_surface"
+msgid "Surface"
+msgstr "面积"
+
+msgctxt "model:product.uom.category,name:uom_cat_time"
+msgid "Time"
+msgstr "时间"
+
+msgctxt "model:product.uom.category,name:uom_cat_unit"
+msgid "Units"
+msgstr "单位"
+
+msgctxt "model:product.uom.category,name:uom_cat_volume"
+msgid "Volume"
+msgstr "体积或容量"
+
+msgctxt "model:product.uom.category,name:uom_cat_weight"
+msgid "Weight"
+msgstr "重量"
+
+msgctxt "model:res.group,name:group_product_admin"
+msgid "Product Administration"
+msgstr "产品管理"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Article Number"
+msgstr "国际商品编码"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Securities Identification Number"
+msgstr "国际证券识别码"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Audiovisual Number"
+msgstr "国际标准音视频编号"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Book Number"
+msgstr "国际标准书号"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Identifier for Libraries"
+msgstr "图书馆国际标准标识符"
+
+msgctxt "selection:product.identifier,type:"
+msgid "International Standard Music Number"
+msgstr "国际标准乐谱号"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Average"
+msgstr "平均成本价法"
+
+msgctxt "selection:product.product,cost_price_method:"
+msgid "Fixed"
+msgstr "固定成本价法"
+
+msgctxt "selection:product.product,type:"
+msgid "Assets"
+msgstr "资产"
+
+msgctxt "selection:product.product,type:"
+msgid "Goods"
+msgstr "货物"
+
+msgctxt "selection:product.product,type:"
+msgid "Service"
+msgstr "服务"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Average"
+msgstr "平均成本价法"
+
+msgctxt "selection:product.template,cost_price_method:"
+msgid "Fixed"
+msgstr "固定成本价法"
+
+msgctxt "selection:product.template,type:"
+msgid "Assets"
+msgstr "资产"
+
+msgctxt "selection:product.template,type:"
+msgid "Goods"
+msgstr "货物"
+
+msgctxt "selection:product.template,type:"
+msgid "Service"
+msgstr "服务"
+
+msgctxt "view:product.category:"
+msgid "Children"
+msgstr "子类别"
+
+msgctxt "view:product.configuration:"
+msgid "Sequences"
+msgstr "产品序列"
+
+msgctxt "view:product.template:"
+msgid "General"
+msgstr "常规"
diff --git a/modules/product/message.xml b/modules/product/message.xml
new file mode 100644
index 0000000000..d8b1f2f10e
--- /dev/null
+++ b/modules/product/message.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+ You cannot modify the factor of UOM "%(uom)s".
+
+
+ You cannot modify the rate of UOM "%(uom)s".
+
+
+ You cannot modify the category of UOM "%(uom)s".
+
+
+ If the UOM is still not used, you can delete it otherwise you can deactivate it and create a new one.
+
+
+ Incompatible factor and rate values on UOM "%(uom)s".
+
+
+ Rate and factor can not be both equal to zero.
+
+
+ The %(type)s "%(code)s" for product "%(product)s" is not valid.
+
+
+ Code of active product must be unique.
+
+
+
diff --git a/modules/product/product.py b/modules/product/product.py
new file mode 100644
index 0000000000..40be6b3a98
--- /dev/null
+++ b/modules/product/product.py
@@ -0,0 +1,829 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import copy
+import logging
+from decimal import Decimal
+from importlib import import_module
+
+import stdnum
+import stdnum.exceptions
+from sql import Null, Column, Literal
+from sql.operators import Equal
+
+from trytond.i18n import gettext
+from trytond.model import (
+ ModelView, ModelSQL, Model, UnionMixin, DeactivableMixin, sequence_ordered,
+ Exclude, fields)
+from trytond.pyson import Eval, If
+from trytond.transaction import Transaction
+from trytond.pool import Pool
+from trytond import backend
+from trytond.tools import lstrip_wildcard
+from trytond.tools.multivalue import migrate_property
+from trytond.modules.company.model import (
+ CompanyMultiValueMixin, CompanyValueMixin)
+from .exceptions import InvalidIdentifierCode
+from .ir import price_decimal
+
+
+__all__ = ['price_digits', 'round_price', 'TemplateFunction']
+logger = logging.getLogger(__name__)
+
+TYPES = [
+ ('goods', 'Goods'),
+ ('assets', 'Assets'),
+ ('service', 'Service'),
+ ]
+COST_PRICE_METHODS = [
+ ('fixed', 'Fixed'),
+ ('average', 'Average'),
+ ]
+
+price_digits = (16, price_decimal)
+
+
+def round_price(value, rounding=None):
+ "Round price using the price digits"
+ if isinstance(value, int):
+ return Decimal(value)
+ return value.quantize(
+ Decimal(1) / 10 ** price_digits[1], rounding=rounding)
+
+
+class Template(
+ DeactivableMixin, ModelSQL, ModelView, CompanyMultiValueMixin):
+ "Product Template"
+ __name__ = "product.template"
+ _order_name = 'rec_name'
+ name = fields.Char(
+ "Name", size=None, required=True, translate=True, select=True)
+ code_readonly = fields.Function(
+ fields.Boolean("Code Readonly"), 'get_code_readonly')
+ code = fields.Char(
+ "Code", select=True,
+ states={
+ 'readonly': Eval('code_readonly', False),
+ },
+ depends=['code_readonly'])
+ type = fields.Selection(TYPES, "Type", required=True)
+ consumable = fields.Boolean('Consumable',
+ states={
+ 'invisible': Eval('type', 'goods') != 'goods',
+ },
+ depends=['type'],
+ help="Check to allow stock moves to be assigned "
+ "regardless of stock level.")
+ list_price = fields.MultiValue(fields.Numeric(
+ "List Price", required=True, digits=price_digits,
+ help="The standard price the product is sold at."))
+ list_prices = fields.One2Many(
+ 'product.list_price', 'template', "List Prices")
+ cost_price = fields.Function(fields.Numeric(
+ "Cost Price", digits=price_digits,
+ help="The amount it costs to purchase or make the product, "
+ "or carry out the service."),
+ 'get_cost_price')
+ cost_price_method = fields.MultiValue(fields.Selection(
+ COST_PRICE_METHODS, "Cost Price Method", required=True,
+ help="The method used to calculate the cost price."))
+ cost_price_methods = fields.One2Many(
+ 'product.cost_price_method', 'template', "Cost Price Methods")
+ default_uom = fields.Many2One('product.uom', "Default UOM", required=True,
+ help="The standard unit of measure for the product.\n"
+ "Used internally when calculating the stock levels of goods "
+ "and assets.")
+ default_uom_category = fields.Function(
+ fields.Many2One('product.uom.category', 'Default UOM Category'),
+ 'on_change_with_default_uom_category',
+ searcher='search_default_uom_category')
+ default_uom_digits = fields.Function(fields.Integer("Default Unit Digits"),
+ 'on_change_with_default_uom_digits')
+ categories = fields.Many2Many(
+ 'product.template-product.category', 'template', 'category',
+ "Categories",
+ help="The categories that the product is in.\n"
+ "Used to group similar products together.")
+ categories_all = fields.Many2Many(
+ 'product.template-product.category.all',
+ 'template', 'category', "Categories", readonly=True)
+ products = fields.One2Many(
+ 'product.product', 'template', "Variants",
+ domain=[
+ If(~Eval('active'), ('active', '=', False), ()),
+ ],
+ depends=['active'],
+ help="The different variants the product comes in.")
+
+ @classmethod
+ def __register__(cls, module_name):
+ super(Template, cls).__register__(module_name)
+
+ table = cls.__table_handler__(module_name)
+
+ # Migration from 3.8: rename category into categories
+ if table.column_exist('category'):
+ logger.warning(
+ 'The column "category" on table "%s" must be dropped manually',
+ cls._table)
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._order.insert(0, ('rec_name', 'ASC'))
+
+ @classmethod
+ def multivalue_model(cls, field):
+ pool = Pool()
+ if field == 'list_price':
+ return pool.get('product.list_price')
+ elif field == 'cost_price_method':
+ return pool.get('product.cost_price_method')
+ return super(Template, cls).multivalue_model(field)
+
+ @classmethod
+ def order_rec_name(cls, tables):
+ table, _ = tables[None]
+ return [table.code, table.name]
+
+ def get_rec_name(self, name):
+ if self.code:
+ return '[' + self.code + '] ' + self.name
+ else:
+ return self.name
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ if clause[1].startswith('!') or clause[1].startswith('not '):
+ bool_op = 'AND'
+ else:
+ bool_op = 'OR'
+ code_value = clause[2]
+ if clause[1].endswith('like'):
+ code_value = lstrip_wildcard(clause[2])
+ return [bool_op,
+ ('name',) + tuple(clause[1:]),
+ ('code', clause[1], code_value) + tuple(clause[3:]),
+ ('products.code', clause[1], code_value) + tuple(clause[3:]),
+ ('products.identifiers.code', clause[1], code_value)
+ + tuple(clause[3:]),
+ ]
+
+ @staticmethod
+ def default_type():
+ return 'goods'
+
+ @staticmethod
+ def default_consumable():
+ return False
+
+ def get_cost_price(self, name):
+ if len(self.products) == 1:
+ product, = self.products
+ return product.cost_price
+
+ @classmethod
+ def default_cost_price_method(cls, **pattern):
+ pool = Pool()
+ Configuration = pool.get('product.configuration')
+ return Configuration(1).get_multivalue(
+ 'default_cost_price_method', **pattern)
+
+ @classmethod
+ def default_products(cls):
+ transaction = Transaction()
+ if (transaction.user == 0
+ or not transaction.context.get('default_products', True)):
+ return []
+ return [{}]
+
+ @classmethod
+ def default_code_readonly(cls):
+ pool = Pool()
+ Configuration = pool.get('product.configuration')
+ config = Configuration(1)
+ return bool(config.template_sequence)
+
+ def get_code_readonly(self, name):
+ return self.default_code_readonly()
+
+ @fields.depends('type', 'cost_price_method')
+ def on_change_type(self):
+ if self.type == 'service':
+ self.cost_price_method = 'fixed'
+
+ @fields.depends('default_uom')
+ def on_change_with_default_uom_category(self, name=None):
+ if self.default_uom:
+ return self.default_uom.category.id
+
+ @classmethod
+ def search_default_uom_category(cls, name, clause):
+ return [('default_uom.category' + clause[0].lstrip(name),)
+ + tuple(clause[1:])]
+
+ @fields.depends('default_uom')
+ def on_change_with_default_uom_digits(self, name=None):
+ if self.default_uom:
+ return self.default_uom.digits
+
+ @classmethod
+ def _new_code(cls):
+ pool = Pool()
+ Configuration = pool.get('product.configuration')
+ config = Configuration(1)
+ sequence = config.template_sequence
+ if sequence:
+ return sequence.get()
+
+ @classmethod
+ def create(cls, vlist):
+ pool = Pool()
+ Product = pool.get('product.product')
+ vlist = [v.copy() for v in vlist]
+ for values in vlist:
+ values.setdefault('products', None)
+ if not values.get('code'):
+ values['code'] = cls._new_code()
+ templates = super(Template, cls).create(vlist)
+ products = sum((t.products for t in templates), ())
+ Product.sync_code(products)
+ return templates
+
+ @classmethod
+ def write(cls, *args):
+ pool = Pool()
+ Product = pool.get('product.product')
+ super().write(*args)
+ templates = sum(args[0:None:2], [])
+ products = sum((t.products for t in templates), ())
+ Product.sync_code(products)
+
+ @classmethod
+ def copy(cls, templates, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('code', None)
+ return super().copy(templates, default=default)
+
+ @classmethod
+ def search_global(cls, text):
+ for record, rec_name, icon in super(Template, cls).search_global(text):
+ icon = icon or 'tryton-product'
+ yield record, rec_name, icon
+
+
+class TemplateFunction(fields.Function):
+
+ def __init__(self, field):
+ super(TemplateFunction, self).__init__(
+ field, 'get_template', searcher='search_template')
+ # Disable on_change as it is managed by on_change_template
+ self.on_change = set()
+ self.on_change_with = set()
+
+ def __copy__(self):
+ return TemplateFunction(copy.copy(self._field))
+
+ def __deepcopy__(self, memo):
+ return TemplateFunction(copy.deepcopy(self._field, memo))
+
+ @staticmethod
+ def order(name):
+ @classmethod
+ def order(cls, tables):
+ pool = Pool()
+ Template = pool.get('product.template')
+ product, _ = tables[None]
+ if 'template' not in tables:
+ template = Template.__table__()
+ tables['template'] = {
+ None: (template, product.template == template.id),
+ }
+ return getattr(Template, name).convert_order(
+ name, tables['template'], Template)
+ return order
+
+ def definition(self, model, language):
+ pool = Pool()
+ Template = pool.get('product.template')
+ definition = super().definition(model, language)
+ definition['searchable'] = self._field.definition(
+ Template, language)['searchable']
+ return definition
+
+
+class Product(
+ DeactivableMixin, ModelSQL, ModelView, CompanyMultiValueMixin):
+ "Product Variant"
+ __name__ = "product.product"
+ _order_name = 'rec_name'
+ template = fields.Many2One(
+ 'product.template', "Product Template",
+ required=True, ondelete='CASCADE', select=True,
+ search_context={'default_products': False},
+ domain=[
+ If(Eval('active'), ('active', '=', True), ()),
+ ],
+ depends=['active'],
+ help="The product that defines the common properties "
+ "inherited by the variant.")
+ code_readonly = fields.Function(fields.Boolean('Code Readonly'),
+ 'get_code_readonly')
+ prefix_code = fields.Function(fields.Char(
+ "Prefix Code",
+ states={
+ 'invisible': ~Eval('prefix_code'),
+ }),
+ 'on_change_with_prefix_code')
+ suffix_code = fields.Char(
+ "Suffix Code",
+ states={
+ 'readonly': Eval('code_readonly', False),
+ },
+ depends=['code_readonly'],
+ help="The unique identifier for the product (aka SKU).")
+ code = fields.Char("Code", readonly=True, select=True,
+ help="A unique identifier for the variant.")
+ identifiers = fields.One2Many(
+ 'product.identifier', 'product', "Identifiers",
+ help="Other identifiers associated with the variant.")
+ cost_price = fields.MultiValue(fields.Numeric(
+ "Cost Price", required=True, digits=price_digits,
+ help="The amount it costs to purchase or make the variant, "
+ "or carry out the service."))
+ cost_prices = fields.One2Many(
+ 'product.cost_price', 'product', "Cost Prices")
+ description = fields.Text("Description", translate=True)
+ list_price_uom = fields.Function(fields.Numeric('List Price',
+ digits=price_digits), 'get_price_uom')
+ cost_price_uom = fields.Function(fields.Numeric('Cost Price',
+ digits=price_digits), 'get_price_uom')
+
+ @classmethod
+ def __setup__(cls):
+ pool = Pool()
+ Template = pool.get('product.template')
+
+ if not hasattr(cls, '_no_template_field'):
+ cls._no_template_field = set()
+ cls._no_template_field.update(['products'])
+
+ super(Product, cls).__setup__()
+ cls.__access__.add('template')
+ cls._order.insert(0, ('rec_name', 'ASC'))
+
+ t = cls.__table__()
+ cls._sql_constraints = [
+ ('code_exclude', Exclude(t, (t.code, Equal),
+ where=(t.active == Literal(True))
+ & (t.code != '')),
+ 'product.msg_product_code_unique'),
+ ]
+
+ for attr in dir(Template):
+ tfield = getattr(Template, attr)
+ if not isinstance(tfield, fields.Field):
+ continue
+ if attr in cls._no_template_field:
+ continue
+ field = getattr(cls, attr, None)
+ if not field or isinstance(field, TemplateFunction):
+ tfield = copy.deepcopy(tfield)
+ if hasattr(tfield, 'field'):
+ tfield.field = None
+ invisible_state = ~Eval('template')
+ if 'invisible' in tfield.states:
+ tfield.states['invisible'] |= invisible_state
+ else:
+ tfield.states['invisible'] = invisible_state
+ if 'template' not in tfield.depends:
+ tfield.depends.append('template')
+ setattr(cls, attr, TemplateFunction(tfield))
+ order_method = getattr(cls, 'order_%s' % attr, None)
+ if (not order_method
+ and not isinstance(tfield, (
+ fields.Function,
+ fields.One2Many,
+ fields.Many2Many))):
+ order_method = TemplateFunction.order(attr)
+ setattr(cls, 'order_%s' % attr, order_method)
+ if isinstance(tfield, fields.One2Many):
+ getattr(cls, attr).setter = '_set_template_function'
+
+ @classmethod
+ def __register__(cls, module):
+ table = cls.__table__()
+ table_h = cls.__table_handler__(module)
+ fill_suffix_code = (
+ table_h.column_exist('code')
+ and not table_h.column_exist('suffix_code'))
+ super().__register__(module)
+ cursor = Transaction().connection.cursor()
+
+ # Migration from 5.4: split code into prefix/suffix
+ if fill_suffix_code:
+ cursor.execute(*table.update(
+ [table.suffix_code],
+ [table.code]))
+
+ @classmethod
+ def _set_template_function(cls, products, name, value):
+ # Prevent NotImplementedError for One2Many
+ pass
+
+ @fields.depends('template', '_parent_template.id')
+ def on_change_template(self):
+ for name, field in self._fields.items():
+ if isinstance(field, TemplateFunction):
+ if self.template:
+ value = getattr(self.template, name, None)
+ else:
+ value = None
+ setattr(self, name, value)
+
+ def get_template(self, name):
+ value = getattr(self.template, name)
+ if isinstance(value, Model):
+ field = getattr(self.__class__, name)
+ if field._type == 'reference':
+ return str(value)
+ return value.id
+ elif (isinstance(value, (list, tuple))
+ and value and isinstance(value[0], Model)):
+ return [r.id for r in value]
+ else:
+ return value
+
+ @fields.depends('template', '_parent_template.code')
+ def on_change_with_prefix_code(self, name=None):
+ if self.template:
+ return self.template.code
+
+ @classmethod
+ def multivalue_model(cls, field):
+ pool = Pool()
+ if field == 'cost_price':
+ return pool.get('product.cost_price')
+ return super(Product, cls).multivalue_model(field)
+
+ @classmethod
+ def default_cost_price(cls, **pattern):
+ return Decimal(0)
+
+ @classmethod
+ def search_template(cls, name, clause):
+ return [('template.' + clause[0],) + tuple(clause[1:])]
+
+ @classmethod
+ def order_rec_name(cls, tables):
+ pool = Pool()
+ Template = pool.get('product.template')
+ product, _ = tables[None]
+ if 'template' not in tables:
+ template = Template.__table__()
+ tables['template'] = {
+ None: (template, product.template == template.id),
+ }
+ else:
+ template = tables['template']
+ return [product.code] + Template.name.convert_order('name',
+ tables['template'], Template)
+
+ def get_rec_name(self, name):
+ if self.code:
+ return '[' + self.code + '] ' + self.name
+ else:
+ return self.name
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ if clause[1].startswith('!') or clause[1].startswith('not '):
+ bool_op = 'AND'
+ else:
+ bool_op = 'OR'
+ code_value = clause[2]
+ if clause[1].endswith('like'):
+ code_value = lstrip_wildcard(clause[2])
+ return [bool_op,
+ ('code', clause[1], code_value) + tuple(clause[3:]),
+ ('identifiers.code', clause[1], code_value) + tuple(clause[3:]),
+ ('template.name',) + tuple(clause[1:]),
+ ('template.code', clause[1], code_value) + tuple(clause[3:]),
+ ]
+
+ @staticmethod
+ def get_price_uom(products, name):
+ Uom = Pool().get('product.uom')
+ res = {}
+ field = name[:-4]
+ if Transaction().context.get('uom'):
+ to_uom = Uom(Transaction().context['uom'])
+ else:
+ to_uom = None
+ for product in products:
+ price = getattr(product, field)
+ if to_uom and product.default_uom.category == to_uom.category:
+ res[product.id] = Uom.compute_price(
+ product.default_uom, price, to_uom)
+ else:
+ res[product.id] = price
+ return res
+
+ @classmethod
+ def search_global(cls, text):
+ for id_, rec_name, icon in super(Product, cls).search_global(text):
+ icon = icon or 'tryton-product'
+ yield id_, rec_name, icon
+
+ @classmethod
+ def default_code_readonly(cls):
+ pool = Pool()
+ Configuration = pool.get('product.configuration')
+ config = Configuration(1)
+ return bool(config.product_sequence)
+
+ def get_code_readonly(self, name):
+ return self.default_code_readonly()
+
+ @classmethod
+ def _new_suffix_code(cls):
+ pool = Pool()
+ Configuration = pool.get('product.configuration')
+ config = Configuration(1)
+ sequence = config.product_sequence
+ if sequence:
+ return sequence.get()
+
+ @classmethod
+ def create(cls, vlist):
+ vlist = [x.copy() for x in vlist]
+ for values in vlist:
+ if not values.get('suffix_code'):
+ values['suffix_code'] = cls._new_suffix_code()
+ products = super().create(vlist)
+ cls.sync_code(products)
+ return products
+
+ @classmethod
+ def write(cls, *args):
+ super().write(*args)
+ products = sum(args[0:None:2], [])
+ cls.sync_code(products)
+
+ @classmethod
+ def copy(cls, products, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('suffix_code', None)
+ default.setdefault('code', None)
+ return super().copy(products, default=default)
+
+ @property
+ def list_price_used(self):
+ transaction = Transaction()
+ with transaction.reset_context(), \
+ transaction.set_context(self._context):
+ return self.template.get_multivalue('list_price')
+
+ @classmethod
+ def sync_code(cls, products):
+ for product in products:
+ code = ''.join(filter(None, [
+ product.prefix_code, product.suffix_code]))
+ if not code:
+ code = None
+ if code != product.code:
+ product.code = code
+ cls.save(products)
+
+
+class ProductListPrice(ModelSQL, CompanyValueMixin):
+ "Product List Price"
+ __name__ = 'product.list_price'
+ template = fields.Many2One(
+ 'product.template', "Template", ondelete='CASCADE', select=True,
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends=['company'])
+ list_price = fields.Numeric("List Price", digits=price_digits)
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+
+ super(ProductListPrice, cls).__register__(module_name)
+
+ if not exist:
+ cls._migrate_property([], [], [])
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.append('list_price')
+ value_names.append('list_price')
+ fields.append('company')
+ migrate_property(
+ 'product.template', field_names, cls, value_names,
+ parent='template', fields=fields)
+
+
+class ProductCostPriceMethod(ModelSQL, CompanyValueMixin):
+ "Product Cost Price Method"
+ __name__ = 'product.cost_price_method'
+ template = fields.Many2One(
+ 'product.template', "Template", ondelete='CASCADE', select=True,
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends=['company'])
+ cost_price_method = fields.Selection(
+ 'get_cost_price_methods', "Cost Price Method")
+
+ @classmethod
+ def __register__(cls, module_name):
+ pool = Pool()
+ ProductCostPrice = pool.get('product.cost_price')
+ sql_table = cls.__table__()
+ cost_price = ProductCostPrice.__table__()
+ cursor = Transaction().connection.cursor()
+
+ exist = backend.TableHandler.table_exist(cls._table)
+ cost_price_exist = backend.TableHandler.table_exist(
+ ProductCostPrice._table)
+
+ super(ProductCostPriceMethod, cls).__register__(module_name)
+
+ # Migrate from 4.4: move cost_price_method from ProductCostPrice
+ if not exist and not cost_price_exist:
+ cls._migrate_property([], [], [])
+ elif not exist and cost_price_exist:
+ cost_price_table = backend.TableHandler(
+ ProductCostPrice, module_name)
+ if cost_price_table.column_exist('template'):
+ columns = ['create_uid', 'create_date',
+ 'write_uid', 'write_date',
+ 'template', 'cost_price_method']
+ cursor.execute(*sql_table.insert(
+ columns=[Column(sql_table, c) for c in columns],
+ values=cost_price.select(
+ *[Column(cost_price, c) for c in columns])))
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.append('cost_price_method')
+ value_names.append('cost_price_method')
+ fields.append('company')
+ migrate_property(
+ 'product.template', field_names, cls, value_names,
+ parent='template', fields=fields)
+
+ @classmethod
+ def get_cost_price_methods(cls):
+ pool = Pool()
+ Template = pool.get('product.template')
+ field_name = 'cost_price_method'
+ methods = Template.fields_get([field_name])[field_name]['selection']
+ methods.append((None, ''))
+ return methods
+
+
+class ProductCostPrice(ModelSQL, CompanyValueMixin):
+ "Product Cost Price"
+ __name__ = 'product.cost_price'
+ product = fields.Many2One(
+ 'product.product', "Product", ondelete='CASCADE', select=True,
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends=['company'])
+ cost_price = fields.Numeric(
+ "Cost Price", digits=price_digits)
+
+ @classmethod
+ def __register__(cls, module_name):
+ pool = Pool()
+ Product = pool.get('product.product')
+ sql_table = cls.__table__()
+ product = Product.__table__()
+ cursor = Transaction().connection.cursor()
+
+ exist = backend.TableHandler.table_exist(cls._table)
+
+ super(ProductCostPrice, cls).__register__(module_name)
+
+ table = cls.__table_handler__(module_name)
+ if not exist:
+ # Create template column for property migration
+ table.add_column('template', 'INTEGER')
+ cls._migrate_property([], [], [])
+
+ # Migration from 4.4: replace template by product
+ if table.column_exist('template'):
+ columns = ['create_uid', 'create_date',
+ 'write_uid', 'write_date', 'cost_price']
+ cursor.execute(*sql_table.insert(
+ columns=[Column(sql_table, c) for c in columns]
+ + [sql_table.product],
+ values=sql_table.join(product,
+ condition=sql_table.template == product.template
+ ).select(
+ *[Column(sql_table, c) for c in columns]
+ + [product.id],
+ where=(sql_table.template != Null)
+ & (sql_table.product == Null))))
+ cursor.execute(*sql_table.delete(
+ where=(sql_table.template != Null)
+ & (sql_table.product == Null)))
+ table.drop_column('template')
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.append('cost_price')
+ value_names.append('cost_price')
+ fields.append('company')
+ migrate_property(
+ 'product.template', field_names, cls, value_names,
+ parent='template', fields=fields)
+
+
+class TemplateCategory(ModelSQL):
+ 'Template - Category'
+ __name__ = 'product.template-product.category'
+ template = fields.Many2One('product.template', 'Template',
+ ondelete='CASCADE', required=True, select=True)
+ category = fields.Many2One('product.category', 'Category',
+ ondelete='CASCADE', required=True, select=True)
+
+
+class TemplateCategoryAll(UnionMixin, ModelSQL):
+ "Template - Category All"
+ __name__ = 'product.template-product.category.all'
+ template = fields.Many2One('product.template', "Template")
+ category = fields.Many2One('product.category', "Category")
+
+ @classmethod
+ def union_models(cls):
+ return ['product.template-product.category']
+
+
+class ProductIdentifier(sequence_ordered(), ModelSQL, ModelView):
+ "Product Identifier"
+ __name__ = 'product.identifier'
+ _rec_name = 'code'
+ product = fields.Many2One('product.product', "Product", ondelete='CASCADE',
+ required=True, select=True,
+ help="The product identified by the code.")
+ type = fields.Selection([
+ (None, ''),
+ ('ean', "International Article Number"),
+ ('isan', "International Standard Audiovisual Number"),
+ ('isbn', "International Standard Book Number"),
+ ('isil', "International Standard Identifier for Libraries"),
+ ('isin', "International Securities Identification Number"),
+ ('ismn', "International Standard Music Number"),
+ ], "Type")
+ type_string = type.translated('type')
+ code = fields.Char("Code", required=True)
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.__access__.add('product')
+
+ @fields.depends('type', 'code')
+ def on_change_with_code(self):
+ if self.type and self.type != 'other':
+ try:
+ module = import_module('stdnum.%s' % self.type)
+ return module.compact(self.code)
+ except ImportError:
+ pass
+ except stdnum.exceptions.ValidationError:
+ pass
+ return self.code
+
+ def pre_validate(self):
+ super().pre_validate()
+ self.check_code()
+
+ @fields.depends('type', 'product', 'code')
+ def check_code(self):
+ if self.type:
+ try:
+ module = import_module('stdnum.%s' % self.type)
+ except ModuleNotFoundError:
+ return
+ if not module.is_valid(self.code):
+ if self.product and self.product.id > 0:
+ product = self.product.rec_name
+ else:
+ product = ''
+ raise InvalidIdentifierCode(
+ gettext('product.msg_invalid_code',
+ type=self.type_string,
+ code=self.code,
+ product=product))
diff --git a/modules/product/product.xml b/modules/product/product.xml
new file mode 100644
index 0000000000..fe88177c41
--- /dev/null
+++ b/modules/product/product.xml
@@ -0,0 +1,240 @@
+
+
+
+
+
+
+ Product Administration
+
+
+
+
+
+
+
+ tryton-product
+ icons/tryton-product.svg
+
+
+
+
+
+
+
+
+
+
+
+
+ product.template
+ tree
+ template_tree
+
+
+
+ product.template
+ form
+ template_form
+
+
+
+ Products
+ product.template
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Product by Category
+ product.template
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tree_open
+ product.category,-1
+
+
+
+
+ product.product
+
+
+
+ product_tree
+
+
+
+ product.product
+ tree
+
+ product_tree_simple
+
+
+
+ product.product
+
+
+
+ product_form
+
+
+
+ product.product
+ form
+
+ product_form_simple
+
+
+
+ Variants
+ product.product
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Variants
+ product.product
+
+
+
+
+
+
+
+
+
+
+
+
+
+ form_relate
+ product.template,-1
+
+
+
+
+ product.identifier
+ form
+ identifier_form
+
+
+ product.identifier
+ tree
+
+ identifier_list
+
+
+ product.identifier
+ tree
+
+ identifier_list_sequence
+
+
+
+ Variant
+
+
+
+
+
+
+
+
+
+
+ Product
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product/setup.py b/modules/product/setup.py
new file mode 100755
index 0000000000..ce5b623f12
--- /dev/null
+++ b/modules/product/setup.py
@@ -0,0 +1,153 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ content = io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+ content = re.sub(
+ r'(?m)^\.\. toctree::\r?\n((^$|^\s.*$)\r?\n)*', '', content)
+ return content
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_product'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = ['python-sql', 'python-stdnum']
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [get_require_version('proteus')]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module with products',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/projects/modules-product/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/product',
+ },
+ keywords='tryton product',
+ package_dir={'trytond.modules.product': '.'},
+ packages=(
+ ['trytond.modules.product']
+ + ['trytond.modules.product.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.product': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'icons/*.svg',
+ 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ product = trytond.modules.product
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/product/tests/__init__.py b/modules/product/tests/__init__.py
new file mode 100644
index 0000000000..15b4004105
--- /dev/null
+++ b/modules/product/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.product.tests.test_product import suite
+except ImportError:
+ from .test_product import suite
+
+__all__ = ['suite']
diff --git a/modules/product/tests/scenario_product_identifier.rst b/modules/product/tests/scenario_product_identifier.rst
new file mode 100644
index 0000000000..72b74af571
--- /dev/null
+++ b/modules/product/tests/scenario_product_identifier.rst
@@ -0,0 +1,49 @@
+===========================
+Product Identifier Scenario
+===========================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+
+Activate modules::
+
+ >>> config = activate_modules('product')
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('40')
+ >>> template.save()
+ >>> product, = template.products
+
+The identifier code is computed when set::
+
+ >>> identifier = product.identifiers.new()
+ >>> identifier.type = 'ean'
+ >>> identifier.code = '123 456 7890 123'
+ >>> identifier.code
+ '1234567890123'
+
+An Error is raised for invalid code::
+
+ >>> product.save() # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ InvalidIdentifierCode: ...
+
+Valid codes are saved correctly::
+
+ >>> identifier.code = '978-0-471-11709-4'
+ >>> product.save()
+ >>> identifier, = product.identifiers
+ >>> identifier.code
+ '9780471117094'
diff --git a/modules/product/tests/scenario_product_variant.rst b/modules/product/tests/scenario_product_variant.rst
new file mode 100644
index 0000000000..a2dc7ae3e6
--- /dev/null
+++ b/modules/product/tests/scenario_product_variant.rst
@@ -0,0 +1,57 @@
+========================
+Product Variant Scenario
+========================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model
+ >>> from trytond.tests.tools import activate_modules
+
+Activate modules::
+
+ >>> config = activate_modules('product')
+
+Create a template::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+ >>> template = ProductTemplate()
+ >>> template.name = "Product"
+ >>> template.default_uom = unit
+ >>> template.list_price = Decimal('42.0000')
+ >>> template.code = "PROD"
+ >>> template.save()
+ >>> len(template.products)
+ 1
+ >>> product, = template.products
+ >>> product.code
+ 'PROD'
+ >>> product.suffix_code = "001"
+ >>> product.save()
+ >>> product.code
+ 'PROD001'
+
+Create a variant::
+
+ >>> Product = Model.get('product.product')
+ >>> product = Product()
+ >>> product.template = template
+ >>> product.name
+ 'Product'
+ >>> product.list_price
+ Decimal('42.0000')
+ >>> product.suffix_code = "002"
+ >>> product.save()
+ >>> product.list_price
+ Decimal('42.0000')
+ >>> product.code
+ 'PROD002'
+
+Change template code::
+
+ >>> template.code = "PRD"
+ >>> template.save()
+ >>> sorted([p.code for p in template.products])
+ ['PRD001', 'PRD002']
diff --git a/modules/product/tests/test_product.py b/modules/product/tests/test_product.py
new file mode 100644
index 0000000000..1a163ba109
--- /dev/null
+++ b/modules/product/tests/test_product.py
@@ -0,0 +1,475 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import doctest
+import unittest
+from decimal import Decimal
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.tests.test_tryton import doctest_teardown
+from trytond.tests.test_tryton import doctest_checker
+from trytond.transaction import Transaction
+from trytond.pool import Pool
+
+from trytond.modules.company.tests import CompanyTestMixin
+
+from ..product import round_price
+
+
+class ProductTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test Product module'
+ module = 'product'
+
+ @with_transaction()
+ def test_uom_non_zero_rate_factor(self):
+ 'Test uom non_zero_rate_factor constraint'
+ pool = Pool()
+ UomCategory = pool.get('product.uom.category')
+ Uom = pool.get('product.uom')
+ transaction = Transaction()
+ category, = UomCategory.create([{'name': 'Test'}])
+
+ self.assertRaises(Exception, Uom.create, [{
+ 'name': 'Test',
+ 'symbol': 'T',
+ 'category': category.id,
+ 'rate': 0,
+ 'factor': 0,
+ }])
+ transaction.rollback()
+
+ def create():
+ category, = UomCategory.create([{'name': 'Test'}])
+ return Uom.create([{
+ 'name': 'Test',
+ 'symbol': 'T',
+ 'category': category.id,
+ 'rate': 1.0,
+ 'factor': 1.0,
+ }])[0]
+
+ uom = create()
+ self.assertRaises(Exception, Uom.write, [uom], {
+ 'rate': 0.0,
+ })
+ transaction.rollback()
+
+ uom = create()
+ self.assertRaises(Exception, Uom.write, [uom], {
+ 'factor': 0.0,
+ })
+ transaction.rollback()
+
+ uom = create()
+ self.assertRaises(Exception, Uom.write, [uom], {
+ 'rate': 0.0,
+ 'factor': 0.0,
+ })
+ transaction.rollback()
+
+ @with_transaction()
+ def test_uom_check_factor_and_rate(self):
+ 'Test uom check_factor_and_rate constraint'
+ pool = Pool()
+ UomCategory = pool.get('product.uom.category')
+ Uom = pool.get('product.uom')
+ transaction = Transaction()
+ category, = UomCategory.create([{'name': 'Test'}])
+
+ self.assertRaises(Exception, Uom.create, [{
+ 'name': 'Test',
+ 'symbol': 'T',
+ 'category': category.id,
+ 'rate': 2,
+ 'factor': 2,
+ }])
+ transaction.rollback()
+
+ def create():
+ category, = UomCategory.create([{'name': 'Test'}])
+ return Uom.create([{
+ 'name': 'Test',
+ 'symbol': 'T',
+ 'category': category.id,
+ 'rate': 1.0,
+ 'factor': 1.0,
+ }])[0]
+
+ uom = create()
+ self.assertRaises(Exception, Uom.write, [uom], {
+ 'rate': 2.0,
+ })
+ transaction.rollback()
+
+ uom = create()
+ self.assertRaises(Exception, Uom.write, [uom], {
+ 'factor': 2.0,
+ })
+ transaction.rollback()
+
+ @with_transaction()
+ def test_uom_select_accurate_field(self):
+ 'Test uom select_accurate_field function'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ tests = [
+ ('Meter', 'factor'),
+ ('Kilometer', 'factor'),
+ ('centimeter', 'rate'),
+ ('Foot', 'factor'),
+ ]
+ for name, result in tests:
+ uom, = Uom.search([
+ ('name', '=', name),
+ ], limit=1)
+ self.assertEqual(result, uom.accurate_field)
+
+ @with_transaction()
+ def test_uom_compute_qty(self):
+ 'Test uom compute_qty function'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ tests = [
+ ('Kilogram', 100, 'Gram', 100000, 100000),
+ ('Gram', 1, 'Pound', 0.0022046226218487759, 0.0),
+ ('Second', 5, 'Minute', 0.083333333333333343, 0.08),
+ ('Second', 25, 'Hour', 0.0069444444444444441, 0.01),
+ ('Millimeter', 3, 'Inch', 0.11811023622047245, 0.12),
+ ('Millimeter', 0, 'Inch', 0, 0),
+ ('Millimeter', None, 'Inch', None, None),
+ ]
+ for from_name, qty, to_name, result, rounded_result in tests:
+ from_uom, = Uom.search([
+ ('name', '=', from_name),
+ ], limit=1)
+ to_uom, = Uom.search([
+ ('name', '=', to_name),
+ ], limit=1)
+ self.assertEqual(result, Uom.compute_qty(
+ from_uom, qty, to_uom, False))
+ self.assertEqual(rounded_result, Uom.compute_qty(
+ from_uom, qty, to_uom, True))
+ self.assertEqual(0.2, Uom.compute_qty(None, 0.2, None, False))
+ self.assertEqual(0.2, Uom.compute_qty(None, 0.2, None, True))
+
+ tests_exceptions = [
+ ('Millimeter', 3, 'Pound', ValueError),
+ ('Kilogram', 'not a number', 'Pound', TypeError),
+ ]
+ for from_name, qty, to_name, exception in tests_exceptions:
+ from_uom, = Uom.search([
+ ('name', '=', from_name),
+ ], limit=1)
+ to_uom, = Uom.search([
+ ('name', '=', to_name),
+ ], limit=1)
+ self.assertRaises(exception, Uom.compute_qty,
+ from_uom, qty, to_uom, False)
+ self.assertRaises(exception, Uom.compute_qty,
+ from_uom, qty, to_uom, True)
+ self.assertRaises(ValueError, Uom.compute_qty,
+ None, qty, to_uom, True)
+ self.assertRaises(ValueError, Uom.compute_qty,
+ from_uom, qty, None, True)
+
+ @with_transaction()
+ def test_uom_compute_qty_category(self):
+ "Test uom compute_qty with different category"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+
+ g, = Uom.search([
+ ('name', '=', "Gram"),
+ ], limit=1)
+ m3, = Uom.search([
+ ('name', '=', "Cubic meter"),
+ ], limit=1)
+
+ for quantity, result, keys in [
+ (10000, 0.02, dict(factor=2)),
+ (20000, 0.01, dict(rate=2)),
+ (30000, 0.01, dict(rate=3, factor=0.333333, round=False)),
+ ]:
+ msg = 'quantity: %r, keys: %r' % (quantity, keys)
+ self.assertEqual(
+ Uom.compute_qty(g, quantity, m3, **keys), result,
+ msg=msg)
+
+ @with_transaction()
+ def test_uom_compute_price(self):
+ 'Test uom compute_price function'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ tests = [
+ ('Kilogram', Decimal('100'), 'Gram', Decimal('0.1')),
+ ('Gram', Decimal('1'), 'Pound', Decimal('453.59237')),
+ ('Second', Decimal('5'), 'Minute', Decimal('300')),
+ ('Second', Decimal('25'), 'Hour', Decimal('90000')),
+ ('Millimeter', Decimal('3'), 'Inch', Decimal('76.2')),
+ ('Millimeter', Decimal('0'), 'Inch', Decimal('0')),
+ ('Millimeter', None, 'Inch', None),
+ ]
+ for from_name, price, to_name, result in tests:
+ from_uom, = Uom.search([
+ ('name', '=', from_name),
+ ], limit=1)
+ to_uom, = Uom.search([
+ ('name', '=', to_name),
+ ], limit=1)
+ self.assertEqual(result, Uom.compute_price(
+ from_uom, price, to_uom))
+ self.assertEqual(Decimal('0.2'), Uom.compute_price(
+ None, Decimal('0.2'), None))
+
+ tests_exceptions = [
+ ('Millimeter', Decimal('3'), 'Pound', ValueError),
+ ('Kilogram', 'not a number', 'Pound', TypeError),
+ ]
+ for from_name, price, to_name, exception in tests_exceptions:
+ from_uom, = Uom.search([
+ ('name', '=', from_name),
+ ], limit=1)
+ to_uom, = Uom.search([
+ ('name', '=', to_name),
+ ], limit=1)
+ self.assertRaises(exception, Uom.compute_price,
+ from_uom, price, to_uom)
+ self.assertRaises(ValueError, Uom.compute_price,
+ None, price, to_uom)
+ self.assertRaises(ValueError, Uom.compute_price,
+ from_uom, price, None)
+
+ @with_transaction()
+ def test_uom_compute_price_category(self):
+ "Test uom compute_price with different category"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+
+ g, = Uom.search([
+ ('name', '=', "Gram"),
+ ], limit=1)
+ m3, = Uom.search([
+ ('name', '=', "Cubic meter"),
+ ], limit=1)
+
+ for price, result, keys in [
+ (Decimal('0.001'), Decimal('500'), dict(factor=2)),
+ (Decimal('0.002'), Decimal('4000'), dict(rate=2)),
+ (Decimal('0.003'), Decimal('9000'), dict(
+ rate=3, factor=0.333333)),
+ ]:
+ msg = 'price: %r, keys: %r' % (price, keys)
+ self.assertEqual(
+ Uom.compute_price(g, price, m3, **keys), result,
+ msg=msg)
+
+ @with_transaction()
+ def test_product_search_domain(self):
+ 'Test product.product search_domain function'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+
+ kilogram, = Uom.search([
+ ('name', '=', 'Kilogram'),
+ ], limit=1)
+ millimeter, = Uom.search([
+ ('name', '=', 'Millimeter'),
+ ])
+ pt1, pt2 = Template.create([{
+ 'name': 'P1',
+ 'type': 'goods',
+ 'list_price': Decimal(20),
+ 'default_uom': kilogram.id,
+ 'products': [('create', [{
+ 'code': '1',
+ }])]
+ }, {
+ 'name': 'P2',
+ 'type': 'goods',
+ 'list_price': Decimal(20),
+ 'default_uom': millimeter.id,
+ 'products': [('create', [{
+ 'code': '2',
+ }])]
+ }])
+ p, = Product.search([
+ ('default_uom.name', '=', 'Kilogram'),
+ ])
+ self.assertEqual(p, pt1.products[0])
+ p, = Product.search([
+ ('default_uom.name', '=', 'Millimeter'),
+ ])
+ self.assertEqual(p, pt2.products[0])
+
+ @with_transaction()
+ def test_search_domain_conversion(self):
+ 'Test the search domain conversion'
+ pool = Pool()
+ Category = pool.get('product.category')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+
+ category1, = Category.create([{'name': 'Category1'}])
+ category2, = Category.create([{'name': 'Category2'}])
+ uom, = Uom.search([], limit=1)
+ values1 = {
+ 'name': 'Some product-1',
+ 'categories': [('add', [category1.id])],
+ 'type': 'goods',
+ 'list_price': Decimal('10'),
+ 'default_uom': uom.id,
+ 'products': [('create', [{}])],
+ }
+ values2 = {
+ 'name': 'Some product-2',
+ 'categories': [('add', [category2.id])],
+ 'type': 'goods',
+ 'list_price': Decimal('10'),
+ 'default_uom': uom.id,
+ 'products': [('create', [{}])],
+ }
+
+ # This is a false positive as there is 1 product with the
+ # template 1 and the same product with category 1. If you do not
+ # create two categories (or any other relation on the template
+ # model) you wont be able to check as in most cases the
+ # id of the template and the related model would be same (1).
+ # So two products have been created with same category. So that
+ # domain ('template.categories', '=', 1) will return 2 records which
+ # it supposed to be.
+ template1, template2, template3, template4 = Template.create(
+ [values1, values1.copy(), values2, values2.copy()]
+ )
+ self.assertEqual(Product.search([], count=True), 4)
+ self.assertEqual(
+ Product.search([
+ ('categories', '=', category1.id),
+ ], count=True), 2)
+
+ self.assertEqual(
+ Product.search([
+ ('template.categories', '=', category1.id),
+ ], count=True), 2)
+
+ self.assertEqual(
+ Product.search([
+ ('categories', '=', category2.id),
+ ], count=True), 2)
+ self.assertEqual(
+ Product.search([
+ ('template.categories', '=', category2.id),
+ ], count=True), 2)
+
+ @with_transaction()
+ def test_uom_rounding(self):
+ 'Test uom rounding functions'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ tests = [
+ (2.53, .1, 2.5, 2.6, 2.5),
+ (3.8, .1, 3.8, 3.8, 3.8),
+ (3.7, .1, 3.7, 3.7, 3.7),
+ (1.3, .5, 1.5, 1.5, 1.0),
+ (1.1, .3, 1.2, 1.2, 0.9),
+ (17, 10, 20, 20, 10),
+ (7, 10, 10, 10, 0),
+ (4, 10, 0, 10, 0),
+ (17, 15, 15, 30, 15),
+ (2.5, 1.4, 2.8, 2.8, 1.4),
+ ]
+ for number, precision, round, ceil, floor in tests:
+ uom = Uom(rounding=precision)
+ self.assertEqual(uom.round(number), round)
+ self.assertEqual(uom.ceil(number), ceil)
+ self.assertEqual(uom.floor(number), floor)
+
+ @with_transaction()
+ def test_product_order(self):
+ 'Test product field order'
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+
+ uom, = Uom.search([], limit=1)
+ values1 = {
+ 'name': 'Product A',
+ 'type': 'assets',
+ 'list_price': Decimal('10'),
+ 'default_uom': uom.id,
+ 'products': [('create', [{'suffix_code': 'AA'}])],
+ }
+ values2 = {
+ 'name': 'Product B',
+ 'type': 'goods',
+ 'list_price': Decimal('10'),
+ 'default_uom': uom.id,
+ 'products': [('create', [{'suffix_code': 'BB'}])],
+ }
+
+ template1, template2 = Template.create([values1, values2])
+ product1, product2 = Product.search([])
+
+ # Non-inherited field.
+ self.assertEqual(
+ Product.search([], order=[('code', 'ASC')]), [product1, product2])
+ self.assertEqual(
+ Product.search([], order=[('code', 'DESC')]), [product2, product1])
+ self.assertEqual(Product.search(
+ [('name', 'like', '%')], order=[('code', 'ASC')]),
+ [product1, product2])
+ self.assertEqual(Product.search(
+ [('name', 'like', '%')], order=[('code', 'DESC')]),
+ [product2, product1])
+
+ # Inherited field with custom order.
+ self.assertEqual(
+ Product.search([], order=[('name', 'ASC')]), [product1, product2])
+ self.assertEqual(
+ Product.search([], order=[('name', 'DESC')]), [product2, product1])
+ self.assertEqual(Product.search(
+ [('name', 'like', '%')], order=[('name', 'ASC')]),
+ [product1, product2])
+ self.assertEqual(Product.search(
+ [('name', 'like', '%')], order=[('name', 'DESC')]),
+ [product2, product1])
+
+ # Inherited field without custom order.
+ self.assertEqual(
+ Product.search([], order=[('type', 'ASC')]), [product1, product2])
+ self.assertEqual(
+ Product.search([], order=[('type', 'DESC')]), [product2, product1])
+ self.assertEqual(Product.search(
+ [('name', 'like', '%')], order=[('type', 'ASC')]),
+ [product1, product2])
+ self.assertEqual(Product.search(
+ [('name', 'like', '%')], order=[('type', 'DESC')]),
+ [product2, product1])
+
+ def test_round_price(self):
+ for value, result in [
+ (Decimal('1'), Decimal('1.0000')),
+ (Decimal('1.12345'), Decimal('1.1234')),
+ (1, Decimal('1')),
+ ]:
+ with self.subTest(value=value):
+ self.assertEqual(round_price(value), result)
+
+
+def suite():
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductTestCase))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_product_variant.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_product_identifier.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ return suite
diff --git a/modules/product/tox.ini b/modules/product/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/product/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/product/tryton.cfg b/modules/product/tryton.cfg
new file mode 100644
index 0000000000..b52973a2d4
--- /dev/null
+++ b/modules/product/tryton.cfg
@@ -0,0 +1,12 @@
+[tryton]
+version=6.0.4
+depends:
+ company
+ ir
+ res
+xml:
+ product.xml
+ category.xml
+ uom.xml
+ configuration.xml
+ message.xml
diff --git a/modules/product/uom.py b/modules/product/uom.py
new file mode 100644
index 0000000000..e07c8c476e
--- /dev/null
+++ b/modules/product/uom.py
@@ -0,0 +1,317 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from decimal import Decimal
+from math import ceil, floor, log10
+
+from trytond.config import config
+from trytond.i18n import gettext
+from trytond.model import (
+ ModelView, ModelSQL, DeactivableMixin, fields, Check, SymbolMixin)
+from trytond.model.exceptions import AccessError
+from trytond.pyson import Eval
+from trytond.transaction import Transaction
+
+from .exceptions import UOMValidationError
+
+__all__ = ['uom_conversion_digits']
+
+uom_conversion_digits = (
+ config.getint('product', 'uom_conversion_decimal', default=12),) * 2
+
+
+class UomCategory(ModelSQL, ModelView):
+ "Unit of Measure Category"
+ __name__ = 'product.uom.category'
+ name = fields.Char('Name', required=True, translate=True)
+ uoms = fields.One2Many('product.uom', 'category', "Units of Measure")
+
+ @classmethod
+ def __setup__(cls):
+ super(UomCategory, cls).__setup__()
+ cls._order.insert(0, ('name', 'ASC'))
+
+
+class Uom(SymbolMixin, DeactivableMixin, ModelSQL, ModelView):
+ "Unit of Measure"
+ __name__ = 'product.uom'
+ name = fields.Char("Name", size=None, required=True, translate=True)
+ symbol = fields.Char(
+ "Symbol", size=10, required=True, translate=True,
+ help="The symbol that represents the unit of measure.")
+ category = fields.Many2One(
+ 'product.uom.category', "Category", required=True, ondelete='RESTRICT',
+ help="The category that contains the unit of measure.\n"
+ "Conversions between different units of measure can be done if they "
+ "are in the same category.")
+ rate = fields.Float(
+ "Rate", digits=uom_conversion_digits, required=True,
+ help="The coefficient for the formula:\n"
+ "1 (base unit) = coef (this unit)")
+ factor = fields.Float(
+ "Factor", digits=uom_conversion_digits, required=True,
+ help="The coefficient for the formula:\n"
+ "coefficient (base unit) = 1 (this unit)")
+ rounding = fields.Float(
+ "Rounding Precision", digits=(12, Eval('digits', 12)), required=True,
+ domain=[
+ ('rounding', '>', 0),
+ ],
+ depends=['digits'],
+ help="The accuracy to which values are rounded.")
+ digits = fields.Integer(
+ "Display Digits", required=True,
+ help="The number of digits to display after the decimal separator.")
+
+ @classmethod
+ def __setup__(cls):
+ super(Uom, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_constraints += [
+ ('non_zero_rate_factor', Check(t, (t.rate != 0) | (t.factor != 0)),
+ 'product.msg_uom_no_zero_factor_rate')
+ ]
+ cls._order.insert(0, ('name', 'ASC'))
+
+ @classmethod
+ def check_xml_record(cls, records, values):
+ return True
+
+ @staticmethod
+ def default_rate():
+ return 1.0
+
+ @staticmethod
+ def default_factor():
+ return 1.0
+
+ @staticmethod
+ def default_rounding():
+ return 0.01
+
+ @staticmethod
+ def default_digits():
+ return 2
+
+ @fields.depends('factor')
+ def on_change_factor(self):
+ if (self.factor or 0.0) == 0.0:
+ self.rate = 0.0
+ else:
+ self.rate = round(1.0 / self.factor, uom_conversion_digits[1])
+
+ @fields.depends('rate')
+ def on_change_rate(self):
+ if (self.rate or 0.0) == 0.0:
+ self.factor = 0.0
+ else:
+ self.factor = round(
+ 1.0 / self.rate, uom_conversion_digits[1])
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ if clause[1].startswith('!') or clause[1].startswith('not '):
+ bool_op = 'AND'
+ else:
+ bool_op = 'OR'
+ return [bool_op,
+ (cls._rec_name,) + tuple(clause[1:]),
+ ('symbol',) + tuple(clause[1:]),
+ ]
+
+ def round(self, number):
+ return _round(self, number, func=round)
+
+ def ceil(self, number):
+ return _round(self, number, func=ceil)
+
+ def floor(self, number):
+ return _round(self, number, func=floor)
+
+ @classmethod
+ def validate(cls, uoms):
+ super(Uom, cls).validate(uoms)
+ for uom in uoms:
+ uom.check_factor_and_rate()
+
+ def check_factor_and_rate(self):
+ "Check coherence between factor and rate"
+ if self.rate == self.factor == 0.0:
+ return
+ if (self.rate != round(
+ 1.0 / self.factor, uom_conversion_digits[1])
+ and self.factor != round(
+ 1.0 / self.rate, uom_conversion_digits[1])):
+ raise UOMValidationError(
+ gettext('product.msg_uom_incompatible_factor_rate',
+ uom=self.rec_name))
+
+ @classmethod
+ def write(cls, *args):
+ if Transaction().user == 0:
+ super(Uom, cls).write(*args)
+ return
+
+ actions = iter(args)
+ all_uoms = []
+ for uoms, values in zip(actions, actions):
+ if 'rate' not in values and 'factor' not in values \
+ and 'category' not in values:
+ continue
+ all_uoms += uoms
+
+ old_uom = dict((uom.id, (uom.factor, uom.rate, uom.category))
+ for uom in all_uoms)
+
+ super(Uom, cls).write(*args)
+
+ for uom in all_uoms:
+ for i, field in enumerate(['factor', 'rate', 'category']):
+ if getattr(uom, field) != old_uom[uom.id][i]:
+ raise AccessError(
+ gettext('product.msg_uom_modify_%s' % field,
+ uom=uom.rec_name),
+ gettext('product.msg_uom_modify_options'))
+
+ @property
+ def accurate_field(self):
+ """
+ Select the more accurate field.
+ It chooses the field that has the least decimal.
+ """
+ return _accurate_operator(self.factor, self.rate)
+
+ @classmethod
+ def compute_qty(cls, from_uom, qty, to_uom, round=True,
+ factor=None, rate=None):
+ """
+ Convert quantity for given uom's.
+
+ When converting between uom's from different categories the factor and
+ rate provide the ratio to use to convert between the category's base
+ uom's.
+ """
+ if not qty or (from_uom is None and to_uom is None):
+ return qty
+ if from_uom is None:
+ raise ValueError("missing from_uom")
+ if to_uom is None:
+ raise ValueError("missing to_uom")
+ if from_uom.category.id != to_uom.category.id:
+ if not factor and not rate:
+ raise ValueError(
+ "cannot convert between %s and %s without a factor or rate"
+ % (from_uom.category.name, to_uom.category.name))
+ elif factor or rate:
+ raise ValueError("factor and rate not allowed for same category")
+
+ if from_uom.accurate_field == 'factor':
+ amount = qty * from_uom.factor
+ else:
+ amount = qty / from_uom.rate
+
+ if factor and rate:
+ if _accurate_operator(factor, rate) == 'rate':
+ factor = None
+ else:
+ rate = None
+ if factor:
+ amount *= factor
+ elif rate:
+ amount /= rate
+
+ if to_uom.accurate_field == 'factor':
+ amount = amount / to_uom.factor
+ else:
+ amount = amount * to_uom.rate
+
+ if round:
+ amount = to_uom.round(amount)
+
+ return amount
+
+ @classmethod
+ def compute_price(cls, from_uom, price, to_uom, factor=None, rate=None):
+ """
+ Convert price for given uom's.
+
+ When converting between uom's from different categories the factor and
+ rate provide the ratio to use to convert between the category's base
+ uom's.
+ """
+ if not price or (from_uom is None and to_uom is None):
+ return price
+ if from_uom is None:
+ raise ValueError("missing from_uom")
+ if to_uom is None:
+ raise ValueError("missing to_uom")
+ if from_uom.category.id != to_uom.category.id:
+ if not factor and not rate:
+ raise ValueError(
+ "cannot convert between %s and %s without a factor or rate"
+ % (from_uom.category.name, to_uom.category.name))
+ elif factor or rate:
+ raise ValueError("factor and rate not allow for same category")
+
+ format_ = '%%.%df' % uom_conversion_digits[1]
+
+ if from_uom.accurate_field == 'factor':
+ new_price = price / Decimal(format_ % from_uom.factor)
+ else:
+ new_price = price * Decimal(format_ % from_uom.rate)
+
+ if factor and rate:
+ if _accurate_operator(factor, rate) == 'rate':
+ factor = None
+ else:
+ rate = None
+ if factor:
+ new_price /= Decimal(factor)
+ elif rate:
+ new_price *= Decimal(rate)
+
+ if to_uom.accurate_field == 'factor':
+ new_price = new_price * Decimal(format_ % to_uom.factor)
+ else:
+ new_price = new_price / Decimal(format_ % to_uom.rate)
+
+ return new_price
+
+
+def _round(uom, number, func=round):
+ if not number:
+ # Avoid unnecessary computation
+ return number
+ precision = uom.rounding
+ # Convert precision into an integer greater than 1 to avoid precision lost.
+ # This works for most cases because rounding is often: n * 10**i
+ if precision < 1:
+ exp = -floor(log10(precision))
+ factor = 10 ** exp
+ number *= factor
+ precision *= factor
+ else:
+ factor = 1
+ # Divide by factor which is an integer to avoid precision lost due to
+ # multiplication by float < 1.
+ # example:
+ # >>> 3 * 0.1
+ # 0.30000000000000004
+ # >>> 3 / 10.
+ # 0.3
+ return func(number / precision) * precision / factor
+
+
+def _accurate_operator(factor, rate):
+ lengths = {}
+ for name, value in [('rate', rate), ('factor', factor)]:
+ format_ = '%%.%df' % uom_conversion_digits[1]
+ lengths[name] = len((format_ % value).split('.')[1].rstrip('0'))
+ if lengths['rate'] < lengths['factor']:
+ return 'rate'
+ elif lengths['factor'] < lengths['rate']:
+ return 'factor'
+ elif factor >= 1.0:
+ return 'factor'
+ else:
+ return 'rate'
diff --git a/modules/product/uom.xml b/modules/product/uom.xml
new file mode 100644
index 0000000000..00515dfb13
--- /dev/null
+++ b/modules/product/uom.xml
@@ -0,0 +1,353 @@
+
+
+
+
+
+ product.uom
+ tree
+ uom_tree
+
+
+ product.uom
+ form
+ uom_form
+
+
+ Units of Measure
+ product.uom
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ product.uom.category
+ tree
+ uom_category_tree
+
+
+
+ product.uom.category
+ form
+ uom_category_form
+
+
+
+ Categories
+ product.uom.category
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Units
+
+
+ Unit
+ u
+
+
+
+
+
+
+
+
+ Weight
+
+
+ Kilogram
+ kg
+
+
+
+
+
+ Gram
+ g
+
+
+
+
+
+ Carat
+ c
+
+
+
+
+
+ Pound
+ lb
+
+
+
+
+
+ Ounce
+ oz
+
+
+
+
+
+
+ Time
+
+
+ Second
+ s
+
+
+
+
+
+ Minute
+ min
+
+
+
+
+
+ Hour
+ h
+
+
+
+
+
+ Work Day
+ wd
+
+
+
+
+
+ Day
+ d
+
+
+
+
+
+
+
+ Length
+
+
+ Meter
+ m
+
+
+
+
+
+ Kilometer
+ km
+
+
+
+
+
+ centimeter
+ cm
+
+
+
+
+
+ Millimeter
+ mm
+
+
+
+
+
+ Foot
+ ft
+
+
+
+
+
+ Yard
+ yd
+
+
+
+
+
+ Inch
+ in
+
+
+
+
+
+ Mile
+ mi
+
+
+
+
+
+
+ Volume
+
+
+ Cubic meter
+ m³
+
+
+
+
+
+ Liter
+ l
+
+
+
+
+
+ Cubic centimeter
+ cm³
+
+
+
+
+
+ Cubic inch
+ in³
+
+
+
+
+
+ Cubic foot
+ ft³
+
+
+
+
+
+ Gallon
+ gal
+
+
+
+
+
+
+ Surface
+
+
+ Square meter
+ m²
+
+
+
+
+
+ Square centimeter
+ cm²
+
+
+
+
+
+ Are
+ a
+
+
+
+
+
+ Hectare
+ ha
+
+
+
+
+
+ Square inch
+ in²
+
+
+
+
+
+ Square foot
+ ft²
+
+
+
+
+
+ Square yard
+ yd²
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product/view/category_form.xml b/modules/product/view/category_form.xml
new file mode 100644
index 0000000000..74d63b56cb
--- /dev/null
+++ b/modules/product/view/category_form.xml
@@ -0,0 +1,18 @@
+
+
+
diff --git a/modules/product/view/category_list.xml b/modules/product/view/category_list.xml
new file mode 100644
index 0000000000..7381da633a
--- /dev/null
+++ b/modules/product/view/category_list.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/modules/product/view/category_product_form.xml b/modules/product/view/category_product_form.xml
new file mode 100644
index 0000000000..6e74425001
--- /dev/null
+++ b/modules/product/view/category_product_form.xml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/modules/product/view/category_tree.xml b/modules/product/view/category_tree.xml
new file mode 100644
index 0000000000..e963d4392e
--- /dev/null
+++ b/modules/product/view/category_tree.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/product/view/configuration_form.xml b/modules/product/view/configuration_form.xml
new file mode 100644
index 0000000000..d154a9386f
--- /dev/null
+++ b/modules/product/view/configuration_form.xml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/modules/product/view/identifier_form.xml b/modules/product/view/identifier_form.xml
new file mode 100644
index 0000000000..60fcd6f3eb
--- /dev/null
+++ b/modules/product/view/identifier_form.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/modules/product/view/identifier_list.xml b/modules/product/view/identifier_list.xml
new file mode 100644
index 0000000000..c7486f9a47
--- /dev/null
+++ b/modules/product/view/identifier_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/product/view/identifier_list_sequence.xml b/modules/product/view/identifier_list_sequence.xml
new file mode 100644
index 0000000000..27500023d2
--- /dev/null
+++ b/modules/product/view/identifier_list_sequence.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/product/view/product_form.xml b/modules/product/view/product_form.xml
new file mode 100644
index 0000000000..ebe3f2c9e2
--- /dev/null
+++ b/modules/product/view/product_form.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product/view/product_form_simple.xml b/modules/product/view/product_form_simple.xml
new file mode 100644
index 0000000000..d62d398634
--- /dev/null
+++ b/modules/product/view/product_form_simple.xml
@@ -0,0 +1,20 @@
+
+
+
diff --git a/modules/product/view/product_tree.xml b/modules/product/view/product_tree.xml
new file mode 100644
index 0000000000..14ea7b5726
--- /dev/null
+++ b/modules/product/view/product_tree.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/modules/product/view/product_tree_simple.xml b/modules/product/view/product_tree_simple.xml
new file mode 100644
index 0000000000..8470f20573
--- /dev/null
+++ b/modules/product/view/product_tree_simple.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/modules/product/view/template_form.xml b/modules/product/view/template_form.xml
new file mode 100644
index 0000000000..b374d338da
--- /dev/null
+++ b/modules/product/view/template_form.xml
@@ -0,0 +1,37 @@
+
+
+
diff --git a/modules/product/view/template_tree.xml b/modules/product/view/template_tree.xml
new file mode 100644
index 0000000000..2f87dad3be
--- /dev/null
+++ b/modules/product/view/template_tree.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product/view/uom_category_form.xml b/modules/product/view/uom_category_form.xml
new file mode 100644
index 0000000000..863978d287
--- /dev/null
+++ b/modules/product/view/uom_category_form.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/modules/product/view/uom_category_tree.xml b/modules/product/view/uom_category_tree.xml
new file mode 100644
index 0000000000..b4d89538b1
--- /dev/null
+++ b/modules/product/view/uom_category_tree.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/modules/product/view/uom_form.xml b/modules/product/view/uom_form.xml
new file mode 100644
index 0000000000..c67aec32e3
--- /dev/null
+++ b/modules/product/view/uom_form.xml
@@ -0,0 +1,21 @@
+
+
+
diff --git a/modules/product/view/uom_tree.xml b/modules/product/view/uom_tree.xml
new file mode 100644
index 0000000000..b014f49829
--- /dev/null
+++ b/modules/product/view/uom_tree.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product_cost_warehouse/.drone.yml b/modules/product_cost_warehouse/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/product_cost_warehouse/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/product_cost_warehouse/.flake8 b/modules/product_cost_warehouse/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/product_cost_warehouse/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/product_cost_warehouse/CHANGELOG b/modules/product_cost_warehouse/CHANGELOG
new file mode 100644
index 0000000000..d1218f8d23
--- /dev/null
+++ b/modules/product_cost_warehouse/CHANGELOG
@@ -0,0 +1,14 @@
+Version 6.0.4 - 2022-09-06
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.3 - 2022-01-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.2 - 2021-10-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.1 - 2021-08-19
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Initial release
diff --git a/modules/product_cost_warehouse/COPYRIGHT b/modules/product_cost_warehouse/COPYRIGHT
new file mode 100644
index 0000000000..d0b4a3655d
--- /dev/null
+++ b/modules/product_cost_warehouse/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2020-2022 B2CK
+Copyright (C) 2020-2022 Cédric Krier
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/product_cost_warehouse/LICENSE b/modules/product_cost_warehouse/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/product_cost_warehouse/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/product_cost_warehouse/MANIFEST.in b/modules/product_cost_warehouse/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/product_cost_warehouse/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/product_cost_warehouse/README.rst b/modules/product_cost_warehouse/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/product_cost_warehouse/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/product_cost_warehouse/__init__.py b/modules/product_cost_warehouse/__init__.py
new file mode 100644
index 0000000000..60c7057b79
--- /dev/null
+++ b/modules/product_cost_warehouse/__init__.py
@@ -0,0 +1,37 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import ir
+from . import company
+from . import product
+from . import stock
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ ir.Cron,
+ ir.CronWarehouse,
+ company.Company,
+ product.Configuration,
+ product.ConfigurationCostPriceWarehouse,
+ product.Product,
+ product.CostPrice,
+ product.CostPriceRevision,
+ stock.Configuration,
+ stock.ConfigurationLocation,
+ stock.Location,
+ stock.Move,
+ stock.ShipmentInternal,
+ module='product_cost_warehouse', type_='model')
+ Pool.register(
+ product.ProductCostHistory,
+ module='product_cost_warehouse', type_='model',
+ depends=['product_cost_history'])
+ Pool.register(
+ product.ModifyCostPrice,
+ module='product_cost_warehouse', type_='wizard')
+ Pool.register(
+ module='product_cost_warehouse', type_='report')
diff --git a/modules/product_cost_warehouse/company.py b/modules/product_cost_warehouse/company.py
new file mode 100644
index 0000000000..cf0c0c3e0f
--- /dev/null
+++ b/modules/product_cost_warehouse/company.py
@@ -0,0 +1,21 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import copy
+from trytond.model import fields
+from trytond.pool import PoolMeta, Pool
+
+from .product import cost_price_warehouse
+
+
+class Company(metaclass=PoolMeta):
+ __name__ = 'company.company'
+
+ cost_price_warehouse = fields.Function(
+ copy.deepcopy(cost_price_warehouse), 'get_cost_price_warehouse')
+
+ def get_cost_price_warehouse(self, name, **pattern):
+ pool = Pool()
+ Configuration = pool.get('product.configuration')
+ config = Configuration(1)
+ pattern['company'] = self.id
+ return config.get_multivalue('cost_price_warehouse', **pattern)
diff --git a/modules/product_cost_warehouse/doc/conf.py b/modules/product_cost_warehouse/doc/conf.py
new file mode 100644
index 0000000000..8513b72dd2
--- /dev/null
+++ b/modules/product_cost_warehouse/doc/conf.py
@@ -0,0 +1,61 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+modules_url = 'https://docs.tryton.org/projects/modules-{module}/en/{series}/'
+trytond_url = 'https://docs.tryton.org/projects/server/en/{series}/'
+
+
+def get_info():
+ import configparser
+ import os
+ import subprocess
+ import sys
+
+ module_dir = os.path.dirname(os.path.dirname(__file__))
+
+ config = configparser.ConfigParser()
+ config.read_file(open(os.path.join(module_dir, 'tryton.cfg')))
+ info = dict(config.items('tryton'))
+
+ result = subprocess.run(
+ [sys.executable, 'setup.py', '--name'],
+ stdout=subprocess.PIPE, check=True, cwd=module_dir)
+ info['name'] = result.stdout.decode('utf-8').strip()
+
+ result = subprocess.run(
+ [sys.executable, 'setup.py', '--version'],
+ stdout=subprocess.PIPE, check=True, cwd=module_dir)
+ version = result.stdout.decode('utf-8').strip()
+ if 'dev' in version:
+ info['series'] = 'latest'
+ else:
+ info['series'] = '.'.join(version.split('.', 2)[:2])
+
+ for key in {'depends', 'extras_depend'}:
+ info[key] = info.get(key, '').strip().splitlines()
+ info['modules'] = set(info['depends'] + info['extras_depend'])
+ info['modules'] -= {'ir', 'res'}
+
+ return info
+
+
+info = get_info()
+
+master_doc = 'index'
+project = info['name']
+release = version = info['series']
+default_role = 'ref'
+highlight_language = 'none'
+extensions = [
+ 'sphinx.ext.intersphinx',
+ ]
+intersphinx_mapping = {
+ 'trytond': (trytond_url.format(series=version), None),
+ }
+intersphinx_mapping.update({
+ m: (modules_url.format(
+ module=m.replace('_', '-'), series=version), None)
+ for m in info['modules']
+ })
+
+del get_info, info, modules_url, trytond_url
diff --git a/modules/product_cost_warehouse/doc/index.rst b/modules/product_cost_warehouse/doc/index.rst
new file mode 100644
index 0000000000..4e822258a4
--- /dev/null
+++ b/modules/product_cost_warehouse/doc/index.rst
@@ -0,0 +1,11 @@
+#############################
+Product Cost Warehouse Module
+#############################
+
+The *Product Cost Warehouse Module* allows the cost price of products to
+be calculated separately for each warehouse.
+
+.. toctree::
+ :maxdepth: 2
+
+ usage
diff --git a/modules/product_cost_warehouse/doc/usage.rst b/modules/product_cost_warehouse/doc/usage.rst
new file mode 100644
index 0000000000..fb573ce0d8
--- /dev/null
+++ b/modules/product_cost_warehouse/doc/usage.rst
@@ -0,0 +1,45 @@
+*****
+Usage
+*****
+
+.. _Activating cost prices per warehouse:
+
+Activating cost prices per warehouse
+====================================
+
+In order to calculate and see `Product ` cost prices
+per warehouse, the :guilabel:`Cost Price Warehouse` option must be checked in
+the `Product Configuration `.
+
+Any `Storage Locations ` that are not under a
+`Warehouse ` also need linking to a
+cost warehouse.
+
+You must also ensure that the `Scheduled Task ` that
+recalculates the cost prices is configured to run for each different
+warehouse.
+
+.. note::
+
+ Once you have activated the cost prices per warehouse if you then want
+ to deactivate it you may need to manually run a recalculation of all the
+ products' cost prices.
+
+.. _Viewing product cost prices:
+
+Viewing product cost prices
+===========================
+
+With this module activated each `Product's ` cost
+price is shown based on your current `Company `
+and `Warehouse `.
+These can be updated in your user preferences.
+
+.. _Moving stock between warehouses:
+
+Moving stock between warehouses
+===============================
+
+If you have checked the :guilabel:`Cost Price Warehouse` option, then to move
+stock between different `Warehouses `
+you must always use a transit `Location `.
diff --git a/modules/product_cost_warehouse/ir.py b/modules/product_cost_warehouse/ir.py
new file mode 100644
index 0000000000..cf1cd75d6e
--- /dev/null
+++ b/modules/product_cost_warehouse/ir.py
@@ -0,0 +1,39 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import ModelSQL, ModelView, fields, dualmethod
+from trytond.pool import PoolMeta
+from trytond.transaction import Transaction
+
+
+class Cron(metaclass=PoolMeta):
+ __name__ = 'ir.cron'
+ warehouses = fields.Many2Many(
+ 'ir.cron-stock.warehouse', 'cron', 'warehouse',
+ "Warehouses",
+ domain=[
+ ('type', '=', 'warehouse'),
+ ],
+ help="Warehouses registered for this cron.")
+
+ @dualmethod
+ @ModelView.button
+ def run_once(cls, crons):
+ for cron in crons:
+ if not cron.warehouses:
+ super().run_once([cron])
+ else:
+ for warehouse in cron.warehouses:
+ with Transaction().set_context(warehouse=warehouse.id):
+ super(Cron, cls).run_once([cron])
+
+
+class CronWarehouse(ModelSQL):
+ "Cron - Warehouse"
+ __name__ = 'ir.cron-stock.warehouse'
+ cron = fields.Many2One(
+ 'ir.cron', "Cron", ondelete='CASCADE', required=True)
+ warehouse = fields.Many2One(
+ 'stock.location', "Warehouse", ondelete='CASCADE', required=True,
+ domain=[
+ ('type', '=', 'warehouse'),
+ ])
diff --git a/modules/product_cost_warehouse/ir.xml b/modules/product_cost_warehouse/ir.xml
new file mode 100644
index 0000000000..e675477c38
--- /dev/null
+++ b/modules/product_cost_warehouse/ir.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ ir.cron
+
+ ir_cron_form
+
+
+
diff --git a/modules/product_cost_warehouse/locale/bg.po b/modules/product_cost_warehouse/locale/bg.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/bg.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/ca.po b/modules/product_cost_warehouse/locale/ca.po
new file mode 100644
index 0000000000..e53f1975c4
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/ca.po
@@ -0,0 +1,85 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Preu de cost per magatzem"
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr "Magatzems"
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr "Tasca programada"
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Preu de cost per magatzem"
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Preu de cost per magatzem"
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr "Magatzem obligatori"
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr "Magatzem obligatori"
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr "Cost per magatzem"
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Calcula el preu de cost per a cada magatzem."
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr "Magatzems registrats per aquesta tasca programada."
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Calcula el preu de cost per a cada magatzem."
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Calcula el preu de cost per a cada magatzem."
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr "Tasca programada - Magatzem"
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+"Per moure productes entre les ubicacions \"%(from_)s\" i \"%(to)s\", heu "
+"d'utilitzar la ubicació de transit dels albarans interns."
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr "Configuració del producte preu de cost per magatzem"
diff --git a/modules/product_cost_warehouse/locale/cs.po b/modules/product_cost_warehouse/locale/cs.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/cs.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/de.po b/modules/product_cost_warehouse/locale/de.po
new file mode 100644
index 0000000000..fc7fae77dd
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/de.po
@@ -0,0 +1,85 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Einstandspreis pro Warenlager"
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr "Warenlager"
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr "Zeitplaner"
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr "Warenlager"
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Einstandspreis pro Warenlager"
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Einstandspreis pro Warenlager"
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr "Warenlager"
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr "Warenlager erforderlich"
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr "Warenlager"
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr "Warenlager erforderlich"
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr "Kosten Warenlager"
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Artikeleinstandskosten je Warenlager berechnen."
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr "Die Warenlager, die für diese geplante Aktion registriert wurden."
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Artikeleinstandskosten je Warenlager berechnen."
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Artikeleinstandskosten je Warenlager berechnen."
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr "Zeitplaner - Warenlager"
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+"Um Artikel zwischen \"%(from_)s\" und \"%(to)s\" zu bewegen, muss der "
+"Transitlagerort für interne Lieferungen verwendet werden."
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr "Artikel Einstellungen Einstandskosten Pro Warenlager"
diff --git a/modules/product_cost_warehouse/locale/es.po b/modules/product_cost_warehouse/locale/es.po
new file mode 100644
index 0000000000..b097bd9300
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/es.po
@@ -0,0 +1,85 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Precio de coste por almacén"
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr "Almacenes"
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr "Tarea programada"
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Precio de coste por almacén"
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Precio de coste por almacén"
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr "Almacén obligatorio"
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr "Almacén obligatorio"
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr "Coste por almacén"
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Calcular el precio de coste de producto por cada almacén."
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr "Almacenes registrados para esta tarea programada."
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Calcular el precio de coste de producto por cada almacén."
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Calcular el precio de coste del producto para cada almacén."
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr "Tarea programada - Almacén"
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+"Para mover productos entre \"%(from_)s\" y \"%(to)s\", se tiene que utilizar"
+" la ubicación de tránsito de los albaranes internos."
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr "Configuración del producto precio de coste por almacén"
diff --git a/modules/product_cost_warehouse/locale/es_419.po b/modules/product_cost_warehouse/locale/es_419.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/es_419.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/et.po b/modules/product_cost_warehouse/locale/et.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/et.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/fa.po b/modules/product_cost_warehouse/locale/fa.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/fa.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/fi.po b/modules/product_cost_warehouse/locale/fi.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/fi.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/fr.po b/modules/product_cost_warehouse/locale/fr.po
new file mode 100644
index 0000000000..bf14388855
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/fr.po
@@ -0,0 +1,85 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Prix de revient par entrepôt"
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr "Entrepôts"
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr "Tâche planifiée"
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Prix de revient par entrepôt"
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Prix de revient par entrepôt"
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr "Entrepôt requis"
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr "Entrepôt requis"
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr "Coût de l'entrepôt"
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Calculer un prix de revient des produits pour chaque entrepôt."
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr "Les entrepôts enregistrées pour cette action planifiée."
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Calculer un prix de revient des produits pour chaque entrepôt."
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Calculer un prix de revient des produits pour chaque entrepôt."
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr "Tâche planifiée - Entrepôt"
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+"Pour déplacer des produits entre « %(from_)s » et « %(to)s », vous devez "
+"utiliser l'emplacement de transit d'expédition interne."
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr "Configuration de prix de revient de produit par entrepôt"
diff --git a/modules/product_cost_warehouse/locale/hu.po b/modules/product_cost_warehouse/locale/hu.po
new file mode 100644
index 0000000000..5dff743eb3
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/hu.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Költségár raktáranként"
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr "Raktárak"
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Költségár raktáranként"
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Költségár raktáranként"
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "A termékek költségárát raktáranként tartsa nyilván a rendszer."
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "A termékek költségárát raktáranként tartsa nyilván a rendszer."
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "A termékek költségárát raktáranként tartsa nyilván a rendszer."
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/id.po b/modules/product_cost_warehouse/locale/id.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/id.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/it.po b/modules/product_cost_warehouse/locale/it.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/it.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/lo.po b/modules/product_cost_warehouse/locale/lo.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/lo.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/lt.po b/modules/product_cost_warehouse/locale/lt.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/lt.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/nl.po b/modules/product_cost_warehouse/locale/nl.po
new file mode 100644
index 0000000000..a169853a6e
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/nl.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Kostprijs per magazijn"
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr "Magazijnen"
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr "Cyclische opdracht"
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Kostprijs per magazijn"
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr "Kostprijs per magazijn"
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr "Magazijn vereist"
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr "Magazijn vereist"
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr "Kosten magazijn"
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Bereken de kostprijs van het product voor elk magazijn."
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr "Geregistreerde magazijnen voor deze cyclische opdracht."
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Bereken de kostprijs van het product voor elk magazijn."
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr "Bereken de kostprijs van het product voor elk magazijn."
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr "Cyclische opdracht - Magazijn"
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr "Productconfiguratie kostprijs per magazijn"
diff --git a/modules/product_cost_warehouse/locale/pl.po b/modules/product_cost_warehouse/locale/pl.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/pl.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/pt.po b/modules/product_cost_warehouse/locale/pt.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/pt.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/ro.po b/modules/product_cost_warehouse/locale/ro.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/ro.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/ru.po b/modules/product_cost_warehouse/locale/ru.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/ru.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/sl.po b/modules/product_cost_warehouse/locale/sl.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/sl.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/tr.po b/modules/product_cost_warehouse/locale/tr.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/tr.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/locale/zh_CN.po b/modules/product_cost_warehouse/locale/zh_CN.po
new file mode 100644
index 0000000000..a8d088698c
--- /dev/null
+++ b/modules/product_cost_warehouse/locale/zh_CN.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:company.company,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:ir.cron,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,cron:"
+msgid "Cron"
+msgstr ""
+
+msgctxt "field:ir.cron-stock.warehouse,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.configuration.cost_price_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Cost Price per Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,warehouse_required:"
+msgid "Warehouse Required"
+msgstr ""
+
+msgctxt "field:stock.location,cost_warehouse:"
+msgid "Cost Warehouse"
+msgstr ""
+
+msgctxt "help:company.company,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "help:ir.cron,warehouses:"
+msgid "Warehouses registered for this cron."
+msgstr ""
+
+msgctxt "help:product.configuration,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt ""
+"help:product.configuration.cost_price_warehouse,cost_price_warehouse:"
+msgid "Compute product cost price for each warehouse."
+msgstr ""
+
+msgctxt "model:ir.cron-stock.warehouse,name:"
+msgid "Cron - Warehouse"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_storage_location_same_warehouse"
+msgid ""
+"To move products between \"%(from_)s\" and \"%(to)s\", you must use the "
+"internal shipment transit location."
+msgstr ""
+
+msgctxt "model:product.configuration.cost_price_warehouse,name:"
+msgid "Product Configuration Cost Price per Warehouse"
+msgstr ""
diff --git a/modules/product_cost_warehouse/message.xml b/modules/product_cost_warehouse/message.xml
new file mode 100644
index 0000000000..d215568bd9
--- /dev/null
+++ b/modules/product_cost_warehouse/message.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ To move products between "%(from_)s" and "%(to)s", you must use the internal shipment transit location.
+
+
+
diff --git a/modules/product_cost_warehouse/product.py b/modules/product_cost_warehouse/product.py
new file mode 100644
index 0000000000..8010c53f2e
--- /dev/null
+++ b/modules/product_cost_warehouse/product.py
@@ -0,0 +1,253 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import ModelSQL, fields
+from trytond.pool import PoolMeta, Pool
+from trytond.pyson import Eval
+from trytond.transaction import Transaction
+
+from trytond.modules.company.model import CompanyValueMixin
+
+
+cost_price_warehouse = fields.Boolean(
+ "Cost Price per Warehouse",
+ help="Compute product cost price for each warehouse.")
+
+
+class Configuration(metaclass=PoolMeta):
+ __name__ = 'product.configuration'
+ cost_price_warehouse = fields.MultiValue(cost_price_warehouse)
+
+ @classmethod
+ def default_cost_price_warehouse(cls, **pattern):
+ return cls.multivalue_model(
+ 'cost_price_warehouse').default_cost_price_warehouse()
+
+
+class ConfigurationCostPriceWarehouse(ModelSQL, CompanyValueMixin):
+ "Product Configuration Cost Price per Warehouse"
+ __name__ = 'product.configuration.cost_price_warehouse'
+ cost_price_warehouse = cost_price_warehouse
+
+ @classmethod
+ def default_cost_price_warehouse(cls):
+ return False
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
+
+ def multivalue_records(self, field):
+ Value = self.multivalue_model(field)
+ records = super().multivalue_records(field)
+ if issubclass(Value, CostPrice):
+ # Sort to get record with empty warehouse at the end
+ records = sorted(records, key=lambda r: r.warehouse is None)
+ return records
+
+ def get_multivalue(self, name, **pattern):
+ pool = Pool()
+ Company = pool.get('company.company')
+ context = Transaction().context
+ Value = self.multivalue_model(name)
+ if issubclass(Value, CostPrice) and context.get('company'):
+ company = Company(context['company'])
+ if company.cost_price_warehouse:
+ pattern.setdefault('warehouse', context.get('warehouse'))
+ return super().get_multivalue(name, **pattern)
+
+ def set_multivalue(self, name, value, save=True, **pattern):
+ pool = Pool()
+ Company = pool.get('company.company')
+ context = Transaction().context
+ Value = self.multivalue_model(name)
+ if issubclass(Value, CostPrice) and context.get('company'):
+ company = Company(context['company'])
+ if company.cost_price_warehouse:
+ pattern.setdefault('warehouse', context.get('warehouse'))
+ return super().set_multivalue(name, value, save=save, **pattern)
+
+ @classmethod
+ def _domain_moves_cost(cls):
+ pool = Pool()
+ Company = pool.get('company.company')
+ context = Transaction().context
+ domain = super()._domain_moves_cost()
+ if context.get('company'):
+ company = Company(context['company'])
+ if company.cost_price_warehouse:
+ warehouse = context.get('warehouse')
+ domain = [
+ domain,
+ ['OR',
+ ('from_location', 'child_of', warehouse, 'parent'),
+ ('from_location.cost_warehouse', '=', warehouse),
+ ('to_location', 'child_of', warehouse, 'parent'),
+ ('to_location.cost_warehouse', '=', warehouse),
+ ],
+ ]
+ return domain
+
+ @classmethod
+ def _domain_in_moves_cost(cls):
+ pool = Pool()
+ Company = pool.get('company.company')
+ context = Transaction().context
+ domain = super()._domain_in_moves_cost()
+ if context.get('company'):
+ company = Company(context['company'])
+ if company.cost_price_warehouse:
+ warehouse = context.get('warehouse')
+ domain = ['OR',
+ domain,
+ [
+ ('from_location.type', '=', 'storage'),
+ ('to_location.type', '=', 'storage'),
+ ('from_location', 'not child_of', warehouse, 'parent'),
+ ['OR',
+ ('from_location.cost_warehouse', '!=', warehouse),
+ ('from_location.cost_warehouse', '=', None),
+ ],
+ ['OR',
+ ('to_location', 'child_of', warehouse, 'parent'),
+ ('to_location.cost_warehouse', '=', warehouse),
+ ],
+ ]
+ ]
+ return domain
+
+ @classmethod
+ def _domain_out_moves_cost(cls):
+ pool = Pool()
+ Company = pool.get('company.company')
+ context = Transaction().context
+ domain = super()._domain_out_moves_cost()
+ if context.get('company'):
+ company = Company(context['company'])
+ if company.cost_price_warehouse:
+ warehouse = context.get('warehouse')
+ domain = ['OR',
+ domain,
+ [
+ ('from_location.type', '=', 'storage'),
+ ('to_location.type', '=', 'storage'),
+ ('to_location', 'not child_of', warehouse, 'parent'),
+ ['OR',
+ ('to_location.cost_warehouse', '!=', warehouse),
+ ('to_location.cost_warehouse', '=', None),
+ ],
+ ['OR',
+ ('from_location', 'child_of', warehouse, 'parent'),
+ ('from_location.cost_warehouse', '=', warehouse),
+ ],
+ ]
+ ]
+ return domain
+
+ @classmethod
+ def _domain_storage_quantity(cls):
+ pool = Pool()
+ Company = pool.get('company.company')
+ context = Transaction().context
+ domain = super()._domain_storage_quantity()
+ if context.get('company'):
+ company = Company(context['company'])
+ if company.cost_price_warehouse:
+ warehouse = context.get('warehouse')
+ domain = [
+ domain,
+ ['OR',
+ ('parent', 'child_of', warehouse),
+ ('cost_warehouse', '=', warehouse),
+ ],
+ ]
+ return domain
+
+
+class CostPrice(metaclass=PoolMeta):
+ __name__ = 'product.cost_price'
+ warehouse = fields.Many2One(
+ 'stock.location', "Warehouse", ondelete='RESTRICT',
+ domain=[
+ ('type', '=', 'warehouse'),
+ ],
+ states={
+ 'required': Eval('warehouse_required', False),
+ },
+ depends=['warehouse_required'])
+ warehouse_required = fields.Function(fields.Boolean(
+ "Warehouse Required"), 'get_warehouse_required')
+
+ @classmethod
+ def get_warehouse_required(cls, records, name):
+ return {r.id: r.company.cost_price_warehouse for r in records}
+
+
+class CostPriceRevision(metaclass=PoolMeta):
+ __name__ = 'product.cost_price.revision'
+ warehouse = fields.Many2One(
+ 'stock.location', "Warehouse", ondelete='RESTRICT',
+ domain=[
+ ('type', '=', 'warehouse'),
+ ],
+ states={
+ 'required': Eval('warehouse_required', False),
+ },
+ depends=['warehouse_required'])
+ warehouse_required = fields.Function(fields.Boolean(
+ "Warehouse Required"), 'get_warehouse_required')
+
+ @classmethod
+ def default_warehouse(cls):
+ pool = Pool()
+ Company = pool.get('company.company')
+ company_id = cls.default_company()
+ if company_id:
+ company = Company(company_id)
+ if company.cost_price_warehouse:
+ return Transaction().context.get('warehouse')
+
+ @classmethod
+ def get_warehouse_required(cls, records, name):
+ return {r.id: r.company.cost_price_warehouse for r in records}
+
+ @classmethod
+ def _get_for_product_domain(cls):
+ pool = Pool()
+ Company = pool.get('company.company')
+ domain = super()._get_for_product_domain()
+ context = Transaction().context
+ if context.get('company'):
+ company = Company(context['company'])
+ if company.cost_price_warehouse:
+ domain = [
+ domain,
+ ('warehouse', '=', context.get('warehouse')),
+ ]
+ return domain
+
+
+class ModifyCostPrice(metaclass=PoolMeta):
+ __name__ = 'product.modify_cost_price'
+
+ def get_revision(self, Revision):
+ revision = super().get_revision(Revision)
+ if revision.company.cost_price_warehouse:
+ revision.warehouse = Transaction().context.get('warehouse')
+ return revision
+
+
+class ProductCostHistory(metaclass=PoolMeta):
+ __name__ = 'product.product.cost_history'
+
+ @classmethod
+ def _non_moves_clause(cls, history_table):
+ pool = Pool()
+ Company = pool.get('company.company')
+ clause = super()._non_moves_clause(history_table)
+ context = Transaction().context
+ if context.get('company'):
+ company = Company(context['company'])
+ if company.cost_price_warehouse:
+ warehouse = context.get('warehouse')
+ clause &= history_table.warehouse == warehouse
+ return clause
diff --git a/modules/product_cost_warehouse/product.xml b/modules/product_cost_warehouse/product.xml
new file mode 100644
index 0000000000..8d3ad1efb6
--- /dev/null
+++ b/modules/product_cost_warehouse/product.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ product.configuration
+
+ configuration_form
+
+
+
diff --git a/modules/product_cost_warehouse/setup.py b/modules/product_cost_warehouse/setup.py
new file mode 100755
index 0000000000..0901bd745f
--- /dev/null
+++ b/modules/product_cost_warehouse/setup.py
@@ -0,0 +1,159 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ content = io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+ content = re.sub(
+ r'(?m)^\.\. toctree::\r?\n((^$|^\s.*$)\r?\n)*', '', content)
+ return content
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_product_cost_warehouse'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = []
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [
+ get_require_version('proteus'),
+ get_require_version('trytond_product_cost_fifo'),
+ get_require_version('trytond_product_cost_history'),
+ get_require_version('trytond_account_stock_continental'),
+ ]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module to compute product cost per warehouse',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": (
+ 'https://docs.tryton.org/projects/modules-product-cost-warehouse'),
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/product_cost_warehouse',
+ },
+ keywords='tryton product cost warehouse',
+ package_dir={'trytond.modules.product_cost_warehouse': '.'},
+ packages=(
+ ['trytond.modules.product_cost_warehouse']
+ + ['trytond.modules.product_cost_warehouse.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.product_cost_warehouse': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.fodt',
+ 'icons/*.svg', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ product_cost_warehouse = trytond.modules.product_cost_warehouse
+ """, # noqa: E501
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/product_cost_warehouse/stock.py b/modules/product_cost_warehouse/stock.py
new file mode 100644
index 0000000000..fb2c4b048c
--- /dev/null
+++ b/modules/product_cost_warehouse/stock.py
@@ -0,0 +1,236 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from decimal import Decimal
+
+from trytond.i18n import gettext
+from trytond.model import fields
+from trytond.pool import PoolMeta, Pool
+from trytond.pyson import Eval, Bool
+from trytond.transaction import Transaction
+
+from trytond.modules.product import round_price
+from trytond.modules.stock.exceptions import MoveValidationError
+
+
+class Configuration(metaclass=PoolMeta):
+ __name__ = 'stock.configuration'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.shipment_internal_transit.domain = [
+ cls.shipment_internal_transit.domain,
+ ('cost_warehouse', '=', None),
+ ]
+
+
+class ConfigurationLocation(metaclass=PoolMeta):
+ __name__ = 'stock.configuration.location'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.shipment_internal_transit.domain = [
+ cls.shipment_internal_transit.domain,
+ ('cost_warehouse', '=', None),
+ ]
+
+
+class Location(metaclass=PoolMeta):
+ __name__ = 'stock.location'
+
+ cost_warehouse = fields.Many2One(
+ 'stock.location', "Cost Warehouse",
+ domain=[
+ ('type', '=', 'warehouse'),
+ ],
+ states={
+ 'invisible': (
+ (Eval('type') != 'storage')
+ | Bool(Eval('warehouse'))
+ | (Eval('id', -1) < 0)),
+ },
+ depends=['type', 'warehouse'])
+
+
+class Move(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+
+ @property
+ def from_cost_warehouse(self):
+ return (self.from_location.warehouse
+ or self.from_location.cost_warehouse)
+
+ @property
+ def to_cost_warehouse(self):
+ return (self.to_location.warehouse
+ or self.to_location.cost_warehouse)
+
+ @property
+ def cost_warehouse(self):
+ return self.from_cost_warehouse or self.to_cost_warehouse
+
+ @fields.depends('company', 'from_location', 'to_location')
+ def on_change_with_unit_price_required(self, name=None):
+ required = super().on_change_with_unit_price_required(name=name)
+ if (self.company and self.company.cost_price_warehouse
+ and self.from_location and self.to_location
+ and self.from_cost_warehouse != self.to_cost_warehouse):
+ required = True
+ return required
+
+ @fields.depends('company', 'from_location', 'to_location')
+ def on_change_with_cost_price_required(self, name=None):
+ required = super().on_change_with_cost_price_required(name=name)
+ if (self.company and self.company.cost_price_warehouse
+ and self.from_location and self.to_location
+ and self.from_cost_warehouse != self.to_cost_warehouse):
+ required = True
+ return required
+
+ @classmethod
+ def get_unit_price_company(cls, moves, name):
+ pool = Pool()
+ ShipmentInternal = pool.get('stock.shipment.internal')
+ Uom = pool.get('product.uom')
+ prices = super().get_unit_price_company(moves, name)
+ for move in moves:
+ if (move.company.cost_price_warehouse
+ and move.from_cost_warehouse != move.to_cost_warehouse
+ and move.to_cost_warehouse
+ and isinstance(move.shipment, ShipmentInternal)):
+ cost = total_qty = 0
+ for outgoing_move in move.shipment.outgoing_moves:
+ if outgoing_move.product == move.product:
+ qty = Uom.compute_qty(
+ outgoing_move.uom, outgoing_move.quantity,
+ move.product.default_uom)
+ qty = Decimal(str(qty))
+ cost += qty * outgoing_move.cost_price
+ total_qty += qty
+ if cost and total_qty:
+ cost_price = round_price(cost / total_qty)
+ prices[move.id] = cost_price
+ return prices
+
+ def get_cost_price(self, product_cost_price=None):
+ pool = Pool()
+ ShipmentInternal = pool.get('stock.shipment.internal')
+ cost_price = super().get_cost_price(
+ product_cost_price=product_cost_price)
+ if (self.company.cost_price_warehouse
+ and self.from_cost_warehouse != self.to_cost_warehouse
+ and self.to_cost_warehouse
+ and isinstance(self.shipment, ShipmentInternal)):
+ cost_price = self.unit_price_company
+ return cost_price
+
+ @classmethod
+ def validate(cls, moves):
+ pool = Pool()
+ Configuration = pool.get('stock.configuration')
+ super().validate(moves)
+ config = Configuration(1)
+ transit_locations = {}
+ for move in moves:
+ if move.state in {'staging', 'draft'}:
+ continue
+ company = move.company
+ if company not in transit_locations:
+ transit_location = config.get_multivalue(
+ 'shipment_internal_transit', company=company)
+ transit_locations[company] = transit_location
+ else:
+ transit_location = transit_locations[company]
+ if (company.cost_price_warehouse
+ and move.from_location.type == 'storage'
+ and move.from_location != transit_location
+ and move.to_location.type == 'storage'
+ and move.to_location != transit_location):
+ if move.from_cost_warehouse != move.to_cost_warehouse:
+ raise MoveValidationError(gettext(
+ 'product_cost_warehouse'
+ '.msg_move_storage_location_same_warehouse',
+ from_=move.from_location.rec_name,
+ to=move.to_location.rec_name))
+
+ def _do(self):
+ cost_price = super()._do()
+ if (self.company.cost_price_warehouse
+ and self.from_location.type == 'storage'
+ and self.to_location.type == 'storage'
+ and self.from_cost_warehouse != self.to_cost_warehouse):
+ if self.from_cost_warehouse:
+ cost_price = self._compute_product_cost_price('out')
+ elif self.to_cost_warehouse:
+ cost_price = self._compute_product_cost_price(
+ 'in', self.unit_price_company)
+ return cost_price
+
+ @property
+ def _cost_price_pattern(self):
+ pattern = super()._cost_price_pattern
+ if self.company.cost_price_warehouse:
+ pattern['warehouse'] = (
+ self.cost_warehouse.id if self.cost_warehouse else None)
+ return pattern
+
+ def _cost_price_key(self):
+ key = super()._cost_price_key()
+ if self.company.cost_price_warehouse:
+ key += (('warehouse',
+ (self.cost_warehouse.id if self.cost_warehouse else None)),
+ )
+ return key
+
+ @classmethod
+ def _cost_price_context(cls, moves):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ context = super()._cost_price_context(moves)
+ if moves[0].company.cost_price_warehouse:
+ warehouse = moves[0].cost_warehouse
+ locations = Location.search([
+ ('type', '=', 'storage'),
+ ['OR',
+ ('parent', 'child_of',
+ warehouse.id if warehouse else []),
+ ('cost_warehouse', '=',
+ warehouse.id if warehouse else None),
+ ],
+ ])
+ context['locations'] = [l.id for l in locations]
+ return context
+
+ def get_fifo_move(self, quantity=0.0, date=None):
+ warehouse = self.cost_warehouse.id if self.cost_warehouse else None
+ with Transaction().set_context(warehouse=warehouse):
+ return super().get_fifo_move(quantity=quantity, date=date)
+
+ def _get_account_stock_move_type(self):
+ type_ = super()._get_account_stock_move_type()
+ if (self.company.cost_price_warehouse
+ and self.from_location.type == 'storage'
+ and self.to_location.type == 'storage'
+ and self.from_cost_warehouse != self.to_cost_warehouse):
+ if self.from_cost_warehouse and not self.to_cost_warehouse:
+ type_ = 'out_warehouse'
+ elif not self.from_cost_warehouse and self.to_cost_warehouse:
+ type_ = 'in_warehouse'
+ return type_
+
+
+class ShipmentInternal(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.internal'
+
+ @fields.depends('company')
+ def on_change_with_transit_location(self, name=None):
+ pool = Pool()
+ Config = pool.get('stock.configuration')
+ location = super().on_change_with_transit_location(name=name)
+ if not location and self.company and self.company.cost_price_warehouse:
+ location = Config(1).get_multivalue(
+ 'shipment_internal_transit', company=self.company)
+ if location:
+ location = location.id
+ return location
diff --git a/modules/product_cost_warehouse/stock.xml b/modules/product_cost_warehouse/stock.xml
new file mode 100644
index 0000000000..e90caf73be
--- /dev/null
+++ b/modules/product_cost_warehouse/stock.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ stock.location
+
+ stock_location_form
+
+
+
diff --git a/modules/product_cost_warehouse/tests/__init__.py b/modules/product_cost_warehouse/tests/__init__.py
new file mode 100644
index 0000000000..f1d31b4453
--- /dev/null
+++ b/modules/product_cost_warehouse/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.product_cost_warehouse.tests.test_product_cost_warehouse import suite # noqa: E501
+except ImportError:
+ from .test_product_cost_warehouse import suite
+
+__all__ = ['suite']
diff --git a/modules/product_cost_warehouse/tests/scenario_account_stock_continental.rst b/modules/product_cost_warehouse/tests/scenario_account_stock_continental.rst
new file mode 100644
index 0000000000..3528845561
--- /dev/null
+++ b/modules/product_cost_warehouse/tests/scenario_account_stock_continental.rst
@@ -0,0 +1,132 @@
+==================================
+Account Stock Continental Scenario
+==================================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import (
+ ... create_company, get_company)
+ >>> from trytond.modules.account.tests.tools import (
+ ... create_fiscalyear, create_chart, get_accounts)
+ >>> from trytond.modules.account_stock_continental.tests.tools import (
+ ... add_stock_accounts)
+
+Activate product_cost_warehouse::
+
+ >>> config = activate_modules([
+ ... 'product_cost_warehouse', 'account_stock_continental'])
+
+ >>> Location = Model.get('stock.location')
+ >>> Product = Model.get('product.product')
+ >>> ProductCategory = Model.get('product.category')
+ >>> ProductConfiguration = Model.get('product.configuration')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> ProductUom = Model.get('product.uom')
+ >>> ShipmentInternal = Model.get('stock.shipment.internal')
+ >>> StockConfiguration = Model.get('stock.configuration')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create fiscal year::
+
+ >>> fiscalyear = create_fiscalyear(company)
+ >>> fiscalyear.account_stock_method = 'continental'
+ >>> fiscalyear.click('create_period')
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = add_stock_accounts(get_accounts(company), company)
+
+Create product category::
+
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_expense = accounts['expense']
+ >>> account_category.account_revenue = accounts['revenue']
+ >>> account_category.account_stock = accounts['stock']
+ >>> account_category.account_stock_in = accounts['stock_expense']
+ >>> account_category.account_stock_out = accounts['stock_expense']
+ >>> account_category.save()
+
+Create product::
+
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('300')
+ >>> template.cost_price_method = 'average'
+ >>> template.account_category = account_category
+ >>> product, = template.products
+ >>> template.save()
+ >>> product, = template.products
+
+Set cost per warehouse::
+
+ >>> product_config = ProductConfiguration(1)
+ >>> product_config.cost_price_warehouse = True
+ >>> product_config.save()
+
+Create stock locations::
+
+ >>> warehouse1, = Location.find([('code', '=', 'WH')])
+ >>> warehouse2, = warehouse1.duplicate(default={'name': "Warhouse bis"})
+ >>> transit = Location(name="Transit", type='storage')
+ >>> transit.save()
+ >>> stock_config = StockConfiguration(1)
+ >>> stock_config.shipment_internal_transit = transit
+ >>> stock_config.save()
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+
+Make 1 unit of product available @ 100 on 1st warehouse::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> move = StockMove()
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = warehouse1.storage_location
+ >>> move.unit_price = Decimal('100')
+ >>> move.currency = company.currency
+ >>> move.click('do')
+
+ >>> accounts['stock'].reload()
+ >>> accounts['stock'].balance
+ Decimal('100.00')
+
+Transfer 1 product between warehouses::
+
+ >>> shipment = ShipmentInternal()
+ >>> shipment.from_location = warehouse1.storage_location
+ >>> shipment.to_location = warehouse2.storage_location
+ >>> move = shipment.moves.new()
+ >>> move.from_location = shipment.from_location
+ >>> move.to_location = shipment.to_location
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.unit_price = product.cost_price
+ >>> shipment.click('wait')
+ >>> shipment.click('assign_force')
+
+ >>> shipment.click('ship')
+ >>> shipment.state
+ 'shipped'
+ >>> accounts['stock'].reload()
+ >>> accounts['stock'].balance
+ Decimal('0.00')
+
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+ >>> accounts['stock'].reload()
+ >>> accounts['stock'].balance
+ Decimal('100.00')
diff --git a/modules/product_cost_warehouse/tests/scenario_product_cost_fifo_warehouse.rst b/modules/product_cost_warehouse/tests/scenario_product_cost_fifo_warehouse.rst
new file mode 100644
index 0000000000..443e04b34f
--- /dev/null
+++ b/modules/product_cost_warehouse/tests/scenario_product_cost_fifo_warehouse.rst
@@ -0,0 +1,144 @@
+====================================
+Product Cost FIFO Warehouse Scenario
+====================================
+
+Imports::
+
+ >>> import datetime as dt
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import (
+ ... create_company, get_company)
+
+Activate product_cost_warehouse::
+
+ >>> config = activate_modules(
+ ... ['product_cost_warehouse', 'product_cost_fifo'])
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Product = Model.get('product.product')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('300')
+ >>> template.cost_price_method = 'fifo'
+ >>> product, = template.products
+ >>> template.save()
+ >>> product, = template.products
+
+Set cost per warehouse::
+
+ >>> ProductConfiguration = Model.get('product.configuration')
+ >>> product_config = ProductConfiguration(1)
+ >>> product_config.cost_price_warehouse = True
+ >>> product_config.save()
+
+
+Create stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> StockConfiguration = Model.get('stock.configuration')
+ >>> warehouse1, = Location.find([('code', '=', 'WH')])
+ >>> warehouse2, = warehouse1.duplicate(default={'name': "Warhouse bis"})
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+
+
+Make 2 unit of product available @ 100 on 1st warehouse::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> move = StockMove()
+ >>> move.product = product
+ >>> move.quantity = 2
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = warehouse1.storage_location
+ >>> move.unit_price = Decimal('100')
+ >>> move.currency = company.currency
+ >>> move.click('do')
+
+Check cost prices::
+
+ >>> with config.set_context(warehouse=warehouse1.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('100.0000')
+
+ >>> with config.set_context(warehouse=warehouse2.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('0')
+
+Make 2 unit of product available @ 80 in both warehouses::
+
+ >>> moves = []
+ >>> for warehouse in [warehouse1, warehouse2]:
+ ... move = StockMove()
+ ... move.product = product
+ ... move.quantity = 2
+ ... move.from_location = supplier_loc
+ ... move.to_location = warehouse.storage_location
+ ... move.unit_price = Decimal('80')
+ ... moves.append(move)
+ >>> StockMove.click(moves, 'do')
+
+Check cost prices::
+
+ >>> with config.set_context(warehouse=warehouse1.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('90.0000')
+
+ >>> with config.set_context(warehouse=warehouse2.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('80.0000')
+
+Sent 3 unit of product from 1st warehouse::
+
+ >>> move = StockMove()
+ >>> move.product = product
+ >>> move.quantity = 3
+ >>> move.from_location = warehouse1.storage_location
+ >>> move.to_location = customer_loc
+ >>> move.unit_price = Decimal('150')
+ >>> move.currency = company.currency
+ >>> move.click('do')
+ >>> move.cost_price
+ Decimal('93.3333')
+
+Recompute cost price for both warehouses::
+
+ >>> for warehouse in [warehouse1, warehouse2]:
+ ... with config.set_context(warehouse=warehouse.id):
+ ... recompute = Wizard('product.recompute_cost_price', [product])
+ ... recompute.execute('recompute')
+
+Check cost prices::
+
+ >>> with config.set_context(warehouse=warehouse1.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('80.0001')
+
+ >>> with config.set_context(warehouse=warehouse2.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('80.0000')
+
+Check cost prices on moves::
+
+ >>> [m.cost_price for m in StockMove.find([])]
+ [Decimal('93.3333'), Decimal('80.0000'), Decimal('90.0000'), Decimal('90.0000')]
+
diff --git a/modules/product_cost_warehouse/tests/scenario_product_cost_warehouse.rst b/modules/product_cost_warehouse/tests/scenario_product_cost_warehouse.rst
new file mode 100644
index 0000000000..4a16c0d792
--- /dev/null
+++ b/modules/product_cost_warehouse/tests/scenario_product_cost_warehouse.rst
@@ -0,0 +1,208 @@
+===============================
+Product Cost Warehouse Scenario
+===============================
+
+Imports::
+
+ >>> import datetime as dt
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import (
+ ... create_company, get_company)
+
+Activate modules::
+
+ >>> config = activate_modules('product_cost_warehouse')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Product = Model.get('product.product')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('300')
+ >>> template.cost_price_method = 'average'
+ >>> product, = template.products
+ >>> template.save()
+ >>> product, = template.products
+
+Set cost per warehouse::
+
+ >>> ProductConfiguration = Model.get('product.configuration')
+ >>> product_config = ProductConfiguration(1)
+ >>> product_config.cost_price_warehouse = True
+ >>> product_config.save()
+
+
+Create stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> StockConfiguration = Model.get('stock.configuration')
+ >>> warehouse1, = Location.find([('code', '=', 'WH')])
+ >>> warehouse2, = warehouse1.duplicate(default={'name': "Warhouse bis"})
+ >>> transit = Location(name="Transit", type='storage')
+ >>> transit.save()
+ >>> stock_config = StockConfiguration(1)
+ >>> stock_config.shipment_internal_transit = transit
+ >>> stock_config.save()
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+
+
+Make 1 unit of product available @ 100 on 1st warehouse::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> move = StockMove()
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = warehouse1.storage_location
+ >>> move.unit_price = Decimal('100')
+ >>> move.currency = company.currency
+ >>> move.click('do')
+
+Check cost prices::
+
+ >>> with config.set_context(warehouse=warehouse1.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('100.0000')
+
+ >>> with config.set_context(warehouse=warehouse2.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('0')
+
+Make 1 unit of product available @ 80 in both warehouses::
+
+ >>> moves = []
+ >>> for warehouse in [warehouse1, warehouse2]:
+ ... move = StockMove()
+ ... move.product = product
+ ... move.quantity = 1
+ ... move.from_location = supplier_loc
+ ... move.to_location = warehouse.storage_location
+ ... move.unit_price = Decimal('80')
+ ... moves.append(move)
+ >>> StockMove.click(moves, 'do')
+
+Check cost prices::
+
+ >>> with config.set_context(warehouse=warehouse1.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('90.0000')
+
+ >>> with config.set_context(warehouse=warehouse2.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('80.0000')
+
+Recompute cost price for both warehouses::
+
+ >>> for warehouse in [warehouse1, warehouse2]:
+ ... with config.set_context(warehouse=warehouse.id):
+ ... recompute = Wizard('product.recompute_cost_price', [product])
+ ... recompute.execute('recompute')
+
+Check cost prices::
+
+ >>> with config.set_context(warehouse=warehouse1.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('90.0000')
+
+ >>> with config.set_context(warehouse=warehouse2.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('80.0000')
+
+Check cost prices on moves::
+
+ >>> [m.cost_price for m in StockMove.find([])]
+ [Decimal('80.0000'), Decimal('90.0000'), Decimal('90.0000')]
+
+Forbid direct move between warehouses::
+
+ >>> move = StockMove()
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.from_location = warehouse1.storage_location
+ >>> move.to_location = warehouse2.storage_location
+ >>> move.unit_price = product.cost_price
+ >>> move.save()
+ >>> move.click('do') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ MoveValidationError: ...
+
+ >>> move.to_location = transit
+ >>> move.click('do')
+ >>> move.state
+ 'done'
+
+Transfer 1 product between warehouses::
+
+ >>> ShipmentInternal = Model.get('stock.shipment.internal')
+ >>> shipment = ShipmentInternal()
+ >>> shipment.from_location = warehouse1.storage_location
+ >>> shipment.to_location = warehouse2.storage_location
+ >>> move = shipment.moves.new()
+ >>> move.from_location = shipment.from_location
+ >>> move.to_location = shipment.to_location
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.unit_price = product.cost_price
+ >>> shipment.click('wait')
+ >>> shipment.state
+ 'waiting'
+ >>> shipment.click('assign_force')
+ >>> shipment.state
+ 'assigned'
+
+ >>> shipment.click('ship')
+ >>> shipment.state
+ 'shipped'
+ >>> move, = shipment.outgoing_moves
+ >>> move.state
+ 'done'
+ >>> move.cost_price
+ Decimal('90.0000')
+
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+ >>> move, = shipment.incoming_moves
+ >>> move.state
+ 'done'
+ >>> move.cost_price
+ Decimal('85.0000')
+
+Recompute cost price for both warehouses::
+
+ >>> for warehouse in [warehouse1, warehouse2]:
+ ... with config.set_context(warehouse=warehouse.id):
+ ... recompute = Wizard('product.recompute_cost_price', [product])
+ ... recompute.execute('recompute')
+
+Check cost prices::
+
+ >>> with config.set_context(warehouse=warehouse1.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('90.0000')
+
+ >>> with config.set_context(warehouse=warehouse2.id):
+ ... product = Product(product.id)
+ >>> product.cost_price
+ Decimal('85.0000')
diff --git a/modules/product_cost_warehouse/tests/test_product_cost_warehouse.py b/modules/product_cost_warehouse/tests/test_product_cost_warehouse.py
new file mode 100644
index 0000000000..e353e5382f
--- /dev/null
+++ b/modules/product_cost_warehouse/tests/test_product_cost_warehouse.py
@@ -0,0 +1,41 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import unittest
+
+import doctest
+
+from trytond.tests.test_tryton import ModuleTestCase
+from trytond.tests.test_tryton import suite as test_suite
+from trytond.tests.test_tryton import doctest_teardown
+from trytond.tests.test_tryton import doctest_checker
+
+from trytond.modules.company.tests import CompanyTestMixin
+
+
+class ProductCostWarehouseTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test Product Cost Warehouse module'
+ module = 'product_cost_warehouse'
+ extras = ['product_cost_history']
+
+
+def suite():
+ suite = test_suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductCostWarehouseTestCase))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_product_cost_warehouse.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_product_cost_fifo_warehouse.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_account_stock_continental.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ return suite
diff --git a/modules/product_cost_warehouse/tox.ini b/modules/product_cost_warehouse/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/product_cost_warehouse/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/product_cost_warehouse/tryton.cfg b/modules/product_cost_warehouse/tryton.cfg
new file mode 100644
index 0000000000..f13c9a8171
--- /dev/null
+++ b/modules/product_cost_warehouse/tryton.cfg
@@ -0,0 +1,16 @@
+[tryton]
+version=6.0.5
+depends:
+ company
+ ir
+ product
+ stock
+extras_depend:
+ account_stock_continental
+ product_cost_fifo
+ product_cost_history
+xml:
+ ir.xml
+ product.xml
+ stock.xml
+ message.xml
diff --git a/modules/product_cost_warehouse/view/configuration_form.xml b/modules/product_cost_warehouse/view/configuration_form.xml
new file mode 100644
index 0000000000..858b309a9b
--- /dev/null
+++ b/modules/product_cost_warehouse/view/configuration_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/product_cost_warehouse/view/ir_cron_form.xml b/modules/product_cost_warehouse/view/ir_cron_form.xml
new file mode 100644
index 0000000000..8fb9249578
--- /dev/null
+++ b/modules/product_cost_warehouse/view/ir_cron_form.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/product_cost_warehouse/view/stock_location_form.xml b/modules/product_cost_warehouse/view/stock_location_form.xml
new file mode 100644
index 0000000000..013eeb35e9
--- /dev/null
+++ b/modules/product_cost_warehouse/view/stock_location_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/product_kit/.drone.yml b/modules/product_kit/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/product_kit/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/product_kit/.flake8 b/modules/product_kit/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/product_kit/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/product_kit/CHANGELOG b/modules/product_kit/CHANGELOG
new file mode 100644
index 0000000000..b746d3103d
--- /dev/null
+++ b/modules/product_kit/CHANGELOG
@@ -0,0 +1,34 @@
+Version 6.0.10 - 2022-12-06
+---------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.9 - 2022-11-17
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.8 - 2022-10-17
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.7 - 2022-04-15
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.6 - 2022-02-16
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.5 - 2021-10-15
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.4 - 2021-09-16
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.3 - 2021-09-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.2 - 2021-07-21
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.1 - 2021-07-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Initial release
diff --git a/modules/product_kit/COPYRIGHT b/modules/product_kit/COPYRIGHT
new file mode 100644
index 0000000000..0d62f3af9a
--- /dev/null
+++ b/modules/product_kit/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2020-2022 B2CK
+Copyright (C) 2020-2022 Cédric Krier
+Copyright (C) 2020-2022 Sergi Almacellas Abellana
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/product_kit/LICENSE b/modules/product_kit/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/product_kit/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/product_kit/MANIFEST.in b/modules/product_kit/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/product_kit/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/product_kit/README.rst b/modules/product_kit/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/product_kit/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/product_kit/__init__.py b/modules/product_kit/__init__.py
new file mode 100644
index 0000000000..fbeaafa443
--- /dev/null
+++ b/modules/product_kit/__init__.py
@@ -0,0 +1,58 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import Pool
+
+from . import product
+from . import sale
+from . import purchase
+from . import stock
+from . import account
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ product.Template,
+ product.Product,
+ product.Component,
+ module='product_kit', type_='model')
+ Pool.register(
+ account.Invoice,
+ account.InvoiceLine,
+ module='product_kit', type_='model', depends=['account_invoice_stock'])
+ Pool.register(
+ stock.Move,
+ module='product_kit', type_='model', depends=['stock'])
+ Pool.register(
+ sale.Sale,
+ sale.Line,
+ sale.LineComponent,
+ sale.LineComponentIgnoredMove,
+ sale.LineComponentRecreatedMove,
+ stock.MoveSale,
+ account.InvoiceLineSale,
+ module='product_kit', type_='model', depends=['sale'])
+ Pool.register(
+ sale.HandleShipmentException,
+ module='product_kit', type_='wizard', depends=['sale'])
+ Pool.register(
+ sale.Amendment,
+ sale.AmendmentLine,
+ module='product_kit', type_='model', depends=['sale_amendment'])
+ Pool.register(
+ purchase.Purchase,
+ purchase.Line,
+ purchase.LineComponent,
+ purchase.LineComponentIgnoredMove,
+ purchase.LineComponentRecreatedMove,
+ stock.MovePurchase,
+ account.InvoiceLinePurchase,
+ module='product_kit', type_='model', depends=['purchase'])
+ Pool.register(
+ purchase.HandleShipmentException,
+ module='product_kit', type_='wizard', depends=['purchase'])
+ Pool.register(
+ purchase.Amendment,
+ purchase.AmendmentLine,
+ module='product_kit', type_='model', depends=['purchase_amendment'])
diff --git a/modules/product_kit/account.py b/modules/product_kit/account.py
new file mode 100644
index 0000000000..fa14c91cb8
--- /dev/null
+++ b/modules/product_kit/account.py
@@ -0,0 +1,56 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, Workflow
+from trytond.pool import PoolMeta, Pool
+
+
+class Invoice(metaclass=PoolMeta):
+ __name__ = 'account.invoice'
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('posted')
+ def post(cls, invoices):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ super().post(invoices)
+ moves = sum(
+ (l.stock_component_moves for i in invoices for l in i.lines), [])
+ if moves:
+ Move.__queue__.update_unit_price(moves)
+
+
+class InvoiceLine(metaclass=PoolMeta):
+ __name__ = 'account.invoice.line'
+
+ @property
+ def stock_component_moves(self):
+ return []
+
+
+class InvoiceLineSale(metaclass=PoolMeta):
+ __name__ = 'account.invoice.line'
+
+ @property
+ def stock_component_moves(self):
+ pool = Pool()
+ SaleLine = pool.get('sale.line')
+ moves = super().stock_component_moves
+ if isinstance(self.origin, SaleLine):
+ for component in self.origin.components:
+ moves.extend(component.moves)
+ return moves
+
+
+class InvoiceLinePurchase(metaclass=PoolMeta):
+ __name__ = 'account.invoice.line'
+
+ @property
+ def stock_component_moves(self):
+ pool = Pool()
+ PurchaseLine = pool.get('purchase.line')
+ moves = super().stock_component_moves
+ if isinstance(self.origin, PurchaseLine):
+ for component in self.origin.components:
+ moves.extend(component.moves)
+ return moves
diff --git a/modules/product_kit/common.py b/modules/product_kit/common.py
new file mode 100644
index 0000000000..56996908f6
--- /dev/null
+++ b/modules/product_kit/common.py
@@ -0,0 +1,441 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from collections import defaultdict
+from decimal import Decimal
+from functools import wraps
+
+from trytond.model import ModelStorage, ModelView, Workflow, fields
+from trytond.pool import Pool
+from trytond.pyson import Eval
+
+
+def get_shipments_returns(model_name):
+ def _get_shipments_returns(func):
+ @wraps(func)
+ def wrapper(self, name):
+ pool = Pool()
+ Model = pool.get(model_name)
+ shipments = set(func(self, name))
+ for line in self.lines:
+ for component in line.components:
+ for move in component.moves:
+ if isinstance(move.shipment, Model):
+ shipments.add(move.shipment.id)
+ return list(shipments)
+ return wrapper
+ return _get_shipments_returns
+
+
+def search_shipments_returns(model_name):
+ def _search_shipments_returns(func):
+ @wraps(func)
+ def wrapper(cls, name, clause):
+ domain = func(cls, name, clause)
+ _, operator, operand, *extra = clause
+ if operator.startswith('!') or operator.startswith('not '):
+ bool_op = 'AND'
+ else:
+ bool_op = 'OR'
+ nested = clause[0].lstrip(name)
+ if nested:
+ return [bool_op,
+ domain,
+ ('lines.components.moves.shipment' + nested,)
+ + tuple(clause[1:3]) + (model_name,) + tuple(clause[3:]),
+ ]
+ else:
+ if isinstance(clause[2], str):
+ target = 'rec_name'
+ else:
+ target = 'id'
+ return [bool_op,
+ domain,
+ ('lines.components.moves.shipment.' + target,)
+ + tuple(clause[1:3]) + (model_name,)]
+ return wrapper
+ return _search_shipments_returns
+
+
+def order_mixin(prefix):
+ class OrderMixin(ModelStorage):
+
+ @classmethod
+ def copy(cls, records, default=None):
+ pool = Pool()
+ Line = pool.get(prefix + '.line')
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault(
+ 'lines.component_parent',
+ lambda data: data['component_parent'])
+ records = super().copy(records, default=default)
+ lines = []
+ for record in records:
+ for line in record.lines:
+ if line.component_parent:
+ lines.append(line)
+ Line.delete(lines)
+ return records
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, records):
+ pool = Pool()
+ Line = pool.get(prefix + '.line')
+ to_delete = []
+ to_save = []
+ for record in records:
+ for line in record.lines:
+ if line.component_parent:
+ to_delete.append(line)
+ elif line.components:
+ line.components = None
+ to_save.append(line)
+ Line.save(to_save)
+ super().draft(records)
+ Line.delete(to_delete)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('quotation')
+ def quote(cls, records):
+ pool = Pool()
+ Line = pool.get(prefix + '.line')
+ removed = []
+ for record in records:
+ removed.extend(record.set_components())
+ Line.delete(removed)
+ cls.save(records)
+ super().quote(records)
+
+ def set_components(self):
+ pool = Pool()
+ Component = pool.get(prefix + '.line.component')
+ removed = []
+ lines = []
+ sequence = 0
+ for line in self.lines:
+ if line.component_parent:
+ removed.append(line)
+ continue
+ sequence += 1
+ line.sequence = sequence
+ lines.append(line)
+ if line.product and line.product.components_used:
+ if line.product.type == 'kit':
+ components = []
+ for component in line.product.components_used:
+ components.append(line.get_component(component))
+ Component.set_price_ratio(components, line.quantity)
+ line.components = components
+ else:
+ for component in line.product.components_used:
+ order_line = line.get_component_order_line(
+ component)
+ sequence += 1
+ order_line.sequence = sequence
+ order_line.component_parent = line
+ lines.append(order_line)
+ self.lines = lines
+ return removed
+ return OrderMixin
+
+
+def order_line_mixin(prefix):
+ class OrderLineMixin(ModelStorage, ModelView):
+
+ component_parent = fields.Many2One(
+ prefix + '.line', "Component Parent",
+ readonly=True,
+ states={
+ 'invisible': ~Eval('component_parent'),
+ })
+ component_children = fields.One2Many(
+ prefix + '.line', 'component_parent', "Component Children",
+ readonly=True,
+ states={
+ 'invisible': ~Eval('component_children'),
+ })
+
+ components = fields.One2Many(
+ prefix + '.line.component', 'line', "Components", readonly=True,
+ states={
+ 'invisible': ~Eval('components', []),
+ })
+
+ @classmethod
+ def view_attributes(cls):
+ return super().view_attributes() + [
+ ('//page[@id="components"]', 'states', {
+ 'invisible': (
+ ~Eval('components', [])
+ & ~Eval('component_children', [])),
+ }),
+ ]
+
+ @classmethod
+ def copy(cls, lines, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('component_parent')
+ default.setdefault('component_children')
+ default.setdefault('components')
+ return super().copy(lines, default=default)
+
+ def get_component(self, component, **kwargs):
+ pool = Pool()
+ Component = pool.get(prefix + '.line.component')
+ line = component.get_line(
+ Component, self.quantity, self.unit, **kwargs)
+ line.fixed = component.fixed
+ if not line.fixed:
+ line.quantity_ratio = component.quantity
+ return line
+
+ def get_component_order_line(self, component, **values):
+ Line = self.__class__
+ line = component.get_line(
+ Line, self.quantity, self.unit, **values)
+ line.type = 'line'
+ line.on_change_product()
+ return line
+
+ def get_move(self, type_):
+ move = super().get_move(type_)
+ if self.components:
+ move = None
+ return move
+
+ def get_move_done(self, name):
+ done = super().get_move_done(name)
+ if self.components:
+ done = all(c.move_done for c in self.components)
+ return done
+
+ def get_move_exception(self, name):
+ exception = super().get_move_exception(name)
+ if self.components:
+ exception = any(c.move_exception for c in self.components)
+ return exception
+
+ def _get_invoice_line_quantity(self):
+ quantity = super()._get_invoice_line_quantity()
+ if (getattr(self, prefix).invoice_method == 'shipment'
+ and self.components):
+ ratio = min(c.get_moved_ratio() for c in self.components)
+ quantity = self.unit.round(self.quantity * ratio)
+ return quantity
+ return OrderLineMixin
+
+
+def order_line_component_mixin(prefix):
+ class OrderLineComponentMixin(ModelStorage):
+
+ line = fields.Many2One(
+ prefix + '.line', "Line", required=True, ondelete='CASCADE',
+ domain=[
+ ('product.type', '=', 'kit'),
+ ])
+ moves = fields.One2Many('stock.move', 'origin', 'Moves', readonly=True)
+ moves_ignored = fields.Many2Many(
+ prefix + '.line.component-ignored-stock.move',
+ 'component', 'move', "Ignored Moves", readonly=True)
+ moves_recreated = fields.Many2Many(
+ prefix + '.line.component-recreated-stock.move',
+ 'component', 'move', "Recreated Moves", readonly=True)
+ move_done = fields.Function(
+ fields.Boolean('Moves Done'), 'get_move_done')
+ move_exception = fields.Function(
+ fields.Boolean('Moves Exception'), 'get_move_exception')
+ quantity_ratio = fields.Float(
+ "Quantity Ratio", readonly=True,
+ states={
+ 'required': ~Eval('fixed', False),
+ },
+ depends=['fixed'])
+ price_ratio = fields.Numeric(
+ "Price Ratio", readonly=True, required=True)
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.__access__.add('line')
+
+ @fields.depends('line', '_parent_line.product')
+ def on_change_with_parent_type(self, name=None):
+ if self.line and self.line.product:
+ return self.line.product.type
+
+ @classmethod
+ def set_price_ratio(cls, components, quantity):
+ "Set price ratio between components"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ list_prices = defaultdict(Decimal)
+ sum_ = 0
+ for component in components:
+ product = component.product
+ list_price = Uom.compute_price(
+ product.default_uom, product.list_price,
+ component.unit)
+ if component.fixed:
+ list_price *= Decimal(str(component.quantity / quantity))
+ else:
+ list_price *= Decimal(str(component.quantity_ratio))
+ list_prices[component] = list_price
+ sum_ += list_price
+
+ for component in components:
+ if sum_:
+ ratio = list_prices[component] / sum_
+ else:
+ ratio = 1 / len(components)
+ if component.fixed:
+ ratio /= Decimal(str(component.quantity / quantity))
+ else:
+ ratio /= Decimal(str(component.quantity_ratio))
+ component.price_ratio = ratio
+
+ def get_move(self, type_):
+ raise NotImplementedError
+
+ def _get_shipped_quantity(self, shipment_type):
+ 'Return the quantity already shipped'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+
+ quantity = 0
+ skips = set(self.moves_recreated)
+ for move in self.moves:
+ if move not in skips:
+ quantity += Uom.compute_qty(
+ move.uom, move.quantity, self.unit)
+ return quantity
+
+ @property
+ def _move_remaining_quantity(self):
+ "Compute the remaining quantity to ship"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ ignored = set(self.moves_ignored)
+ quantity = abs(self.quantity)
+ for move in self.moves:
+ if move.state == 'done' or move in ignored:
+ quantity -= Uom.compute_qty(
+ move.uom, move.quantity, self.unit)
+ return quantity
+
+ def get_move_done(self, name):
+ quantity = self._move_remaining_quantity
+ if quantity is None:
+ return True
+ else:
+ return self.unit.round(quantity) <= 0
+
+ def get_move_exception(self, name):
+ skips = set(self.moves_ignored)
+ skips.update(self.moves_recreated)
+ for move in self.moves:
+ if move.state == 'cancelled' and move not in skips:
+ return True
+ return False
+
+ def get_moved_ratio(self):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+
+ quantity = 0
+ for move in self.moves:
+ if move.state != 'done':
+ continue
+ qty = Uom.compute_qty(move.uom, move.quantity, self.unit)
+ dest_type = self.line.to_location.type
+ if (move.to_location.type == dest_type
+ and move.from_location.type != dest_type):
+ quantity += qty
+ elif (move.from_location.type == dest_type
+ and move.to_location.type != dest_type):
+ quantity -= qty
+ if self.quantity < 0:
+ quantity *= -1
+ return quantity / self.quantity
+
+ def get_rec_name(self, name):
+ return super().get_rec_name(name) + (
+ ' @ %s' % self.line.rec_name)
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return super().search_rec_name(name, clause) + [
+ ('line.rec_name',) + tuple(clause[1:]),
+ ]
+ return OrderLineComponentMixin
+
+
+def handle_shipment_exception_mixin(prefix):
+ class HandleShipmentExceptionMixin:
+ def default_ask(self, fields):
+ values = super().default_ask(fields)
+ moves = values['domain_moves']
+ for line in self.record.lines:
+ for component in line.components:
+ skips = set(component.moves_ignored)
+ skips.update(component.moves_recreated)
+ for move in component.moves:
+ if move.state == 'cancelled' and move not in skips:
+ moves.append(move.id)
+ return values
+
+ def transition_handle(self):
+ pool = Pool()
+ Component = pool.get(prefix + '.line.component')
+
+ result = super().transition_handle()
+
+ to_write = []
+ for line in self.record.lines:
+ for component in line.components:
+ moves_ignored = []
+ moves_recreated = []
+ skips = set(component.moves_ignored)
+ skips.update(component.moves_recreated)
+ for move in component.moves:
+ if move not in self.ask.domain_moves or move in skips:
+ continue
+ if move in self.ask.recreate_moves:
+ moves_recreated.append(move.id)
+ else:
+ moves_ignored.append(move.id)
+
+ if moves_ignored or moves_recreated:
+ to_write.append([component])
+ to_write.append({
+ 'moves_ignored': [('add', moves_ignored)],
+ 'moves_recreated': [('add', moves_recreated)],
+ })
+ if to_write:
+ Component.write(*to_write)
+ return result
+ return HandleShipmentExceptionMixin
+
+
+class AmendmentLineMixin:
+
+ def _apply_line(self, record, line):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ super()._apply_line(record, line)
+ if line.components:
+ quantity = Uom.compute_qty(
+ line.unit, line.quantity,
+ line.product.default_uom, round=False)
+ for component in line.components:
+ if not component.fixed:
+ component.quantity = component.unit.round(
+ quantity * component.quantity_ratio)
+ line.components = line.components
diff --git a/modules/product_kit/doc/conf.py b/modules/product_kit/doc/conf.py
new file mode 100644
index 0000000000..8513b72dd2
--- /dev/null
+++ b/modules/product_kit/doc/conf.py
@@ -0,0 +1,61 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+modules_url = 'https://docs.tryton.org/projects/modules-{module}/en/{series}/'
+trytond_url = 'https://docs.tryton.org/projects/server/en/{series}/'
+
+
+def get_info():
+ import configparser
+ import os
+ import subprocess
+ import sys
+
+ module_dir = os.path.dirname(os.path.dirname(__file__))
+
+ config = configparser.ConfigParser()
+ config.read_file(open(os.path.join(module_dir, 'tryton.cfg')))
+ info = dict(config.items('tryton'))
+
+ result = subprocess.run(
+ [sys.executable, 'setup.py', '--name'],
+ stdout=subprocess.PIPE, check=True, cwd=module_dir)
+ info['name'] = result.stdout.decode('utf-8').strip()
+
+ result = subprocess.run(
+ [sys.executable, 'setup.py', '--version'],
+ stdout=subprocess.PIPE, check=True, cwd=module_dir)
+ version = result.stdout.decode('utf-8').strip()
+ if 'dev' in version:
+ info['series'] = 'latest'
+ else:
+ info['series'] = '.'.join(version.split('.', 2)[:2])
+
+ for key in {'depends', 'extras_depend'}:
+ info[key] = info.get(key, '').strip().splitlines()
+ info['modules'] = set(info['depends'] + info['extras_depend'])
+ info['modules'] -= {'ir', 'res'}
+
+ return info
+
+
+info = get_info()
+
+master_doc = 'index'
+project = info['name']
+release = version = info['series']
+default_role = 'ref'
+highlight_language = 'none'
+extensions = [
+ 'sphinx.ext.intersphinx',
+ ]
+intersphinx_mapping = {
+ 'trytond': (trytond_url.format(series=version), None),
+ }
+intersphinx_mapping.update({
+ m: (modules_url.format(
+ module=m.replace('_', '-'), series=version), None)
+ for m in info['modules']
+ })
+
+del get_info, info, modules_url, trytond_url
diff --git a/modules/product_kit/doc/design.rst b/modules/product_kit/doc/design.rst
new file mode 100644
index 0000000000..81d66668bd
--- /dev/null
+++ b/modules/product_kit/doc/design.rst
@@ -0,0 +1,121 @@
+******
+Design
+******
+
+The *Product Kit Module* module introduces the following concepts:
+
+.. _concept-product:
+
+Product
+=======
+
+When the *Product Kit Module* is activated, products gain some extra properties.
+These include a new type "Kit" which corresponds to a product composed of other
+goods defined by a list of `Components `.
+
+.. seealso::
+
+ The `Product ` concept is introduced by the
+ :doc:`Product Module `.
+
+.. _model-product.component:
+
+Product Component
+=================
+
+The *Product Component* concept defines the quantity of a product that is part
+of another product.
+
+.. _model-sale.sale:
+
+Sale
+====
+
+When the *Product Kit Module* is activated, components are added to sales when
+the sale is quoted.
+
+For `Sale Lines ` with a kit `Product `, a
+`Sale Line Component ` is created for each `Product
+Component `.
+These components are used as the origins for the `Stock Moves
+` and the sale lines of the `Invoice Lines
+`.
+When the `Invoice ` method is on
+shipment, the smallest ratio of shipped components is used to calculate the
+quantity invoiced.
+
+For `Sale Lines ` with a non-kit product containing `Product
+Components `, a sale line is created for each one.
+
+When the sale is reset to draft, all created components are deleted.
+
+.. _model-sale.line:
+
+Line
+----
+
+The sale lines gain a list of `Sale Line Components
+` and a list of children which are created when the
+`Sale ` is quoted.
+
+.. _model-sale.line.component:
+
+Line Component
+--------------
+
+The *Sale Line Component* concept defines for a `Sale Line
+` the quantity of a `Product Component
+` to be shipped instead of the kit.
+
+.. seealso::
+
+ The `Sale ` model is introduced by the :doc:`Sale
+ Module `.
+
+
+.. _model-purchase.purchase:
+
+Purchase
+========
+
+When the *Product Kit Module* is activated, components are added to `Purchases
+` when the purchase is quoted.
+
+For `Purchase Lines ` with a kit `Product
+`, a `Purchase Line Component ` is
+created for each `Product Component `.
+These components are used as the origins for the `Stock Moves
+` and the purchase lines of the `Invoice Lines
+`.
+When the `Invoice ` method is on
+shipment, the smallest ratio of received components is used to calculate the
+quantity invoiced.
+
+For `Purchase Lines ` with a non-kit product containing
+`Product Components `, a purchase line is created for
+each one.
+
+When the purchase is reset to draft, all created components are deleted.
+
+.. _model-purchase.line:
+
+Line
+----
+
+The purchase lines gain a list of `Purchase Line Components
+` and a list of children which are created when
+the `Purchase ` is quoted.
+
+.. _model-purchase.line.component:
+
+Line Component
+--------------
+
+The *Purchase Line Component* concept defines for a `Purchase Line
+` the quantity of a `Product Component
+` to be received instead of the kit.
+
+.. seealso::
+
+ The `Purchase ` model is introduced by the
+ :doc:`Purchase Module `.
diff --git a/modules/product_kit/doc/index.rst b/modules/product_kit/doc/index.rst
new file mode 100644
index 0000000000..c9e616a5b2
--- /dev/null
+++ b/modules/product_kit/doc/index.rst
@@ -0,0 +1,12 @@
+##################
+Product Kit Module
+##################
+
+The *Product Kit Module* adds kits and components to products.
+This enables a defined set of products to be sold or purchased using a single
+line.
+
+.. toctree::
+ :maxdepth: 2
+
+ design
diff --git a/modules/product_kit/locale/bg.po b/modules/product_kit/locale/bg.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/bg.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/ca.po b/modules/product_kit/locale/ca.po
new file mode 100644
index 0000000000..e5af7a7ae7
--- /dev/null
+++ b/modules/product_kit/locale/ca.po
@@ -0,0 +1,288 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr "Variant pare"
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr "Producte pare"
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr "Tipus de pare"
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Categoria d'unitats del producte"
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr "Components"
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr "Components"
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr "Components fills"
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr "Component pare"
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr "Components"
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr "Línia"
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr "Moviments finalitzats"
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr "Moviments en excepció"
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Moviments ignorats"
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Moviments recreats"
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr "Tipus pare"
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr "Rati del preu"
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Categoria d'unitats del producte"
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr "Rati de la quantitat"
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr "Component"
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr "Component"
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr "Component fill"
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr "Component pare"
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr "Components"
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr "Línia"
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr "Moviments finalitzats"
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr "Moviments en excepció"
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Moviments ignorats"
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Moviments recreats"
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr "Tipus pare"
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr "Rati de preu"
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Categoria d'unitats del producte"
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr "Rati de la quantitat"
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr "Component"
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr "Component de la línia de venda"
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Marca perque la quantitat del component sigui independent de la quantitat "
+"del kit."
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Marca perque la quantitat del component sigui independent de la quantitat "
+"del kit."
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Marca perque la quantitat del component sigui independent de la quantitat "
+"del kit."
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr "Component del producte"
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr "Component de línia de compra"
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr "Component de línia de compra - Moviment ignorat"
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr "Component de línia de compra - Moviment recreat"
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr "Component de la línia de venda"
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr "Component de línia de venda - Moviment ignorat"
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr "Component de la línia de venda - Moviment recreat"
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr "Kit"
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr "Kit"
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr "Components"
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr "Components"
diff --git a/modules/product_kit/locale/cs.po b/modules/product_kit/locale/cs.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/cs.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/de.po b/modules/product_kit/locale/de.po
new file mode 100644
index 0000000000..47e44e99f3
--- /dev/null
+++ b/modules/product_kit/locale/de.po
@@ -0,0 +1,288 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr "Feste Menge"
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr "Übergeordnete Variante"
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr "Übergeordneter Artikel"
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr "Übergeordneter Typ"
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Artikel Maßeinheitenkategorie"
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Nachkommastellen"
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr "Komponenten"
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr "Komponenten"
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr "Untergeordnete Komponenten"
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr "Übergeordnete Komponente"
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr "Komponenten"
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr "Position"
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr "Lagerbewegungen Erledigt"
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr "Lagerbewegungen Vorbehalt"
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr "Lagerbewegungen"
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Ignorierte Lagerbewegungen"
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Neu erstellte Lagerbewegungen"
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr "Übergeordneter Typ"
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr "Preisverhältnis"
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Artikel Maßeinheitenkategorie"
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr "Mengenverhältnis"
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Nachkommastellen"
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr "Komponente"
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Lagerbewegung"
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr "Komponente"
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Lagerbewegung"
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr "Untergeordnete Komponenten"
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr "Übergeordnete Komponente"
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr "Komponenten"
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr "Fix"
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr "Position"
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr "Lagerbewegungen Erledigt"
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr "Lagerbewegungen Vorbehalt"
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr "Lagerbewegungen"
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Ignorierte Lagerbewegungen"
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Neu erstellte Lagerbewegungen"
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr "Übergeordneter Typ"
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr "Preisverhältnis"
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Artikel Maßeinheitenkategorie"
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr "Mengenverhältnis"
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Nachkommastellen"
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr "Komponente"
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Lagerbewegung"
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr "Verkaufsposition Komponente"
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Lagerbewegung"
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Auswählen um die Menge der Komponente unabhängig von der Kit-Menge zu "
+"machen."
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Auswählen um die Menge der Komponente unabhängig von der Kit-Menge zu "
+"machen."
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Auswählen um die Menge der Komponente unabhängig von der Kit-Menge zu "
+"machen."
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr "Artikel Komponente"
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr "Einkaufsposition Komponente"
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr "Einkausposition Komponete - Ignorierte Lagerbewegung"
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr "Einkaufsposition - Wiederhergestellte Lagerbewegung"
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr "Verkaufsposition Komponente"
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr "Verkaufsposition Komponente - Ignorierte Lagerbewegung"
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr "Verkaufsposition - Wiederhergestellte Lagerbewegung"
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr "Kit"
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr "Kit"
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr "Komponenten"
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr "Komponenten"
diff --git a/modules/product_kit/locale/es.po b/modules/product_kit/locale/es.po
new file mode 100644
index 0000000000..c1970b4042
--- /dev/null
+++ b/modules/product_kit/locale/es.po
@@ -0,0 +1,288 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr "Fijo"
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr "Variante padre"
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr "Producto padre"
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr "Tipo de padre"
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Categoría de unidades del producto"
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr "Componentes"
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr "Componentes"
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr "Componentes hijos"
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr "Componente padre"
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr "Componentes"
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr "Fijo"
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr "Movimientos finalizados"
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr "Movimientos en excepción"
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Movimientos ignorados"
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Movimientos recreados"
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr "Tipo padre"
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr "Ratio de precio"
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Categoría de la unidad del producto"
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr "Ratio de la cantidad"
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr "Componente"
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr "Componente"
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr "Componentes hijos"
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr "Componente padre"
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr "Componentes"
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr "Fijo"
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr "Movimientos finalizados"
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr "Movimientos en excepción"
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Movimientos ignorados"
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Movimientos recreados"
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr "Tipo padre"
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr "Ratio de precio"
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Categoría de la unidad del producto"
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr "Ratio de la cantidad"
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr "Componente"
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr "Componente de línea de venta"
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Marcar para hacer la cantidad del componente independiente de la cantidad "
+"del kit."
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Marcar para hacer la cantidad del componente independiente de la cantidad "
+"del kit."
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Marcar para hacer la cantidad del componente independiente de la cantidad "
+"del kit."
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr "Componente del producto"
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr "Componente de línea de compra"
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr "Componente de línea de compra - Movimiento ignorado"
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr "Componente de línea de compra - Movimiento recreado"
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr "Componente de línea de venta"
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr "Componente de línea de venta - Movimiento ignorado"
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr "Componente de línea de venta - Movimiento recreado"
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr "Kit"
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr "Kit"
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr "Componentes"
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr "Componentes"
diff --git a/modules/product_kit/locale/es_419.po b/modules/product_kit/locale/es_419.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/es_419.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/et.po b/modules/product_kit/locale/et.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/et.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/fa.po b/modules/product_kit/locale/fa.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/fa.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/fi.po b/modules/product_kit/locale/fi.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/fi.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/fr.po b/modules/product_kit/locale/fr.po
new file mode 100644
index 0000000000..2737782ec1
--- /dev/null
+++ b/modules/product_kit/locale/fr.po
@@ -0,0 +1,288 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr "Fixe"
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr "Variante parent"
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr "Produit parent"
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr "Type de parent"
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Catégorie d'unité du produit"
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr "Composants"
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr "Composants"
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr "Composants enfants"
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr "Composant parent"
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr "Composants"
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr "Fixe"
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr "Ligne"
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr "Mouvements effectués"
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr "Mouvements en exception"
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Mouvements ignorés"
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Mouvements recréés"
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr "Type de parent"
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr "Rapport de prix"
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Catégorie d'unité du produit"
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr "Rapport de quantité"
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr "Composant"
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr "Composant"
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr "Composants enfants"
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr "Composant parent"
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr "Composants"
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr "Fixe"
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr "Ligne"
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr "Mouvements effectués"
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr "Mouvements en exception"
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Mouvements ignorés"
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Mouvements recréés"
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr "Type de parent"
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr "Rapport de prix"
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr "Catégorie d'unité du produit"
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr "Rapport de quantité"
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr "Composant"
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr "Composant de ligne de vente"
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Cocher pour rendre la quantité du composant indépendante de la quantité du "
+"kit."
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Cocher pour rendre la quantité du composant indépendante de la quantité du "
+"kit."
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+"Cocher pour rendre la quantité du composant indépendante de la quantité du "
+"kit."
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr "Composant de produit"
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr "Composant de ligne d'achat"
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr "Composant de ligne d'achat - Mouvement ignoré"
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr "Composant de ligne d'achat - Mouvement recréé"
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr "Composant de ligne de vente"
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr "Composant de ligne de vente - Mouvement ignoré"
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr "Composant de ligne de vente - Mouvement recréé"
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr "Kit"
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr "Kit"
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr "Composants"
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr "Composants"
diff --git a/modules/product_kit/locale/hu.po b/modules/product_kit/locale/hu.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/hu.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/id.po b/modules/product_kit/locale/id.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/id.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/it.po b/modules/product_kit/locale/it.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/it.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/lo.po b/modules/product_kit/locale/lo.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/lo.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/lt.po b/modules/product_kit/locale/lt.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/lt.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/nl.po b/modules/product_kit/locale/nl.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/nl.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/pl.po b/modules/product_kit/locale/pl.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/pl.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/pt.po b/modules/product_kit/locale/pt.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/pt.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/ro.po b/modules/product_kit/locale/ro.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/ro.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/ru.po b/modules/product_kit/locale/ru.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/ru.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/sl.po b/modules/product_kit/locale/sl.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/sl.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/tr.po b/modules/product_kit/locale/tr.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/tr.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/locale/zh_CN.po b/modules/product_kit/locale/zh_CN.po
new file mode 100644
index 0000000000..3683128366
--- /dev/null
+++ b/modules/product_kit/locale/zh_CN.po
@@ -0,0 +1,282 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:product.component,parent_product:"
+msgid "Parent Variant"
+msgstr ""
+
+msgctxt "field:product.component,parent_template:"
+msgid "Parent Product"
+msgstr ""
+
+msgctxt "field:product.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:product.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:product.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:product.product,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:product.template,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:purchase.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:purchase.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:purchase.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:purchase.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:purchase.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:purchase.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line,component_children:"
+msgid "Component Children"
+msgstr ""
+
+msgctxt "field:sale.line,component_parent:"
+msgid "Component Parent"
+msgstr ""
+
+msgctxt "field:sale.line,components:"
+msgid "Components"
+msgstr ""
+
+msgctxt "field:sale.line.component,fixed:"
+msgid "Fixed"
+msgstr ""
+
+msgctxt "field:sale.line.component,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:sale.line.component,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:sale.line.component,parent_type:"
+msgid "Parent Type"
+msgstr ""
+
+msgctxt "field:sale.line.component,price_ratio:"
+msgid "Price Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:sale.line.component,product_unit_category:"
+msgid "Product Unit Category"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.line.component,quantity_ratio:"
+msgid "Quantity Ratio"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.line.component,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,component:"
+msgid "Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,component:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "field:sale.line.component-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "help:product.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:purchase.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "help:sale.line.component,fixed:"
+msgid ""
+"Check to make the quantity of the component independent of the kit quantity."
+msgstr ""
+
+msgctxt "model:product.component,name:"
+msgid "Product Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component,name:"
+msgid "Purchase Line Component"
+msgstr ""
+
+msgctxt "model:purchase.line.component-ignored-stock.move,name:"
+msgid "Purchase Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line.component-recreated-stock.move,name:"
+msgid "Purchase Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "model:sale.line.component,name:"
+msgid "Sale Line Component"
+msgstr ""
+
+msgctxt "model:sale.line.component-ignored-stock.move,name:"
+msgid "Sale Line Component - Ignored Move"
+msgstr ""
+
+msgctxt "model:sale.line.component-recreated-stock.move,name:"
+msgid "Sale Line Component - Recreated Move"
+msgstr ""
+
+msgctxt "selection:product.product,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "selection:product.template,type:"
+msgid "Kit"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Components"
+msgstr ""
+
+msgctxt "view:sale.line:"
+msgid "Components"
+msgstr ""
diff --git a/modules/product_kit/product.py b/modules/product_kit/product.py
new file mode 100644
index 0000000000..c46f68b610
--- /dev/null
+++ b/modules/product_kit/product.py
@@ -0,0 +1,289 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from decimal import Decimal
+
+from trytond.model import (
+ ModelView, ModelSQL, ModelStorage, sequence_ordered, fields)
+from trytond.pyson import Eval, If, Bool
+from trytond.pool import PoolMeta, Pool
+
+from trytond.modules.product import round_price
+
+
+class Template(metaclass=PoolMeta):
+ __name__ = "product.template"
+
+ components = fields.One2Many(
+ 'product.component', 'parent_template', "Components")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.type.selection.append(('kit', "Kit"))
+
+ @fields.depends('type', 'cost_price_method')
+ def on_change_type(self):
+ super().on_change_type()
+ if self.type == 'kit':
+ self.cost_price_method = 'fixed'
+
+ @classmethod
+ def copy(cls, templates, default=None):
+ pool = Pool()
+ Component = pool.get('product.component')
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+
+ copy_components = 'components' not in default
+ default.setdefault('components', None)
+ new_templates = super().copy(templates, default)
+ if copy_components:
+ old2new = {}
+ to_copy = []
+ for template, new_template in zip(templates, new_templates):
+ to_copy.extend(
+ c for c in template.components if not c.parent_product)
+ old2new[template.id] = new_template.id
+ if to_copy:
+ Component.copy(to_copy, {
+ 'parent_template': (lambda d:
+ old2new[d['parent_template']]),
+ })
+ return new_templates
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = "product.product"
+
+ components = fields.One2Many(
+ 'product.component', 'parent_product', "Components")
+
+ def get_multivalue(self, name, **pattern):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ value = super().get_multivalue(name, **pattern)
+ if name == 'cost_price' and self.type == 'kit':
+ value = Decimal(0)
+ for component in self.components_used:
+ cost_price = component.product.get_multivalue(
+ 'cost_price', **pattern)
+ cost_price = Uom.compute_price(
+ component.product.default_uom, cost_price, component.unit)
+ value += cost_price * Decimal(str(component.quantity))
+ value = round_price(value)
+ return value
+
+ @property
+ def components_used(self):
+ return self.components or self.template.components
+
+ @classmethod
+ def get_quantity(cls, products, name):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ kits = [p for p in products if p.type == 'kit']
+ quantities = super().get_quantity(products, name)
+ for kit in kits:
+ qties = []
+ for component in kit.components_used:
+ component_qty = Uom.compute_qty(
+ component.product.default_uom,
+ getattr(component.product, name),
+ component.unit, round=False)
+ if not component.fixed:
+ component_qty /= component.quantity
+ qties.append(component_qty)
+ quantities[kit.id] = kit.default_uom.floor(min(qties, default=0))
+ return quantities
+
+ @classmethod
+ def copy(cls, products, default=None):
+ pool = Pool()
+ Component = pool.get('product.component')
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+
+ copy_components = 'components' not in default
+ if 'template' in default:
+ default.setdefault('components', None)
+ new_products = super().copy(products, default)
+ if 'template' in default and copy_components:
+ template2new = {}
+ product2new = {}
+ to_copy = []
+ for product, new_product in zip(products, new_products):
+ if product.components:
+ to_copy.extend(product.components)
+ template2new[product.template.id] = new_product.template.id
+ product2new[product.id] = new_product.id
+ if to_copy:
+ Component.copy(to_copy, {
+ 'parent_product': (lambda d:
+ product2new[d['parent_product']]),
+ 'parent_template': (lambda d:
+ template2new[d['parent_template']]),
+ })
+ return new_products
+
+
+class ComponentMixin(sequence_ordered(), ModelStorage):
+
+ parent_type = fields.Function(fields.Selection(
+ 'get_product_types', "Parent Type"), 'on_change_with_parent_type')
+ product = fields.Many2One(
+ 'product.product', "Product", required=True,
+ domain=[
+ ('components', '=', None),
+ ('template.components', '=', None),
+ If(Eval('parent_type') == 'kit',
+ ('type', '=', 'goods'),
+ ()),
+ ],
+ depends=['parent_type'])
+ product_unit_category = fields.Function(
+ fields.Many2One('product.uom.category', "Product Unit Category"),
+ 'on_change_with_product_unit_category')
+ quantity = fields.Float(
+ "Quantity", required=True,
+ digits=(16, Eval('unit_digits', 2)),
+ depends=['unit_digits'])
+ unit = fields.Many2One('product.uom', "Unit", required=True,
+ domain=[
+ If(Bool(Eval('product_unit_category')),
+ ('category', '=', Eval('product_unit_category')),
+ ('category', '!=', -1)),
+ ],
+ depends=['product', 'product_unit_category'])
+ unit_digits = fields.Function(fields.Integer('Unit Digits'),
+ 'on_change_with_unit_digits')
+ fixed = fields.Boolean("Fixed",
+ help="Check to make the quantity of the component independent "
+ "of the kit quantity.")
+
+ @classmethod
+ def get_product_types(cls):
+ pool = Pool()
+ Product = pool.get('product.product')
+ return Product.fields_get(['type'])['type']['selection']
+
+ def on_change_with_parent_type(self, name):
+ raise NotImplementedError
+
+ @property
+ def parent_uom(self):
+ raise NotImplementedError
+
+ @fields.depends('product', 'unit', 'quantity',
+ methods=['on_change_with_product_unit_category'])
+ def on_change_product(self):
+ if self.product:
+ self.product_unit_category = (
+ self.on_change_with_product_unit_category())
+ if (not self.unit
+ or self.unit.category != self.product_unit_category):
+ self.unit = self.product.default_uom
+
+ @fields.depends('product')
+ def on_change_with_product_unit_category(self, name=None):
+ if self.product:
+ return self.product.default_uom.category.id
+
+ @fields.depends('unit')
+ def on_change_with_unit_digits(self, name=None):
+ if self.unit:
+ return self.unit.digits
+
+ def get_line(self, Line, quantity, unit, **values):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ line = Line(product=self.product, **values)
+ line.unit = self.unit
+ if self.fixed:
+ line.quantity = self.quantity
+ else:
+ quantity = Uom.compute_qty(
+ unit, quantity, self.parent_uom, round=False)
+ line.quantity = self.unit.round(quantity * self.quantity)
+ return line
+
+ def get_rec_name(self, name):
+ pool = Pool()
+ Lang = pool.get('ir.lang')
+ lang = Lang.get()
+ return (lang.format(
+ '%.*f', (self.unit.digits, self.quantity))
+ + '%s %s' % (
+ self.unit.symbol, self.product.rec_name))
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return ['OR',
+ ('product.rec_name',) + tuple(clause[1:]),
+ ]
+
+
+class Component(ComponentMixin, ModelSQL, ModelView):
+ "Product Component"
+ __name__ = "product.component"
+
+ parent_template = fields.Many2One(
+ 'product.template', "Parent Product",
+ required=True, ondelete='CASCADE', select=True,
+ domain=[
+ If(Bool(Eval('parent_product')),
+ ('products', '=', Eval('parent_product')),
+ ()),
+ ],
+ depends=['parent_product'])
+ parent_product = fields.Many2One(
+ 'product.product', "Parent Variant", ondelete='CASCADE', select=True,
+ domain=[
+ If(Bool(Eval('parent_template')),
+ ('template', '=', Eval('parent_template')),
+ ()),
+ ],
+ depends=['parent_template'])
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.__access__.update(['parent_template', 'parent_product'])
+
+ @fields.depends(
+ 'parent_product', '_parent_parent_product.template')
+ def on_change_parent_product(self):
+ if self.parent_product:
+ self.parent_template = self.parent_product.template
+
+ @fields.depends(
+ 'parent_template', '_parent_parent_template.type',
+ 'parent_product', '_parent_parent_product.type')
+ def on_change_with_parent_type(self, name=None):
+ if self.parent_product:
+ return self.parent_product.type
+ elif self.parent_template:
+ return self.parent_template.type
+
+ @property
+ def parent_uom(self):
+ if self.parent_product:
+ return self.parent_product.default_uom
+ elif self.parent_template:
+ return self.parent_template.default_uom
+
+ def get_rec_name(self, name):
+ return super().get_rec_name(name) + (
+ ' @ %s' % (
+ self.parent_product.rec_name if self.parent_product
+ else self.parent_template.rec_name))
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return super().search_rec_name(name, clause) + [
+ ('parent_product.rec_name',) + tuple(clause[1:]),
+ ('parent_template.rec_name',) + tuple(clause[1:]),
+ ]
diff --git a/modules/product_kit/product.xml b/modules/product_kit/product.xml
new file mode 100644
index 0000000000..9fc42e5d0b
--- /dev/null
+++ b/modules/product_kit/product.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+ product.template
+
+ product_template_form
+
+
+
+ product.component
+ tree
+ product_component_list
+
+
+
+ product.component
+ form
+ product_component_form
+
+
+
+
diff --git a/modules/product_kit/purchase.py b/modules/product_kit/purchase.py
new file mode 100644
index 0000000000..ba76c33c39
--- /dev/null
+++ b/modules/product_kit/purchase.py
@@ -0,0 +1,148 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.i18n import gettext
+from trytond.pool import PoolMeta, Pool
+from trytond.model import ModelSQL, ModelView, fields
+
+from trytond.modules.product import round_price
+
+from .product import ComponentMixin
+from .common import order_mixin, order_line_mixin, order_line_component_mixin
+from .common import get_shipments_returns, search_shipments_returns
+from .common import handle_shipment_exception_mixin
+from .common import AmendmentLineMixin
+
+
+class Purchase(order_mixin('purchase'), metaclass=PoolMeta):
+ __name__ = 'purchase.purchase'
+
+ def create_move(self, move_type):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ moves = super().create_move(move_type)
+ for line in self.lines:
+ if line.components:
+ for component in line.components:
+ move = component.get_move(move_type)
+ if move:
+ moves.append(move)
+ Move.save(moves)
+ return moves
+
+ @get_shipments_returns('stock.shipment.in')
+ def get_shipments(self, name):
+ return super().get_shipments(name)
+
+ @get_shipments_returns('stock.shipment.in.return')
+ def get_shipment_returns(self, name):
+ return super().get_shipment_returns(name)
+
+ @classmethod
+ @search_shipments_returns('stock.shipment.in')
+ def search_shipments(cls, name, clause):
+ return super().search_shipments(name, clause)
+
+ @classmethod
+ @search_shipments_returns('stock.shipment.in.return')
+ def search_shipment_returns(cls, name, clause):
+ return super().search_shipments(name, clause)
+
+
+class Line(order_line_mixin('purchase'), metaclass=PoolMeta):
+ __name__ = 'purchase.line'
+
+ def get_component_order_line(self, component, **values):
+ values = values.copy()
+ values['purchase'] = self.purchase
+ return super().get_component_order_line(component, **values)
+
+
+class LineComponent(
+ order_line_component_mixin('purchase'), ComponentMixin,
+ ModelSQL, ModelView):
+ "Purchase Line Component"
+ __name__ = 'purchase.line.component'
+
+ def get_move(self, move_type):
+ from trytond.modules.purchase.exceptions import PartyLocationError
+ pool = Pool()
+ Move = pool.get('stock.move')
+
+ if (self.quantity >= 0) != (move_type == 'in'):
+ return
+
+ quantity = (
+ self._get_move_quantity(move_type)
+ - self._get_shipped_quantity(move_type))
+
+ quantity = self.unit.round(quantity)
+ if quantity <= 0:
+ return
+
+ if not self.line.purchase.party.supplier_location:
+ raise PartyLocationError(
+ gettext('purchase.msg_purchase_supplier_location_required',
+ purchase=self.purchase.rec_name,
+ party=self.purchase.party.rec_name))
+
+ move = Move()
+ move.quantity = quantity
+ move.uom = self.unit
+ move.product = self.product
+ move.from_location = self.line.from_location
+ move.to_location = self.line.to_location
+ move.state = 'draft'
+ move.company = self.line.purchase.company
+ if move.on_change_with_unit_price_required():
+ move.unit_price = round_price(
+ self.line.unit_price * self.price_ratio)
+ move.currency = self.line.purchase.currency
+ move.planned_date = self.line.planned_delivery_date
+ move.origin = self
+ return move
+
+ def _get_move_quantity(self, shipment_type):
+ 'Return the quantity that should be shipped'
+ return abs(self.quantity)
+
+
+class LineComponentIgnoredMove(ModelSQL):
+ 'Purchase Line Component - Ignored Move'
+ __name__ = 'purchase.line.component-ignored-stock.move'
+ component = fields.Many2One(
+ 'purchase.line.component', "Component",
+ ondelete='CASCADE', select=True, required=True)
+ move = fields.Many2One(
+ 'stock.move', "Move", ondelete='RESTRICT', select=True, required=True)
+
+
+class LineComponentRecreatedMove(ModelSQL):
+ 'Purchase Line Component - Recreated Move'
+ __name__ = 'purchase.line.component-recreated-stock.move'
+ component = fields.Many2One(
+ 'purchase.line.component', "Component",
+ ondelete='CASCADE', select=True, required=True)
+ move = fields.Many2One(
+ 'stock.move', "Move", ondelete='RESTRICT', select=True, required=True)
+
+
+class HandleShipmentException(
+ handle_shipment_exception_mixin('purchase'),
+ metaclass=PoolMeta):
+ __name__ = 'purchase.handle.shipment.exception'
+
+
+class Amendment(metaclass=PoolMeta):
+ __name__ = 'purchase.amendment'
+
+ @classmethod
+ def _stock_moves(cls, line):
+ yield from super()._stock_moves(line)
+ for component in line.components:
+ for move in component.moves:
+ if move.state == 'draft':
+ yield move
+
+
+class AmendmentLine(AmendmentLineMixin, metaclass=PoolMeta):
+ __name__ = 'purchase.amendment.line'
diff --git a/modules/product_kit/purchase.xml b/modules/product_kit/purchase.xml
new file mode 100644
index 0000000000..35c8a21124
--- /dev/null
+++ b/modules/product_kit/purchase.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+ purchase.line
+
+ purchase_line_form
+
+
+
+ purchase.line.component
+ tree
+ purchase_line_component_list
+
+
+
+ purchase.line.component
+ form
+ purchase_line_component_form
+
+
+
+
diff --git a/modules/product_kit/sale.py b/modules/product_kit/sale.py
new file mode 100644
index 0000000000..823e1c1d5c
--- /dev/null
+++ b/modules/product_kit/sale.py
@@ -0,0 +1,160 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.i18n import gettext
+from trytond.pool import PoolMeta, Pool
+from trytond.model import ModelSQL, ModelView, fields
+
+from trytond.modules.product import round_price
+
+from .product import ComponentMixin
+from .common import order_mixin, order_line_mixin, order_line_component_mixin
+from .common import get_shipments_returns, search_shipments_returns
+from .common import handle_shipment_exception_mixin
+from .common import AmendmentLineMixin
+
+
+class Sale(order_mixin('sale'), metaclass=PoolMeta):
+ __name__ = 'sale.sale'
+
+ def _get_shipment_moves(self, shipment_type):
+ moves = super()._get_shipment_moves(shipment_type)
+ for line in self.lines:
+ if line.components:
+ for component in line.components:
+ move = component.get_move(shipment_type)
+ if move:
+ moves[component] = move
+ return moves
+
+ @get_shipments_returns('stock.shipment.out')
+ def get_shipments(self, name):
+ return super().get_shipments(name)
+
+ @get_shipments_returns('stock.shipment.out.return')
+ def get_shipment_returns(self, name):
+ return super().get_shipment_returns(name)
+
+ @classmethod
+ @search_shipments_returns('stock.shipment.out')
+ def search_shipments(cls, name, clause):
+ return super().search_shipments(name, clause)
+
+ @classmethod
+ @search_shipments_returns('stock.shipment.out.return')
+ def search_shipment_returns(cls, name, clause):
+ return super().search_shipments(name, clause)
+
+
+class Line(order_line_mixin('sale'), metaclass=PoolMeta):
+ __name__ = 'sale.line'
+
+ def get_component_order_line(self, component, **values):
+ values = values.copy()
+ values['sale'] = self.sale
+ return super().get_component_order_line(component, **values)
+
+
+class LineComponent(
+ order_line_component_mixin('sale'), ComponentMixin,
+ ModelSQL, ModelView):
+ "Sale Line Component"
+ __name__ = 'sale.line.component'
+
+ @property
+ def warehouse(self):
+ return self.line.warehouse
+
+ def get_move(self, shipment_type):
+ from trytond.modules.sale.exceptions import PartyLocationError
+ pool = Pool()
+ Move = pool.get('stock.move')
+ if (shipment_type == 'out') != (self.quantity >= 0):
+ return
+
+ quantity = (
+ self._get_move_quantity(shipment_type)
+ - self._get_shipped_quantity(shipment_type))
+
+ quantity = self.unit.round(quantity)
+ if quantity <= 0:
+ return
+
+ if not self.line.sale.party.customer_location:
+ raise PartyLocationError(
+ gettext('sale.msg_sale_customer_location_required',
+ sale=self.sale.rec_name,
+ party=self.sale.party.rec_name))
+
+ move = Move()
+ move.quantity = quantity
+ move.uom = self.unit
+ move.product = self.product
+ move.from_location = self.line.from_location
+ move.to_location = self.line.to_location
+ move.state = 'draft'
+ move.company = self.line.sale.company
+ if move.on_change_with_unit_price_required():
+ move.unit_price = round_price(
+ self.line.unit_price * self.price_ratio)
+ move.currency = self.line.sale.currency
+ move.planned_date = self.line.planned_shipping_date
+ move.origin = self
+ return move
+
+ def _get_move_quantity(self, shipment_type):
+ 'Return the quantity that should be shipped'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+
+ if self.line.sale.shipment_method == 'order':
+ return abs(self.quantity)
+ elif self.line.sale.shipment_method == 'invoice':
+ quantity = 0.0
+ for invoice_line in self.line.invoice_lines:
+ if (invoice_line.invoice
+ and invoice_line.invoice.state == 'paid'):
+ quantity += Uom.compute_qty(invoice_line.unit,
+ invoice_line.quantity, self.line.unit)
+ return self.quantity * quantity / self.line.quantity
+
+
+class LineComponentIgnoredMove(ModelSQL):
+ 'Sale Line Component - Ignored Move'
+ __name__ = 'sale.line.component-ignored-stock.move'
+ component = fields.Many2One(
+ 'sale.line.component', "Component",
+ ondelete='CASCADE', select=True, required=True)
+ move = fields.Many2One(
+ 'stock.move', "Move", ondelete='RESTRICT', select=True, required=True)
+
+
+class LineComponentRecreatedMove(ModelSQL):
+ 'Sale Line Component - Recreated Move'
+ __name__ = 'sale.line.component-recreated-stock.move'
+ component = fields.Many2One(
+ 'sale.line.component', "Sale Line Component",
+ ondelete='CASCADE', select=True, required=True)
+ move = fields.Many2One(
+ 'stock.move', "Move", ondelete='RESTRICT', select=True, required=True)
+
+
+class HandleShipmentException(
+ handle_shipment_exception_mixin('sale'),
+ metaclass=PoolMeta):
+ __name__ = 'sale.handle.shipment.exception'
+
+
+class Amendment(metaclass=PoolMeta):
+ __name__ = 'sale.amendment'
+
+ @classmethod
+ def _stock_moves(cls, line):
+ yield from super()._stock_moves(line)
+ for component in line.components:
+ for move in component.moves:
+ if move.state == 'draft':
+ yield move
+
+
+class AmendmentLine(AmendmentLineMixin, metaclass=PoolMeta):
+ __name__ = 'sale.amendment.line'
diff --git a/modules/product_kit/sale.xml b/modules/product_kit/sale.xml
new file mode 100644
index 0000000000..371b5a6ee8
--- /dev/null
+++ b/modules/product_kit/sale.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+ sale.line
+
+ sale_line_form
+
+
+
+ sale.line.component
+ tree
+ sale_line_component_list
+
+
+
+ sale.line.component
+ form
+ sale_line_component_form
+
+
+
+
diff --git a/modules/product_kit/setup.py b/modules/product_kit/setup.py
new file mode 100755
index 0000000000..c22ac1d7c9
--- /dev/null
+++ b/modules/product_kit/setup.py
@@ -0,0 +1,162 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ content = io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+ content = re.sub(
+ r'(?m)^\.\. toctree::\r?\n((^$|^\s.*$)\r?\n)*', '', content)
+ return content
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_product_kit'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = []
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [
+ get_require_version('proteus'),
+ get_require_version('trytond_account_invoice'),
+ get_require_version('trytond_account_invoice_stock'),
+ get_require_version('trytond_company'),
+ get_require_version('trytond_purchase'),
+ get_require_version('trytond_sale'),
+ get_require_version('trytond_stock'),
+ ]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module to manage product kits and components',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": ('https://docs.tryton.org/projects/'
+ 'modules-product-kit'),
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/product_kit',
+ },
+ keywords='',
+ package_dir={'trytond.modules.product_kit': '.'},
+ packages=(
+ ['trytond.modules.product_kit']
+ + ['trytond.modules.product_kit.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.product_kit': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.fodt',
+ 'icons/*.svg', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ product_kit = trytond.modules.product_kit
+ """, # noqa: E501
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/product_kit/stock.py b/modules/product_kit/stock.py
new file mode 100644
index 0000000000..74be5cc2d3
--- /dev/null
+++ b/modules/product_kit/stock.py
@@ -0,0 +1,202 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from decimal import Decimal
+
+from trytond.model import fields
+from trytond.pool import PoolMeta, Pool
+from trytond.transaction import Transaction
+
+from trytond.modules.product import round_price
+
+
+class Move(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+
+ def _compute_component_unit_price(self, unit_price):
+ pool = Pool()
+ Currency = pool.get('currency.currency')
+ UoM = pool.get('product.uom')
+ amount, quantity = 0, 0
+ for line in self.origin.line.invoice_lines:
+ if line.invoice and line.invoice.state in {'posted', 'paid'}:
+ with Transaction().set_context(date=self.effective_date):
+ amount += Currency.compute(
+ line.invoice.currency, line.amount, self.currency)
+ quantity += UoM.compute_qty(
+ line.unit, line.quantity, self.origin.line.unit)
+ amount *= self.origin.price_ratio
+ if quantity:
+ unit_price = round_price(amount / Decimal(str(quantity)))
+ unit_price = UoM.compute_price(self.origin.unit, unit_price, self.uom)
+ return unit_price
+
+
+class MoveSale(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+
+ @classmethod
+ def _get_origin(cls):
+ return super()._get_origin() + ['sale.line.component']
+
+ def get_sale(self, name):
+ pool = Pool()
+ SaleLineComponent = pool.get('sale.line.component')
+ sale = super().get_sale(name)
+ if isinstance(self.origin, SaleLineComponent):
+ sale = self.origin.line.sale.id
+ return sale
+
+ @classmethod
+ def search_sale(cls, name, clause):
+ return ['OR',
+ super().search_sale(name, clause),
+ ('origin.line.' + clause[0],) + tuple(clause[1:3])
+ + ('sale.line.component',) + tuple(clause[3:])]
+
+ def get_sale_exception_state(self, name):
+ pool = Pool()
+ SaleLineComponent = pool.get('sale.line.component')
+ state = super().get_sale_exception_state(name)
+ if isinstance(self.origin, SaleLineComponent):
+ if self in self.origin.moves_recreated:
+ state = 'recreated'
+ elif self in self.origin.moves_ignored:
+ state = 'ignored'
+ return state
+
+ @fields.depends('origin')
+ def on_change_with_product_uom_category(self, name=None):
+ pool = Pool()
+ SaleLineComponent = pool.get('sale.line.component')
+ category = super().on_change_with_product_uom_category(name=name)
+ # Enforce the same unit category as they are used to compute the
+ # remaining quantity to ship and the quantity to invoice.
+ # Use getattr as reference field can have negative id
+ if (isinstance(self.origin, SaleLineComponent)
+ and getattr(self.origin, 'unit', None)):
+ category = self.origin.unit.category.id
+ return category
+
+ def get_cost_price(self, product_cost_price=None):
+ pool = Pool()
+ SaleLineComponent = pool.get('sale.line.component')
+ Sale = pool.get('sale.sale')
+ # For return sale's move use the cost price of the original sale
+ if (isinstance(self.origin, SaleLineComponent)
+ and self.origin.quantity < 0
+ and self.from_location.type != 'storage'
+ and self.to_location.type == 'storage'
+ and isinstance(self.origin.line.origin, Sale)):
+ sale = self.origin.line.origin
+ cost = Decimal(0)
+ qty = Decimal(0)
+ for move in sale.moves:
+ if (move.state == 'done'
+ and move.from_location.type == 'storage'
+ and move.to_location.type == 'customer'
+ and move.product == self.product):
+ move_quantity = Decimal(str(move.internal_quantity))
+ cost_price = move.get_cost_price(
+ product_cost_price=move.cost_price)
+ qty += move_quantity
+ cost += cost_price * move_quantity
+ if qty:
+ product_cost_price = round_price(cost / qty)
+ return super().get_cost_price(product_cost_price=product_cost_price)
+
+ @property
+ def origin_name(self):
+ pool = Pool()
+ SaleLineComponent = pool.get('sale.line.component')
+ name = super().origin_name
+ if isinstance(self.origin, SaleLineComponent):
+ name = self.origin.line.sale.rec_name
+ return name
+
+ def _compute_unit_price(self, unit_price):
+ pool = Pool()
+ SaleLineComponent = pool.get('sale.line.component')
+ unit_price = super()._compute_unit_price(unit_price)
+ if isinstance(self.origin, SaleLineComponent):
+ unit_price = self._compute_component_unit_price(unit_price)
+ return unit_price
+
+
+class MovePurchase(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+
+ @classmethod
+ def _get_origin(cls):
+ return super()._get_origin() + ['purchase.line.component']
+
+ def get_purchase(self, name):
+ pool = Pool()
+ PurchaseLineComponent = pool.get('purchase.line.component')
+ purchase = super().get_purchase(name)
+ if isinstance(self.origin, PurchaseLineComponent):
+ purchase = self.origin.line.purchase.id
+ return purchase
+
+ @classmethod
+ def search_purchase(cls, name, clause):
+ return ['OR',
+ super().search_purchase(name, clause),
+ ('origin.line.' + clause[0],) + tuple(clause[1:3])
+ + ('purchase.line.component',) + tuple(clause[3:])]
+
+ def get_supplier(self, name):
+ pool = Pool()
+ PurchaseLineComponent = pool.get('purchase.line.component')
+ supplier = super().get_supplier(name)
+ if isinstance(self.origin, PurchaseLineComponent):
+ supplier = self.origin.line.purchase.party.id
+ return supplier
+
+ @classmethod
+ def search_supplier(cls, name, clause):
+ return ['OR',
+ super().search_supplier(name, clause),
+ ('origin.line.purchase.party' + clause[0].lstrip(name),)
+ + tuple(clause[1:3]) + ('purchase.line.component',)
+ + tuple(clause[3:])]
+
+ def get_purchase_exception_state(self, name):
+ pool = Pool()
+ PurchaseLineComponent = pool.get('purchase.line.component')
+ state = super().get_purchase_exception_state(name)
+ if isinstance(self.origin, PurchaseLineComponent):
+ if self in self.origin.moves_recreated:
+ state = 'recreated'
+ elif self in self.origin.moves_ignored:
+ state = 'ignored'
+ return state
+
+ @fields.depends('origin')
+ def on_change_with_product_uom_category(self, name=None):
+ pool = Pool()
+ PurchaseLineComponent = pool.get('purchase.line.component')
+ category = super().on_change_with_product_uom_category(name=name)
+ # Enforce the same unit category as they are used to compute the
+ # remaining quantity to ship and the quantity to invoice.
+ # Use getattr as reference field can have negative id
+ if (isinstance(self.origin, PurchaseLineComponent)
+ and getattr(self.origin, 'unit', None)):
+ category = self.origin.unit.category.id
+ return category
+
+ @property
+ def origin_name(self):
+ pool = Pool()
+ PurchaseLineComponent = pool.get('purchase.line.component')
+ name = super().origin_name
+ if isinstance(self.origin, PurchaseLineComponent):
+ name = self.origin.line.purchase.rec_name
+ return name
+
+ def _compute_unit_price(self, unit_price):
+ pool = Pool()
+ PurchaseLineComponent = pool.get('purchase.line.component')
+ unit_price = super()._compute_unit_price(unit_price)
+ if isinstance(self.origin, PurchaseLineComponent):
+ unit_price = self._compute_component_unit_price(unit_price)
+ return unit_price
diff --git a/modules/product_kit/tests/__init__.py b/modules/product_kit/tests/__init__.py
new file mode 100644
index 0000000000..6e5d96c083
--- /dev/null
+++ b/modules/product_kit/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.product_kit.tests.test_product_kit import suite # noqa: E501
+except ImportError:
+ from .test_product_kit import suite
+
+__all__ = ['suite']
diff --git a/modules/product_kit/tests/scenario_product_kit.rst b/modules/product_kit/tests/scenario_product_kit.rst
new file mode 100644
index 0000000000..5fb8935bc0
--- /dev/null
+++ b/modules/product_kit/tests/scenario_product_kit.rst
@@ -0,0 +1,151 @@
+====================
+Product Kit Scenario
+====================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company
+
+Activate product_kit and stock::
+
+ >>> config = activate_modules(['product_kit', 'stock'])
+
+Create company::
+
+ >>> _ = create_company()
+
+Create products::
+
+ >>> Uom = Model.get('product.uom')
+ >>> unit, = Uom.find([('name', '=', 'Unit')])
+ >>> meter, = Uom.find([('name', '=', "Meter")])
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Product = Model.get('product.product')
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product 1"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.save()
+ >>> product1, = template.products
+ >>> product1.cost_price = Decimal('10.0000')
+ >>> product1.save()
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product 2"
+ >>> template.default_uom = meter
+ >>> template.type = 'goods'
+ >>> template.save()
+ >>> product2, = template.products
+ >>> product2.cost_price = Decimal('20.0000')
+ >>> product2.save()
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product 3"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.save()
+ >>> product3, = template.products
+ >>> product3.cost_price = Decimal('1.0000')
+ >>> product3.save()
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Service"
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.save()
+ >>> service, = template.products
+ >>> service.cost_price = Decimal('5.0000')
+ >>> service.save()
+
+Create composed product::
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Composed Product"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.save()
+ >>> composed_product, = template.products
+ >>> composed_product.cost_price = Decimal('10.0000')
+
+ >>> component = composed_product.components.new()
+ >>> component.product = product1
+ >>> component.quantity = 2
+ >>> component = composed_product.components.new()
+ >>> component.product = service
+ >>> component.quantity = 1
+ >>> composed_product.save()
+
+ >>> composed_product.cost_price
+ Decimal('10.0000')
+
+Create a kit::
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Kit"
+ >>> template.default_uom = unit
+ >>> template.type = 'kit'
+ >>> template.save()
+ >>> kit, = template.products
+
+ >>> component = template.components.new()
+ >>> component.product = product1
+ >>> component.quantity = 1
+ >>> component = template.components.new()
+ >>> component.product = product2
+ >>> component.quantity = 2
+ >>> component = template.components.new()
+ >>> component.product = product3
+ >>> component.quantity = 1
+ >>> component.fixed = True
+ >>> template.save()
+
+ >>> kit.cost_price
+ Decimal('51.0000')
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+
+Fill stock with some components::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> moves = []
+
+ >>> move = StockMove()
+ >>> move.product = product1
+ >>> move.quantity = 10
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = storage_loc
+ >>> move.unit_price = Decimal('10')
+ >>> moves.append(move)
+
+ >>> move = StockMove()
+ >>> move.product = product2
+ >>> move.quantity = 15
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = storage_loc
+ >>> move.unit_price = Decimal('20')
+ >>> moves.append(move)
+
+ >>> move = StockMove()
+ >>> move.product = product3
+ >>> move.quantity = 20
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = storage_loc
+ >>> move.unit_price = Decimal('1')
+ >>> moves.append(move)
+
+ >>> StockMove.click(moves, 'do')
+
+Check kit quantity::
+
+ >>> with config.set_context(locations=[storage_loc.id]):
+ ... kit = Product(kit.id)
+ >>> kit.quantity
+ 7.0
diff --git a/modules/product_kit/tests/scenario_product_kit_purchase.rst b/modules/product_kit/tests/scenario_product_kit_purchase.rst
new file mode 100644
index 0000000000..73a43425ba
--- /dev/null
+++ b/modules/product_kit/tests/scenario_product_kit_purchase.rst
@@ -0,0 +1,279 @@
+=============================
+Purchase Product Kit Scenario
+=============================
+
+Imports::
+
+ >>> import datetime as dt
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import (
+ ... create_company, get_company)
+ >>> from trytond.modules.account.tests.tools import (
+ ... create_fiscalyear, create_chart, get_accounts)
+ >>> from trytond.modules.account_invoice.tests.tools import (
+ ... set_fiscalyear_invoice_sequences)
+ >>> today = dt.date.today()
+
+Activate product_kit, purchase and account_invoice::
+
+ >>> config = activate_modules(
+ ... ['product_kit', 'purchase', 'account_invoice',
+ ... 'account_invoice_stock'])
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create fiscal year::
+
+ >>> fiscalyear = set_fiscalyear_invoice_sequences(
+ ... create_fiscalyear(company))
+ >>> fiscalyear.click('create_period')
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+
+Create party::
+
+ >>> Party = Model.get('party.party')
+ >>> supplier = Party(name="Supplier")
+ >>> supplier.save()
+
+Create account categories::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_expense = accounts['expense']
+ >>> account_category.account_revenue = accounts['revenue']
+ >>> account_category.save()
+
+Create products::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> meter, = ProductUom.find([('name', '=', "Meter")])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product 1"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.purchasable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product1, = template.products
+ >>> product1.cost_price = Decimal('5')
+ >>> product1.save()
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product 2"
+ >>> template.default_uom = meter
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product2, = template.products
+ >>> product2.cost_price = Decimal('8')
+ >>> product2.save()
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product 3"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('30')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product3, = template.products
+ >>> product3.cost_price = Decimal('10')
+ >>> product3.save()
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Service"
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.purchasable = True
+ >>> template.list_price = Decimal('30')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> service, = template.products
+ >>> service.cost_price = Decimal('20')
+ >>> service.save()
+
+Create composed product::
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Composed Product"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.purchasable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> composed_product, = template.products
+ >>> composed_product.cost_price = Decimal('5')
+
+ >>> component = composed_product.components.new()
+ >>> component.product = product1
+ >>> component.quantity = 1
+ >>> component = composed_product.components.new()
+ >>> component.product = service
+ >>> component.quantity = 2
+ >>> component.fixed = True
+ >>> composed_product.save()
+
+Create kit product::
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Kit"
+ >>> template.default_uom = unit
+ >>> template.type = 'kit'
+ >>> template.purchasable = True
+ >>> template.list_price = Decimal('40')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> kit, = template.products
+
+ >>> component = kit.components.new()
+ >>> component.product = product2
+ >>> component.quantity = 2
+ >>> component = kit.components.new()
+ >>> component.product = product3
+ >>> component.quantity = 1
+ >>> component.fixed = True
+ >>> kit.save()
+
+Purchase composed and kit products::
+
+ >>> Purchase = Model.get('purchase.purchase')
+ >>> purchase = Purchase()
+ >>> purchase.party = supplier
+ >>> purchase.invoice_method = 'shipment'
+ >>> line = purchase.lines.new()
+ >>> line.product = composed_product
+ >>> line.quantity = 1
+ >>> line = purchase.lines.new()
+ >>> line.product = kit
+ >>> line.quantity = 2
+ >>> purchase.click('quote')
+ >>> len(purchase.lines)
+ 4
+ >>> [l.quantity for l in purchase.lines]
+ [1.0, 1.0, 2.0, 2.0]
+ >>> line_kit, = [l for l in purchase.lines if l.product == kit]
+ >>> [c.quantity for c in line_kit.components]
+ [4.0, 1.0]
+
+Reset to draft remove components::
+
+ >>> purchase.click('draft')
+ >>> line_kit, = [l for l in purchase.lines if l.product == kit]
+ >>> bool(line_kit.components)
+ False
+ >>> purchase.click('quote')
+
+Process purchase::
+
+ >>> purchase.click('confirm')
+ >>> purchase.state
+ 'processing'
+ >>> len(purchase.shipments), len(purchase.invoices)
+ (0, 1)
+
+Check invoice::
+
+ >>> invoice, = purchase.invoices
+ >>> line, = invoice.lines
+ >>> line.product == service
+ True
+
+Check stock moves::
+
+ >>> len(purchase.moves)
+ 4
+ >>> product2quantity = {
+ ... m.product: m.quantity for m in purchase.moves}
+ >>> product2quantity[composed_product]
+ 1.0
+ >>> product2quantity[product1]
+ 1.0
+ >>> product2quantity[product2]
+ 4.0
+ >>> product2quantity[product3]
+ 1.0
+
+Receive partial shipment::
+
+ >>> Move = Model.get('stock.move')
+ >>> ShipmentIn = Model.get('stock.shipment.in')
+ >>> shipment = ShipmentIn()
+ >>> shipment.supplier = supplier
+ >>> for move in purchase.moves:
+ ... incoming_move = Move(move.id)
+ ... shipment.incoming_moves.append(incoming_move)
+ >>> shipment.save()
+
+ >>> product2move = {
+ ... m.product: m for m in shipment.incoming_moves}
+ >>> product2move[product2].quantity = 2.0
+ >>> shipment.click('receive')
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+
+Check new invoice::
+
+ >>> purchase.reload()
+ >>> _, invoice = purchase.invoices
+ >>> len(invoice.lines)
+ 3
+ >>> product2quantity = {l.product: l.quantity for l in invoice.lines}
+ >>> product2quantity[composed_product]
+ 1.0
+ >>> product2quantity[product1]
+ 1.0
+ >>> product2quantity[kit]
+ 1.0
+
+Post invoice::
+
+ >>> invoice.invoice_date = today
+ >>> invoice.click('post')
+ >>> invoice.state
+ 'posted'
+
+Check unit price of moves::
+
+ >>> shipment.reload()
+ >>> invoice.reload()
+ >>> sorted([m.unit_price for m in shipment.incoming_moves])
+ [Decimal('5.0000'), Decimal('5.0000'), Decimal('9.4545'), Decimal('14.1818')]
+
+Check backorder moves::
+
+ >>> len(purchase.moves)
+ 5
+ >>> backorder, = [m for m in purchase.moves if m.state == 'draft']
+
+Cancel backorder::
+
+ >>> backorder.click('cancel')
+ >>> backorder.state
+ 'cancelled'
+ >>> purchase.reload()
+ >>> purchase.shipment_state
+ 'exception'
+
+Handle shipment exception::
+
+ >>> shipment_exception = Wizard('purchase.handle.shipment.exception', [purchase])
+ >>> shipment_exception.execute('handle')
+
+ >>> len(purchase.moves)
+ 6
diff --git a/modules/product_kit/tests/scenario_product_kit_sale.rst b/modules/product_kit/tests/scenario_product_kit_sale.rst
new file mode 100644
index 0000000000..7a244ef065
--- /dev/null
+++ b/modules/product_kit/tests/scenario_product_kit_sale.rst
@@ -0,0 +1,273 @@
+=========================
+Sale Product Kit Scenario
+=========================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import (
+ ... create_company, get_company)
+ >>> from trytond.modules.account.tests.tools import (
+ ... create_fiscalyear, create_chart, get_accounts)
+ >>> from trytond.modules.account_invoice.tests.tools import (
+ ... set_fiscalyear_invoice_sequences)
+
+Activate product_kit, sale and account_invoice::
+
+ >>> config = activate_modules(
+ ... ['product_kit', 'sale', 'account_invoice',
+ ... 'account_invoice_stock'])
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create fiscal year::
+
+ >>> fiscalyear = set_fiscalyear_invoice_sequences(
+ ... create_fiscalyear(company))
+ >>> fiscalyear.click('create_period')
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+
+Create party::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create account categories::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_expense = accounts['expense']
+ >>> account_category.account_revenue = accounts['revenue']
+ >>> account_category.save()
+
+Create products::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> meter, = ProductUom.find([('name', '=', "Meter")])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product 1"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.salable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product1, = template.products
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product 2"
+ >>> template.default_uom = meter
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product2, = template.products
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product 3"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('30')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product3, = template.products
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Service"
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.salable = True
+ >>> template.list_price = Decimal('30')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> service, = template.products
+
+Create composed product::
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Composed Product"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.salable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> composed_product, = template.products
+
+ >>> component = composed_product.components.new()
+ >>> component.product = product1
+ >>> component.quantity = 2
+ >>> component = composed_product.components.new()
+ >>> component.product = service
+ >>> component.quantity = 1
+ >>> component.fixed = True
+ >>> composed_product.save()
+
+Create kit product::
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Kit"
+ >>> template.default_uom = unit
+ >>> template.type = 'kit'
+ >>> template.salable = True
+ >>> template.list_price = Decimal('40')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> kit, = template.products
+
+ >>> component = kit.components.new()
+ >>> component.product = product2
+ >>> component.quantity = 1
+ >>> component = kit.components.new()
+ >>> component.product = product3
+ >>> component.quantity = 2
+ >>> component.fixed = True
+ >>> kit.save()
+
+Sale composed and kit products::
+
+ >>> Sale = Model.get('sale.sale')
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.invoice_method = 'shipment'
+ >>> line = sale.lines.new()
+ >>> line.product = composed_product
+ >>> line.quantity = 2
+ >>> line = sale.lines.new()
+ >>> line.product = kit
+ >>> line.quantity = 5
+ >>> sale.click('quote')
+ >>> len(sale.lines)
+ 4
+ >>> [l.quantity for l in sale.lines]
+ [2.0, 4.0, 1.0, 5.0]
+ >>> line_kit, = [l for l in sale.lines if l.product == kit]
+ >>> [c.quantity for c in line_kit.components]
+ [5.0, 2.0]
+
+Reset to draft remove components::
+
+ >>> sale.click('draft')
+ >>> line_kit, = [l for l in sale.lines if l.product == kit]
+ >>> bool(line_kit.components)
+ False
+ >>> sale.click('quote')
+
+Process sale::
+
+ >>> sale.click('confirm')
+ >>> sale.state
+ 'processing'
+ >>> len(sale.shipments), len(sale.invoices)
+ (1, 1)
+
+Check invoice::
+
+ >>> invoice, = sale.invoices
+ >>> line, = invoice.lines
+ >>> line.product == service
+ True
+
+Check shipment::
+
+ >>> shipment, = sale.shipments
+ >>> len(shipment.outgoing_moves)
+ 4
+ >>> product2quantity = {
+ ... m.product: m.quantity for m in shipment.outgoing_moves}
+ >>> product2quantity[composed_product]
+ 2.0
+ >>> product2quantity[product1]
+ 4.0
+ >>> product2quantity[product2]
+ 5.0
+ >>> product2quantity[product3]
+ 2.0
+
+Ship partially::
+
+ >>> product2move = {
+ ... m.product: m for m in shipment.inventory_moves}
+ >>> product2move[product1].quantity = 2.0
+ >>> product2move[product2].quantity = 3.0
+ >>> shipment.click('assign_force')
+ >>> shipment.click('pick')
+ >>> shipment.click('pack')
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+
+Check new invoice::
+
+ >>> sale.reload()
+ >>> _, invoice = sale.invoices
+ >>> len(invoice.lines)
+ 3
+ >>> product2quantity = {l.product: l.quantity for l in invoice.lines}
+ >>> product2quantity[composed_product]
+ 2.0
+ >>> product2quantity[product1]
+ 2.0
+ >>> product2quantity[kit]
+ 3.0
+
+Post invoice::
+
+ >>> invoice.click('post')
+ >>> invoice.state
+ 'posted'
+
+Check unit price of moves::
+
+ >>> shipment.reload()
+ >>> invoice.reload()
+ >>> sorted([m.unit_price for m in shipment.outgoing_moves])
+ [Decimal('10.0000'), Decimal('10.0000'), Decimal('25.0000'), Decimal('37.5000')]
+
+Check backorder::
+
+ >>> _, backorder = sale.shipments
+ >>> len(backorder.outgoing_moves)
+ 2
+ >>> product2quantity = {
+ ... m.product: m.quantity for m in backorder.outgoing_moves}
+ >>> product2quantity[product1]
+ 2.0
+ >>> product2quantity[product2]
+ 2.0
+
+Cancel backorder::
+
+ >>> backorder.click('cancel')
+ >>> backorder.state
+ 'cancelled'
+ >>> sale.reload()
+ >>> sale.shipment_state
+ 'exception'
+
+Handle shipment exception::
+
+ >>> shipment_exception = Wizard('sale.handle.shipment.exception', [sale])
+ >>> move, = [
+ ... m for m in shipment_exception.form.recreate_moves
+ ... if m.product == product1]
+ >>> shipment_exception.form.recreate_moves.remove(move)
+ >>> shipment_exception.execute('handle')
+
+ >>> _, _, shipment = sale.shipments
+ >>> len(shipment.outgoing_moves)
+ 1
diff --git a/modules/product_kit/tests/test_product_kit.py b/modules/product_kit/tests/test_product_kit.py
new file mode 100644
index 0000000000..8b75a94c94
--- /dev/null
+++ b/modules/product_kit/tests/test_product_kit.py
@@ -0,0 +1,38 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import unittest
+import doctest
+
+from trytond.tests.test_tryton import ModuleTestCase
+from trytond.tests.test_tryton import suite as test_suite
+from trytond.tests.test_tryton import doctest_teardown
+from trytond.tests.test_tryton import doctest_checker
+from trytond.modules.company.tests import CompanyTestMixin
+
+
+class ProductKitTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test Product Kit module'
+ module = 'product_kit'
+ extras = ['sale', 'purchase']
+
+
+def suite():
+ suite = test_suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductKitTestCase))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_product_kit.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_product_kit_sale.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_product_kit_purchase.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ return suite
diff --git a/modules/product_kit/tox.ini b/modules/product_kit/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/product_kit/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/product_kit/tryton.cfg b/modules/product_kit/tryton.cfg
new file mode 100644
index 0000000000..54886182f5
--- /dev/null
+++ b/modules/product_kit/tryton.cfg
@@ -0,0 +1,17 @@
+[tryton]
+version=6.0.11
+depends:
+ ir
+ product
+extras_depend:
+ account_invoice_stock
+ company
+ purchase
+ purchase_amendment
+ sale
+ sale_amendment
+ stock
+xml:
+ product.xml
+ sale.xml
+ purchase.xml
diff --git a/modules/product_kit/view/product_component_form.xml b/modules/product_kit/view/product_component_form.xml
new file mode 100644
index 0000000000..f31bb1ba1b
--- /dev/null
+++ b/modules/product_kit/view/product_component_form.xml
@@ -0,0 +1,23 @@
+
+
+
diff --git a/modules/product_kit/view/product_component_list.xml b/modules/product_kit/view/product_component_list.xml
new file mode 100644
index 0000000000..965d9f0f14
--- /dev/null
+++ b/modules/product_kit/view/product_component_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/product_kit/view/product_template_form.xml b/modules/product_kit/view/product_template_form.xml
new file mode 100644
index 0000000000..ccf1a0183e
--- /dev/null
+++ b/modules/product_kit/view/product_template_form.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/product_kit/view/purchase_line_component_form.xml b/modules/product_kit/view/purchase_line_component_form.xml
new file mode 100644
index 0000000000..c3d0a366b4
--- /dev/null
+++ b/modules/product_kit/view/purchase_line_component_form.xml
@@ -0,0 +1,19 @@
+
+
+
diff --git a/modules/product_kit/view/purchase_line_component_list.xml b/modules/product_kit/view/purchase_line_component_list.xml
new file mode 100644
index 0000000000..4488059747
--- /dev/null
+++ b/modules/product_kit/view/purchase_line_component_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/product_kit/view/purchase_line_form.xml b/modules/product_kit/view/purchase_line_form.xml
new file mode 100644
index 0000000000..1d91a2961f
--- /dev/null
+++ b/modules/product_kit/view/purchase_line_form.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product_kit/view/sale_line_component_form.xml b/modules/product_kit/view/sale_line_component_form.xml
new file mode 100644
index 0000000000..c3d0a366b4
--- /dev/null
+++ b/modules/product_kit/view/sale_line_component_form.xml
@@ -0,0 +1,19 @@
+
+
+
diff --git a/modules/product_kit/view/sale_line_component_list.xml b/modules/product_kit/view/sale_line_component_list.xml
new file mode 100644
index 0000000000..4488059747
--- /dev/null
+++ b/modules/product_kit/view/sale_line_component_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/product_kit/view/sale_line_form.xml b/modules/product_kit/view/sale_line_form.xml
new file mode 100644
index 0000000000..1d91a2961f
--- /dev/null
+++ b/modules/product_kit/view/sale_line_form.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product_measurements/.drone.yml b/modules/product_measurements/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/product_measurements/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/product_measurements/.flake8 b/modules/product_measurements/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/product_measurements/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/product_measurements/CHANGELOG b/modules/product_measurements/CHANGELOG
new file mode 100644
index 0000000000..e8f8ea6ec0
--- /dev/null
+++ b/modules/product_measurements/CHANGELOG
@@ -0,0 +1,61 @@
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+
+Version 4.0.0 - 2016-05-02
+* Bug fixes (see mercurial logs for details)
+* Add Python3 support
+
+Version 3.8.0 - 2015-11-02
+* Bug fixes (see mercurial logs for details)
+* Add volume
+
+Version 3.6.0 - 2015-04-20
+* Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+
+Version 3.4.0 - 2014-10-20
+* Bug fixes (see mercurial logs for details)
+
+Version 3.2.0 - 2014-04-21
+* Bug fixes (see mercurial logs for details)
+
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+
+Version 2.8.0 - 2013-04-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.6.0 - 2012-10-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.4.0 - 2012-04-24
+* Initial release
diff --git a/modules/product_measurements/COPYRIGHT b/modules/product_measurements/COPYRIGHT
new file mode 100644
index 0000000000..11ec03ad5a
--- /dev/null
+++ b/modules/product_measurements/COPYRIGHT
@@ -0,0 +1,17 @@
+Copyright (C) 2011-2021 Cédric Krier.
+Copyright (C) 2011-2012 Bertrand Chenal.
+Copyright (C) 2011-2017 Nicolas Évrard.
+Copyright (C) 2011-2021 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/product_measurements/LICENSE b/modules/product_measurements/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/product_measurements/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/product_measurements/MANIFEST.in b/modules/product_measurements/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/product_measurements/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/product_measurements/README.rst b/modules/product_measurements/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/product_measurements/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/product_measurements/__init__.py b/modules/product_measurements/__init__.py
new file mode 100644
index 0000000000..75065234ba
--- /dev/null
+++ b/modules/product_measurements/__init__.py
@@ -0,0 +1,12 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import product
+
+
+def register():
+ Pool.register(
+ product.Template,
+ product.Product,
+ module='product_measurements', type_='model')
diff --git a/modules/product_measurements/doc/index.rst b/modules/product_measurements/doc/index.rst
new file mode 100644
index 0000000000..46b1dbe2a2
--- /dev/null
+++ b/modules/product_measurements/doc/index.rst
@@ -0,0 +1,9 @@
+Product Measurements
+####################
+
+The Product Measurements module adds this following measurements to Product:
+
+- Length
+- Height
+- Width
+- Weight
diff --git a/modules/product_measurements/locale/bg.po b/modules/product_measurements/locale/bg.po
new file mode 100644
index 0000000000..7ce3071d24
--- /dev/null
+++ b/modules/product_measurements/locale/bg.po
@@ -0,0 +1,141 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Височина"
+
+#, fuzzy
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Цифри за височина"
+
+#, fuzzy
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "Мер. ед. за височина"
+
+#, fuzzy
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Дължина"
+
+#, fuzzy
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Цифри за дължина"
+
+#, fuzzy
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "Мер. ед. за дължина"
+
+#, fuzzy
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Обем"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Тегло"
+
+#, fuzzy
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Цифри за тегло"
+
+#, fuzzy
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "Мер. ед. за тегло"
+
+#, fuzzy
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Ширина"
+
+#, fuzzy
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Цифри за ширина"
+
+#, fuzzy
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "Мер. ед, за ширина"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Височина"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Цифри за височина"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "Мер. ед. за височина"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Дължина"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Цифри за дължина"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "Мер. ед. за дължина"
+
+#, fuzzy
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Обем"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Тегло"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Цифри за тегло"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "Мер. ед. за тегло"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Ширина"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Цифри за ширина"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "Мер. ед, за ширина"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Мерки"
diff --git a/modules/product_measurements/locale/ca.po b/modules/product_measurements/locale/ca.po
new file mode 100644
index 0000000000..7f350be3f6
--- /dev/null
+++ b/modules/product_measurements/locale/ca.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Decimals de l'altura"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "UdM de l'altura"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Longitud"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Decimals de la longitud"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "UdM de la longitud"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Volum"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Decimals del volum"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "UdM del volum"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Pes"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Decimals del pes"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "UdM del pes"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Amplada"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Decimals de l'amplada"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "UdM de l'amplada"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Decimals de l'altura"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "UdM de l'altura"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Longitud"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Decimals de la longitud"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "UdM de la longitud"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Volum"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Decimals del volum"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "UdM del volum"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Pes"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Decimals del pes"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "UdM del pes"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Amplada"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Decimals de l'amplada"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "UdM de l'amplada"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Mesures"
diff --git a/modules/product_measurements/locale/cs.po b/modules/product_measurements/locale/cs.po
new file mode 100644
index 0000000000..90a1ffa3ec
--- /dev/null
+++ b/modules/product_measurements/locale/cs.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/product_measurements/locale/de.po b/modules/product_measurements/locale/de.po
new file mode 100644
index 0000000000..a666d634cf
--- /dev/null
+++ b/modules/product_measurements/locale/de.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Höhe"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Nachkommastellen Höhe"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "Höhe Maßeinheit"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Länge"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Nachkommastellen Länge"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "Länge Maßeinheit"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Volumen"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Nachkommastellen Volumen"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "Volumeneinheit"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Gewicht"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Nachkommastellen Gewicht"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "Gewicht Maßeinheit"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Breite"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Nachkommastellen Breite"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "Breite Maßeinheit"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Höhe"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Nachkommastellen Höhe"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "Höhe Maßeinheit"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Länge"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Nachkommastellen Länge"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "Länge Maßeinheit"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Volumen"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Nachkommastellen Volumen"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "Volumeneinheit"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Gewicht"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Nachkommastellen Gewicht"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "Gewicht Maßeinheit"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Breite"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Nachkommastellen Breite"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "Breite Maßeinheit"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Abmessungen"
diff --git a/modules/product_measurements/locale/es.po b/modules/product_measurements/locale/es.po
new file mode 100644
index 0000000000..3dc5c3f9ae
--- /dev/null
+++ b/modules/product_measurements/locale/es.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Decimales de la altura"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "UdM de la altura"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Longitud"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Decimales de la longitud"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "UdM de la longitud"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Volumen"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Decimales del volumen"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "UdM del volumen"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Peso"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Decimales del peso"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "UdM del peso"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Ancho"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Decimales del ancho"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "UdM del ancho"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Decimales de la altura"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "UdM de la altura"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Longitud"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Decimales de la longitud"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "UdM de la longitud"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Volumen"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Decimales del volumen"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "UdM del volumen"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Peso"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Decimales del peso"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "UdM del peso"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Ancho"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Decimales del ancho"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "UdM del ancho"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Medidas"
diff --git a/modules/product_measurements/locale/es_419.po b/modules/product_measurements/locale/es_419.po
new file mode 100644
index 0000000000..90a1ffa3ec
--- /dev/null
+++ b/modules/product_measurements/locale/es_419.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/product_measurements/locale/et.po b/modules/product_measurements/locale/et.po
new file mode 100644
index 0000000000..685c1cabed
--- /dev/null
+++ b/modules/product_measurements/locale/et.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Kõrgus"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Kõrguse numbriväärtus"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "Kõrguse mõõtühik"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Pikkus"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Pikkuse numbriväärtus"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "Pikkuse mõõtühik"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Maht"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Mahu numbriväärtus"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "Mahu mõõtühik"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Kaal"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Kaalu numbriväärtus"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "Kaalu mõõtühik"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Laius"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Laiuse numbriväärtus"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "Laiuse mõõtühik"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Kõrgus"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Kõrguse numbriväärtus"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "Kõrguse mõõtühik"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Pikkus"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Pikkuse numbriväärtus"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "Pikkuse mõõtühik"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Maht"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Mahu numbriväärtus"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "Mahu mõõtühik"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Kaal"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Kaalu numbriväärtus"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "Kaalu mõõtühik"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Laius"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Laiuse numbriväärtus"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "Laiuse mõõtühik"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Mõõdud"
diff --git a/modules/product_measurements/locale/fa.po b/modules/product_measurements/locale/fa.po
new file mode 100644
index 0000000000..68464dfc14
--- /dev/null
+++ b/modules/product_measurements/locale/fa.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "ارتفاع"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "ارقام ارتفاع"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "واحد اندازی گیری ارتفاع"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "طول"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "ارقام طول"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "واحد اندازی گیری طول"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "حجم"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "ارقام حجم"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "واحد اندازی گیری حجم"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "وزن"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "ارقام وزن"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "واحد اندازی گیری وزن"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "عرض"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "ارقام عرض"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "واحد اندازه گیری عرض"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "ارتفاع"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "ارقام ارتفاع"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "واحد اندازی گیری ارتفاع"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "طول"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "ارقام طول"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "واحد اندازی گیری طول"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "حجم"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "ارقام حجم"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "واحد اندازی گیری حجم"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "وزن"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "ارقام وزن"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "واحد اندازی گیری وزن"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "عرض"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "ارقام عرض"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "واحد اندازه گیری عرض"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "اندازه گیری ها"
diff --git a/modules/product_measurements/locale/fi.po b/modules/product_measurements/locale/fi.po
new file mode 100644
index 0000000000..90a1ffa3ec
--- /dev/null
+++ b/modules/product_measurements/locale/fi.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/product_measurements/locale/fr.po b/modules/product_measurements/locale/fr.po
new file mode 100644
index 0000000000..e35d8a96c3
--- /dev/null
+++ b/modules/product_measurements/locale/fr.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Hauteur"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Décimales de la hauteur"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "UDM de hauteur"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Longueur"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Décimales de la longueur"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "UDM de longueur"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Décimales du volume"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "UDM de volume"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Poids"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Décimales du poids"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "UDM de poids"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Largeur"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Décimales de la largeur"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "UDM de largeur"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Hauteur"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Décimales de la hauteur"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "UDM de hauteur"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Longueur"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Décimales de la longueur"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "UDM de longueur"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Décimales du volume"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "UDM du volume"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Poids"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Décimales du poids"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "UDM de poids"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Largeur"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Décimales de la largeur"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "UDM de largeur"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Mesures"
diff --git a/modules/product_measurements/locale/hu.po b/modules/product_measurements/locale/hu.po
new file mode 100644
index 0000000000..ae46f49dad
--- /dev/null
+++ b/modules/product_measurements/locale/hu.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Magasság"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Magasság tizedesjegyei"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "Magasság mértékegysége"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Hossz"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Hossz tizedesjegyei"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "Hossz mértékegysége"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Térfogat"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Térfogat tizedesjegyei"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "Térfogat mértékegysége"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Súly"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Súly tizedesjegyei"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "Súly mértékegysége"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Szélesség"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Szélesség tizedesjegyei"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "Szélesség mértékegysége"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Magasság"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Magasság tizedesjegyei"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "Magasság mértékegysége"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Hossz"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Hossz tizedesjegyei"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "Hossz mértékegysége"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Térfogat"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Térfogat tizedesjegyei"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "Térfogat mértékegysége"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Súly"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Súly tizedesjegyei"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "Súly mértékegysége"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Szélesség"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Szélesség tizedesjegyei"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "Szélesség mértékegysége"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Méretek és súly"
diff --git a/modules/product_measurements/locale/id.po b/modules/product_measurements/locale/id.po
new file mode 100644
index 0000000000..90a1ffa3ec
--- /dev/null
+++ b/modules/product_measurements/locale/id.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/product_measurements/locale/it.po b/modules/product_measurements/locale/it.po
new file mode 100644
index 0000000000..4cec580fa4
--- /dev/null
+++ b/modules/product_measurements/locale/it.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Altezza"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Cifre Altezza"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "UdM Altezza"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Lunghezza"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Cifre Lunghezza"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "UdM Lunghezza"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Cifre Volume"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "UdM Volume"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Peso"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Cifre Peso"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "UdM Peso"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Larghezza"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Cifre Larghezza"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "UdM Larghezza"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Altezza"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Cifre Altezza"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "UdM Altezza"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Lunghezza"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Cifre lunghezza"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "UdM Lunghezza"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Cifre Volume"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "UdM Volume"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Peso"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Cifre Peso"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "UdM Peso"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Larghezza"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Cifre larghezza"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "UdM Larghezza"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Misure"
diff --git a/modules/product_measurements/locale/lo.po b/modules/product_measurements/locale/lo.po
new file mode 100644
index 0000000000..8aa3f20060
--- /dev/null
+++ b/modules/product_measurements/locale/lo.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "ຄວາມສູງ"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "ເສດສ່ວນຄວາມສູງ"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "ຫົວໜ່ວຍຄວາມສູງ"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "ຄວາມຍາວ"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "ເສດສ່ວນຄວາມຍາວ"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "ຫົວໜ່ວຍຄວາມຍາວ"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "ບໍລິມາດ"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "ເສດສ່ວນບໍລິມາດ"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "ຫົວໜ່ວຍບໍລິມາດ"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "ນໍ້າໜັກ"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "ເສດສ່ວນນໍ້າໜັກ"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "ຫົວໜ່ວຍນໍ້າໜັກ"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "ຄວາມກວ້າງ"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "ເສດສ່ວນຄວາມກວ້າງ"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "ຫົວໜ່ວຍຄວາມກວ້າງ"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "ຄວາມສູງ"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "ເສດສ່ວນຄວາມສູງ"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "ຫົວໜ່ວຍຄວາມສູງ"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "ຄວາມຍາວ"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "ເສດສ່ວນຄວາມຍາວ"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "ຫົວໜ່ວຍຄວາມຍາວ"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "ບໍລິມາດ"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "ເສດສ່ວນບໍລິມາດ"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "ຫົວໜ່ວຍບໍລິມາດ"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "ນໍ້າໜັກ"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "ເສດສ່ວນນໍ້າໜັກ"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "ຫົວໜ່ວຍນໍ້າໜັກ"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "ຄວາມກວ້າງ"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "ເສດສ່ວນຄວາມກວ້າງ"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "ຫົວໜ່ວຍຄວາມກວ້າງ"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "ການວັດແທກ"
diff --git a/modules/product_measurements/locale/lt.po b/modules/product_measurements/locale/lt.po
new file mode 100644
index 0000000000..90a1ffa3ec
--- /dev/null
+++ b/modules/product_measurements/locale/lt.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/product_measurements/locale/nl.po b/modules/product_measurements/locale/nl.po
new file mode 100644
index 0000000000..c4adbdf71d
--- /dev/null
+++ b/modules/product_measurements/locale/nl.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Hoogte"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Hoogte decimalen"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "hoogte maateenheid"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Lengte"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "lengte decimalen"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "Lengte maateenheid"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Volume decimalen"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "Volume maateenhied"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Gewicht"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "decimalen gewicht"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "maateenheid gewicht"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Breedte"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "decimalen breedte"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "maateenheid breedte"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Hoogte"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "decimalen hoogte"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "maateenheid hoogte"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Lengte"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "lengte decimalen"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "lengte maateenheid"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "volume decimalen"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "volume maateenheid"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Gewicht"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "gewicht decimalen"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "gewicht maateenheid"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Breedte"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "decimalen breedte"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "maateenheid breedte"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "afmetingen"
diff --git a/modules/product_measurements/locale/pl.po b/modules/product_measurements/locale/pl.po
new file mode 100644
index 0000000000..124bae3b2a
--- /dev/null
+++ b/modules/product_measurements/locale/pl.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Wysokość"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Cyfry wysokości"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "Jm wysokości"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Długość"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Cyfry długości"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "Jm długości"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Objętość"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Cyfry objętości"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "Jm objętości"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Waga"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Cyfry wagi"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "Jm wagi"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Szerokość"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Cyfry szerokości"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "Jm szerokości"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Wysokość"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Cyfry wysokości"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "Wysokość jm"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Długość"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Cyfry długości"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "Jm długości"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Objętość"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Cyfry objętości"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "Jm objętości"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Waga"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Cyfry wagi"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "Jm wagi"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Szerokość"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Cyfry szerokości"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "Jm szerokości"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Miary"
diff --git a/modules/product_measurements/locale/pt.po b/modules/product_measurements/locale/pt.po
new file mode 100644
index 0000000000..a20673651d
--- /dev/null
+++ b/modules/product_measurements/locale/pt.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Dígitos Decimais da Altura"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "UDM da Altura"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Comprimento"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Dígitos Decimais do Comprimento"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "UDM do Comprimento"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Dígitos Decimais do Volume"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "UDM do Volume"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Peso"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Dígitos Decimais do Peso"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "UDM do Peso"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Largura"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Dígitos Decimais da Largura"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "UDM da Largura"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Dígitos decimais da altura"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "UDM da altura"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Comprimento"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Dígitos decimais do comprimento"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "UDM do comprimento"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Volume"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Dígitos decimais do volume"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "UDM do volume"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Peso"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Dígitos decimais do peso"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "UDM do peso"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Largura"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Dígitos decimais da largura"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "UDM da largura"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Medidas"
diff --git a/modules/product_measurements/locale/ro.po b/modules/product_measurements/locale/ro.po
new file mode 100644
index 0000000000..df122c7ae2
--- /dev/null
+++ b/modules/product_measurements/locale/ro.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Înălţime"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Zecimale înălțime"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "Înălțime UM"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Lungime"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Zecimale lungime"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "Lungime UM"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Volum"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Zecimale Volum"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "Volum UM"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Greutate"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Zecimale Greutate"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "UM Greutate"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Lăţime"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Zecimale lățime"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "UM Latime"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Înălţime"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Zecimale înălțime"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "UM Înălțime"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Lungime"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Zecimale lungime"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "UM Lungime"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Volum"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Zecimale Volum"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "UM Volum"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Greutate"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Zecimale Greutate"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "UM Greutate"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Lăţime"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Zecimale lățime"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "UM Latime"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Măsurători"
diff --git a/modules/product_measurements/locale/ru.po b/modules/product_measurements/locale/ru.po
new file mode 100644
index 0000000000..2c4f26a5c5
--- /dev/null
+++ b/modules/product_measurements/locale/ru.po
@@ -0,0 +1,137 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Ширина"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Длина"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Объем"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Ширина"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Ширина"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Ширина"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Длина"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Объем"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Ширина"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Ширина"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/product_measurements/locale/sl.po b/modules/product_measurements/locale/sl.po
new file mode 100644
index 0000000000..13508b6560
--- /dev/null
+++ b/modules/product_measurements/locale/sl.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Višina"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Decimalke za višino"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "ME za višino"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Dolžina"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Decimalke za dolžino"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "ME za dolžino"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Prostornina"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Decimalke prostornine"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "Enota prostornine"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Teža"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Decimalke za težo"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "ME za težo"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Širina"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Decimalke za širino"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "ME za širino"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Višina"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Decimalke za višino"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "ME za višino"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Dolžina"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Decimalke za dolžino"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "ME za dolžino"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Prostornina"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Decimalke prostornine"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "Enota prostornine"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Teža"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Decimalke za težo"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "ME za težo"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Širina"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Decimalke za širino"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "ME za širino"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Mere"
diff --git a/modules/product_measurements/locale/tr.po b/modules/product_measurements/locale/tr.po
new file mode 100644
index 0000000000..01ec796d5a
--- /dev/null
+++ b/modules/product_measurements/locale/tr.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr "Yükseklik"
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr "Yükseklik Basamak Sayısı"
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr "Yükseklik Ölçü Birimi"
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr "Uzunluk"
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr "Uzunluk Basamak Sayısı"
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr "Uzunluk Ölçü Birimi"
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr "Hacim"
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr "Hacim Basamak Sayısı"
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr "Hacim Ölçü Birimi"
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr "Ağırlık"
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr "Ağırlık Basamak Sayısı"
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr "Ağırlık Ölçü Birimi"
+
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "Genişlik"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr "Genişlik Basamak Sayısı"
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr "Genişlik Ölçü Birimi"
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr "Yükseklik"
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr "Yükseklik Basamak Sayısı"
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr "Yükseklik Ölçü Birimi"
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr "Uzunluk"
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr "Uzunluk Basamak Sayısı"
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr "Uzunluk Ölçü Birimi"
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr "Hacim"
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr "Hacim Basamak Sayısı"
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr "Hacim Ölçü Birimi"
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr "Ağırlık"
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr "Ağırlık Basamak Sayısı"
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr "Ağırlık Ölçü Birimi"
+
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "Genişlik"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr "Genişlik Basamak Sayısı"
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr "Genişlik Ölçü Birimi"
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr "Ölçüler"
diff --git a/modules/product_measurements/locale/zh_CN.po b/modules/product_measurements/locale/zh_CN.po
new file mode 100644
index 0000000000..e62a04ad69
--- /dev/null
+++ b/modules/product_measurements/locale/zh_CN.po
@@ -0,0 +1,129 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.product,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.product,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.product,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.product,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.product,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.product,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.product,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.product,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.product,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.product,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.product,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,width:"
+msgid "Width"
+msgstr "宽"
+
+msgctxt "field:product.product,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.product,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "field:product.template,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:product.template,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:product.template,height_uom:"
+msgid "Height Uom"
+msgstr ""
+
+msgctxt "field:product.template,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:product.template,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:product.template,length_uom:"
+msgid "Length Uom"
+msgstr ""
+
+msgctxt "field:product.template,volume:"
+msgid "Volume"
+msgstr ""
+
+msgctxt "field:product.template,volume_digits:"
+msgid "Volume Digits"
+msgstr ""
+
+msgctxt "field:product.template,volume_uom:"
+msgid "Volume Uom"
+msgstr ""
+
+msgctxt "field:product.template,weight:"
+msgid "Weight"
+msgstr ""
+
+msgctxt "field:product.template,weight_digits:"
+msgid "Weight Digits"
+msgstr ""
+
+msgctxt "field:product.template,weight_uom:"
+msgid "Weight Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,width:"
+msgid "Width"
+msgstr "宽"
+
+msgctxt "field:product.template,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:product.template,width_uom:"
+msgid "Width Uom"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/product_measurements/product.py b/modules/product_measurements/product.py
new file mode 100644
index 0000000000..b904de6694
--- /dev/null
+++ b/modules/product_measurements/product.py
@@ -0,0 +1,173 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import fields
+from trytond.pyson import Eval, Bool, Id
+from trytond.pool import PoolMeta, Pool
+
+NON_MEASURABLE = ['service']
+
+
+class Template(metaclass=PoolMeta):
+ __name__ = 'product.template'
+
+ length = fields.Float('Length',
+ digits=(16, Eval('length_digits', 2)),
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ },
+ depends=['type', 'length_digits'])
+ length_uom = fields.Many2One('product.uom', 'Length Uom',
+ domain=[('category', '=', Id('product', 'uom_cat_length'))],
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ 'required': Bool(Eval('length')),
+ },
+ depends=['type', 'length'])
+ length_digits = fields.Function(fields.Integer('Length Digits'),
+ 'on_change_with_length_digits')
+ height = fields.Float('Height',
+ digits=(16, Eval('height_digits', 2)),
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ },
+ depends=['type', 'height_digits'])
+ height_uom = fields.Many2One('product.uom', 'Height Uom',
+ domain=[('category', '=', Id('product', 'uom_cat_length'))],
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ 'required': Bool(Eval('height')),
+ },
+ depends=['type', 'height'])
+ height_digits = fields.Function(fields.Integer('Height Digits'),
+ 'on_change_with_height_digits')
+ width = fields.Float('Width',
+ digits=(16, Eval('width_digits', 2)),
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ },
+ depends=['type', 'width_digits'])
+ width_uom = fields.Many2One('product.uom', 'Width Uom',
+ domain=[('category', '=', Id('product', 'uom_cat_length'))],
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ 'required': Bool(Eval('width')),
+ },
+ depends=['type', 'width'])
+ width_digits = fields.Function(fields.Integer('Width Digits'),
+ 'on_change_with_width_digits')
+ volume = fields.Float('Volume',
+ digits=(16, Eval('volume_digits', 2)),
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ 'readonly': (Bool(Eval('length'))
+ & Bool(Eval('height')) & Bool(Eval('width'))),
+ },
+ depends=['type', 'volume_digits'])
+ volume_uom = fields.Many2One('product.uom', 'Volume Uom',
+ domain=[('category', '=', Id('product', 'uom_cat_volume'))],
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ 'required': Bool(Eval('volume')),
+ },
+ depends=['type', 'volume'])
+ volume_digits = fields.Function(fields.Integer('Volume Digits'),
+ 'on_change_with_volume_digits')
+ weight = fields.Float('Weight',
+ digits=(16, Eval('weight_digits', 2)),
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ },
+ depends=['type', 'weight_digits'])
+ weight_uom = fields.Many2One('product.uom', 'Weight Uom',
+ domain=[('category', '=', Id('product', 'uom_cat_weight'))],
+ states={
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ 'required': Bool(Eval('weight')),
+ },
+ depends=['type', 'weight'])
+ weight_digits = fields.Function(fields.Integer('Weight Digits'),
+ 'on_change_with_weight_digits')
+
+ @fields.depends('length_uom')
+ def on_change_with_length_digits(self, name=None):
+ return (self.length_uom.digits if self.length_uom
+ else self.default_length_digits())
+
+ @staticmethod
+ def default_length_digits():
+ return 2
+
+ @fields.depends('height_uom')
+ def on_change_with_height_digits(self, name=None):
+ return (self.height_uom.digits if self.height_uom
+ else self.default_height_digits())
+
+ @staticmethod
+ def default_height_digits():
+ return 2
+
+ @fields.depends('width_uom')
+ def on_change_with_width_digits(self, name=None):
+ return (self.width_uom.digits if self.width_uom
+ else self.default_width_digits())
+
+ @staticmethod
+ def default_width_digits():
+ return 2
+
+ @fields.depends('volume', 'volume_uom',
+ 'length', 'length_uom',
+ 'height', 'height_uom',
+ 'width', 'width_uom')
+ def on_change_with_volume(self):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ Uom = pool.get('product.uom')
+
+ if not all([self.volume_uom, self.length, self.length_uom,
+ self.height, self.height_uom, self.width, self.width_uom]):
+ if all([self.length, self.height, self.width]):
+ return
+ return self.volume
+
+ meter = Uom(ModelData.get_id('product', 'uom_meter'))
+ cubic_meter = Uom(ModelData.get_id('product', 'uom_cubic_meter'))
+
+ length = Uom.compute_qty(
+ self.length_uom, self.length, meter, round=False)
+ height = Uom.compute_qty(
+ self.height_uom, self.height, meter, round=False)
+ width = Uom.compute_qty(
+ self.width_uom, self.width, meter, round=False)
+
+ return Uom.compute_qty(
+ cubic_meter, length * height * width, self.volume_uom)
+
+ @fields.depends('volume_uom')
+ def on_change_with_volume_digits(self, name=None):
+ return (self.volume_uom.digits if self.volume_uom
+ else self.default_volume_digits())
+
+ @staticmethod
+ def default_volume_digits():
+ return 2
+
+ @fields.depends('weight_uom')
+ def on_change_with_weight_digits(self, name=None):
+ return (self.weight_uom.digits if self.weight_uom
+ else self.default_weight_digits())
+
+ @staticmethod
+ def default_weight_digits():
+ return 2
+
+ @classmethod
+ def view_attributes(cls):
+ return super(Template, cls).view_attributes() + [
+ ('//page[@id="measurements"]', 'states', {
+ 'invisible': Eval('type').in_(NON_MEASURABLE),
+ })]
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
diff --git a/modules/product_measurements/product.xml b/modules/product_measurements/product.xml
new file mode 100644
index 0000000000..c1be0f025d
--- /dev/null
+++ b/modules/product_measurements/product.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ product.template
+
+ template_form
+
+
+
+
diff --git a/modules/product_measurements/setup.py b/modules/product_measurements/setup.py
new file mode 100755
index 0000000000..620ee3c7de
--- /dev/null
+++ b/modules/product_measurements/setup.py
@@ -0,0 +1,148 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_product_measurements'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = []
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module to add measurements to product',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/product_measurements',
+ },
+ keywords='tryton product measurement',
+ package_dir={'trytond.modules.product_measurements': '.'},
+ packages=(
+ ['trytond.modules.product_measurements']
+ + ['trytond.modules.product_measurements.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.product_measurements': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ product_measurements = trytond.modules.product_measurements
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ )
diff --git a/modules/product_measurements/tests/__init__.py b/modules/product_measurements/tests/__init__.py
new file mode 100644
index 0000000000..c4a5c37147
--- /dev/null
+++ b/modules/product_measurements/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.product_measurements.tests.test_product_measurements import suite # noqa: E501
+except ImportError:
+ from .test_product_measurements import suite
+
+__all__ = ['suite']
diff --git a/modules/product_measurements/tests/test_product_measurements.py b/modules/product_measurements/tests/test_product_measurements.py
new file mode 100644
index 0000000000..02b898fea1
--- /dev/null
+++ b/modules/product_measurements/tests/test_product_measurements.py
@@ -0,0 +1,17 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import unittest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import ModuleTestCase
+
+
+class ProductMeasurementsTestCase(ModuleTestCase):
+ 'Test ProductMeasurements module'
+ module = 'product_measurements'
+
+
+def suite():
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductMeasurementsTestCase))
+ return suite
diff --git a/modules/product_measurements/tox.ini b/modules/product_measurements/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/product_measurements/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/product_measurements/tryton.cfg b/modules/product_measurements/tryton.cfg
new file mode 100644
index 0000000000..6a901a83e9
--- /dev/null
+++ b/modules/product_measurements/tryton.cfg
@@ -0,0 +1,8 @@
+[tryton]
+version=6.0.1
+depends:
+ ir
+ product
+ res
+xml:
+ product.xml
diff --git a/modules/product_measurements/view/template_form.xml b/modules/product_measurements/view/template_form.xml
new file mode 100644
index 0000000000..f4b0cf1e93
--- /dev/null
+++ b/modules/product_measurements/view/template_form.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product_price_list/.drone.yml b/modules/product_price_list/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/product_price_list/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/product_price_list/.flake8 b/modules/product_price_list/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/product_price_list/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/product_price_list/CHANGELOG b/modules/product_price_list/CHANGELOG
new file mode 100644
index 0000000000..b02504f34c
--- /dev/null
+++ b/modules/product_price_list/CHANGELOG
@@ -0,0 +1,84 @@
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+* Allow using the product list price in the price list formula
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+* Allow using the product cost price in the price list formula
+* Add unit per price list
+* Make price list deactivable
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Pass pattern to get_context_formula
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+* Match also with parent categories
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+* Add category as matching criteria
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+
+Version 4.0.0 - 2016-05-02
+* Bug fixes (see mercurial logs for details)
+* Add Python3 support
+
+Version 3.8.0 - 2015-11-02
+* Bug fixes (see mercurial logs for details)
+
+Version 3.6.0 - 2015-04-20
+* Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+* Add tax included option
+* Replace safe_eval by simpleeval
+
+Version 3.4.0 - 2014-10-20
+* Bug fixes (see mercurial logs for details)
+
+Version 3.2.0 - 2014-04-21
+* Bug fixes (see mercurial logs for details)
+
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+
+Version 2.8.0 - 2013-04-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.6.0 - 2012-10-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.4.0 - 2012-04-24
+* Bug fixes (see mercurial logs for details)
+
+Version 2.2.0 - 2011-10-24
+* Bug fixes (see mercurial logs for details)
+
+Version 2.0.0 - 2011-04-27
+* Bug fixes (see mercurial logs for details)
+
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
+Version 1.6.0 - 2010-05-11
+* Bug fixes (see mercurial logs for details)
+
+Version 1.4.0 - 2009-10-19
+* Initial release
diff --git a/modules/product_price_list/COPYRIGHT b/modules/product_price_list/COPYRIGHT
new file mode 100644
index 0000000000..3d6ed92696
--- /dev/null
+++ b/modules/product_price_list/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2009-2021 Cédric Krier.
+Copyright (C) 2009-2013 Bertrand Chenal.
+Copyright (C) 2009-2021 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/product_price_list/LICENSE b/modules/product_price_list/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/product_price_list/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/product_price_list/MANIFEST.in b/modules/product_price_list/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/product_price_list/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/product_price_list/README.rst b/modules/product_price_list/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/product_price_list/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/product_price_list/__init__.py b/modules/product_price_list/__init__.py
new file mode 100644
index 0000000000..d95d11769e
--- /dev/null
+++ b/modules/product_price_list/__init__.py
@@ -0,0 +1,11 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import Pool
+from . import price_list
+
+
+def register():
+ Pool.register(
+ price_list.PriceList,
+ price_list.PriceListLine,
+ module='product_price_list', type_='model')
diff --git a/modules/product_price_list/doc/index.rst b/modules/product_price_list/doc/index.rst
new file mode 100644
index 0000000000..4c47ced342
--- /dev/null
+++ b/modules/product_price_list/doc/index.rst
@@ -0,0 +1,5 @@
+Product Price List Module
+#########################
+
+The product price list module provides formula to compute prices per product or
+category.
diff --git a/modules/product_price_list/exceptions.py b/modules/product_price_list/exceptions.py
new file mode 100644
index 0000000000..801fcd7bf7
--- /dev/null
+++ b/modules/product_price_list/exceptions.py
@@ -0,0 +1,8 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.model.exceptions import ValidationError
+
+
+class FormulaError(ValidationError):
+ pass
diff --git a/modules/product_price_list/locale/bg.po b/modules/product_price_list/locale/bg.po
new file mode 100644
index 0000000000..cb8ac6f256
--- /dev/null
+++ b/modules/product_price_list/locale/bg.po
@@ -0,0 +1,125 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr ""
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Формула"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Ценова листа"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Израз на python който ще се изпълни с:\n"
+"- unit_price: оригиналната единична цена"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Ценова листа"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Ред от ценова листа"
+
+#, fuzzy
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Продукт"
diff --git a/modules/product_price_list/locale/ca.po b/modules/product_price_list/locale/ca.po
new file mode 100644
index 0000000000..4b168b545d
--- /dev/null
+++ b/modules/product_price_list/locale/ca.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Impost inclòs"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Fórmula"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Tarifa"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+"Fes que la tarifa pertanyi a l'empresa.\n"
+"Defineix la moneda de la tarifa."
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr "Afegiu formules de preu per diferents criteris."
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "El identificador principal de la tarifa."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "Marca si el resultat de la formula inclou impostos."
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr "La unitat amb la que s'expresa la quantitat."
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr "Aplica només als productes d'aquesta categoria."
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Expressió Python que s'avaluarà amb:\n"
+"- unit_price: El preu unitari original\n"
+"- cost_price: El preu de cost del producte\n"
+"- list_price: El preu de venda del producte"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr "La tarifa a la qual pertany la línia."
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "Aplica només a aquest producte."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "Aplica només quan la quantitat es més gran."
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Tarifes"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"La fórmula \"%(formula)s\" a la línia de tarifa \"%(line)s\" no és correcta "
+"generant l'excepció \"%(exception)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Tarifes"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Tarifa"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Línia de tarifa"
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Defecte del producte"
diff --git a/modules/product_price_list/locale/cs.po b/modules/product_price_list/locale/cs.po
new file mode 100644
index 0000000000..10ba23314d
--- /dev/null
+++ b/modules/product_price_list/locale/cs.po
@@ -0,0 +1,122 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr ""
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr ""
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr ""
diff --git a/modules/product_price_list/locale/de.po b/modules/product_price_list/locale/de.po
new file mode 100644
index 0000000000..d0e63d3b84
--- /dev/null
+++ b/modules/product_price_list/locale/de.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Steuer Inklusive"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr "Maßeinheit"
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Formel"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Preisliste"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+"Die Preisliste dem Unternehmen zuordnen.\n"
+"Dies definiert die Währung der Preisliste."
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr "Preisformeln für verschiedene Kriterien hinzufügen."
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "Das Hauptidentifizierungsmerkmal der Preisliste."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "Aktivieren wenn das Ergebnis der Formel die Steuern beinhaltet."
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr "Die Maßeinheit in der die Menge angegeben ist."
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr "Nur auf Artikel dieser Kategorie anwenden."
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Ein Pythonausdruck, der ausgewertet wird mit:\n"
+"- unit_price: Originaler Einzelpreis des Artikels\n"
+"- cost_price: Der Einstandspreis des Artikels\n"
+"- list_price: Der Listenpreis des Artikels"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr "Die Preisliste zu der die Position zugeordnet ist."
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "Nur auf diesen Artikel anwenden."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "Nur anwenden, wenn die Menge größer ist."
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Preislisten"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"Ungültige Formel \"%(formula)s\" in Preislistenposition \"%(line)s\" mit "
+"Fehlermeldung \"%(exception)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Preislisten"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Preisliste"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Preislistenposition"
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Artikel Standard"
diff --git a/modules/product_price_list/locale/es.po b/modules/product_price_list/locale/es.po
new file mode 100644
index 0000000000..f2d6d0a398
--- /dev/null
+++ b/modules/product_price_list/locale/es.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Impuestos incluidos"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Fórmula"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Tarifa"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+"Hacer que la tarifa pertenezca a la empresa.\n"
+"Define la moneda de la tarifa."
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr "Añadir formulas de precio por distintos criterios."
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "El identificador principal de la tarifa."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "Marcar si el resultado de la formula incluye impuestos."
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr "La unidad con la que se expresa la cantidad."
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr "Aplicar sólo a los productos de esta categoría."
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Expresión de Python que se evaluará como:\n"
+"- unit_price: El precio unitario original\n"
+"- cost_price: El precio de coste del producto\n"
+"- list_price: El precio de venta del producto"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr "La tarifa a la que pertenece la línea."
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "Aplicar sólo a este producto."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "Aplicar sólo cuando la cantidad es mas grande."
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Tarifas"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"La fórmula \"%(formula)s\" en la línea de tarifa \"%(line)s\" no es correcta"
+" generando la excepción \"%(exception)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Tarifas"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Tarifa"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Línea de tarifa"
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Por defecto del producto"
diff --git a/modules/product_price_list/locale/es_419.po b/modules/product_price_list/locale/es_419.po
new file mode 100644
index 0000000000..678b01470e
--- /dev/null
+++ b/modules/product_price_list/locale/es_419.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Impuesto incluido"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr ""
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Lista de precios"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Expresión de Python que se evaluará con:\n"
+"- unit_price: el precio unitario original"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Lista de precios"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"La fórmula \"%(formula)s\" en la línea de lista de precios \"%(line)s\" con "
+"excepción \"%(exception)s\" no es válida."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Lista de precios"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Lista de precios"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Línea de lista de precios"
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr ""
diff --git a/modules/product_price_list/locale/et.po b/modules/product_price_list/locale/et.po
new file mode 100644
index 0000000000..c93487c016
--- /dev/null
+++ b/modules/product_price_list/locale/et.po
@@ -0,0 +1,121 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Read"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Nimetus"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Sisaldab maksu"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Kategooria"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Valem"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Hinnakiri"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "Märgista kui tulemuse valem sisaldab makse"
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "Rakenda ainult sellele tootele."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "Rakenda ainult siis, kui kogus on suurem."
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Hinnakirjad"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Hinnakirjad"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Hinnakiri"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Hinnakirja rida"
+
+#, fuzzy
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Toode"
diff --git a/modules/product_price_list/locale/fa.po b/modules/product_price_list/locale/fa.po
new file mode 100644
index 0000000000..a303f4a5df
--- /dev/null
+++ b/modules/product_price_list/locale/fa.po
@@ -0,0 +1,125 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "خطوط"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "مشمول مالیات"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "دستهبندی"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "فرمول"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "لیست قیمت"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+"ساختن لیست قیمت متعلق به شرکت.\n"
+"این ارز از لیست قیمت تعریف می کند."
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr "فرمول قیمت را برای معیارهای مختلف اضافه کنید."
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "شناسه اصلی لیست قیمت."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "اگر نتایج فرمول شامل مالیات ها باشد، کادر را تیک بزنید."
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr "فقط به محصولات این دسته اعمال می شود."
+
+#, fuzzy
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"عبارت پایتون که با آن ارزیابی می شود:\n"
+"- واحد_قیمت: واحد_قیمت اصلی"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr "لیست قیمت که خط متعلق به آن میباشد."
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "فقط به این محصول اعمال می شود."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "هنگامی که مقدار بزرگتر است فقط اعمال می شود."
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "لیست های قیمت"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr "فرمول: \"%s\" در سطر لیست قیمت: \"%s\" با استثنا: \"%s\" نامعتبر میباشد."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "لیست های قیمت"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "لیست قیمت"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "خط لیست قیمت"
+
+#, fuzzy
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "محصول"
diff --git a/modules/product_price_list/locale/fi.po b/modules/product_price_list/locale/fi.po
new file mode 100644
index 0000000000..ec5d104994
--- /dev/null
+++ b/modules/product_price_list/locale/fi.po
@@ -0,0 +1,121 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr ""
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr ""
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr ""
diff --git a/modules/product_price_list/locale/fr.po b/modules/product_price_list/locale/fr.po
new file mode 100644
index 0000000000..3289fb92b5
--- /dev/null
+++ b/modules/product_price_list/locale/fr.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Taxe incluse"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Formule"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Liste de prix"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+"Faire appartenir la liste de prix à la société.\n"
+"Ça définit la devise de la liste de prix."
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr "Ajouter des formules de prix pour différents critères."
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "L'identifiant principal de la liste de prix."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "Cocher si le résultat de la formule est taxes incluses."
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr "L'unité dans laquelle la quantité est exprimée."
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr "S'applique seulement aux produits de cette catégorie."
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Une expression Python qui sera évaluée avec :\n"
+"— unit_price : le prix unitaire original\n"
+"— cost_price : le prix de revient du produit\n"
+"— list_price : le prix listé du produit"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr "La liste de prix à qui la ligne appartient."
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "S'applique seulement à ce produit."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "S'applique seulement quand la quantité est plus grande."
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Listes de prix"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"Formule invalide « %(formula)s » sur la ligne de la liste de prix "
+"« %(line)s » avec l'exception « %(exception)s »."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Listes de prix"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Liste de prix"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Ligne de liste de prix"
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Produit par défaut"
diff --git a/modules/product_price_list/locale/hu.po b/modules/product_price_list/locale/hu.po
new file mode 100644
index 0000000000..7b156ac33d
--- /dev/null
+++ b/modules/product_price_list/locale/hu.po
@@ -0,0 +1,128 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Sorok"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Az ár adót tartalmaz"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr "Mértékegység"
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Kategória"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Képlet"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Árlista"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+"Az árszámításhoz használt képleteket adhatja itt meg, különböző "
+"feltételekkel."
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "Az árlista megnevezése."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "Jelölje be, ha az árba bele van számítva az adó."
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr "A mértékegység, amiben a mennyiség ki van fejezve."
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr "Csak ezen kategóriába tartozó termékekre érvényes."
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Egy Python programozási nyelven megadott kifejezés, amiben a következő változók szerepelhetnek:\n"
+"- unit_price: az eredeti egységár\n"
+"- cost_price: a termék költségára\n"
+"- list_price: a termék listaára"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "Csak erre a termékre érvényes."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "Csak ettől a mennyiségtől kezdve érvényes."
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Árlisták"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"Érvénytelen \"%(formula)s\" űrlap a \"%(line)s\" árlista sorban "
+"\"%(exception)s\" hibajelentéssel."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Árlisták"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Árlista"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Árlista sor"
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "a termék alapértelmezett ME-e"
diff --git a/modules/product_price_list/locale/id.po b/modules/product_price_list/locale/id.po
new file mode 100644
index 0000000000..6f7f34cc15
--- /dev/null
+++ b/modules/product_price_list/locale/id.po
@@ -0,0 +1,120 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Baris"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr ""
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr ""
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr ""
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr ""
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr ""
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr ""
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Produk Default"
diff --git a/modules/product_price_list/locale/it.po b/modules/product_price_list/locale/it.po
new file mode 100644
index 0000000000..b6840f22b9
--- /dev/null
+++ b/modules/product_price_list/locale/it.po
@@ -0,0 +1,123 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Righe"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr ""
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Prodotto"
diff --git a/modules/product_price_list/locale/lo.po b/modules/product_price_list/locale/lo.po
new file mode 100644
index 0000000000..9bcc3c05b2
--- /dev/null
+++ b/modules/product_price_list/locale/lo.po
@@ -0,0 +1,129 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "ຮ່ວງ"
+
+#, fuzzy
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr ""
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "ລາຍການລາຄາ"
+
+#, fuzzy
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "ລາຍການລາຄາ"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "ລາຍການລາຄາ"
+
+#, fuzzy
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "ລາຍການລາຄາ"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "ຜະລິດຕະພັນ"
diff --git a/modules/product_price_list/locale/lt.po b/modules/product_price_list/locale/lt.po
new file mode 100644
index 0000000000..b305413b5e
--- /dev/null
+++ b/modules/product_price_list/locale/lt.po
@@ -0,0 +1,122 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr ""
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr ""
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr ""
diff --git a/modules/product_price_list/locale/nl.po b/modules/product_price_list/locale/nl.po
new file mode 100644
index 0000000000..26feb0f98d
--- /dev/null
+++ b/modules/product_price_list/locale/nl.po
@@ -0,0 +1,128 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Regels"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Inclusief belasting"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Formule"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Prijslijst"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+"Koppel de prijslijst aan het bedrijf.\n"
+"Dit definieert de munteenheid van de prijslijst."
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr "Voeg prijsformules toe voor verschillende criteria."
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "De hoofdidentificatie van de prijslijst."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "Vink aan als het resultaat van de formule inclusief belastingen is."
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr "De eenheid waarin de hoeveelheid wordt uitgedrukt."
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr "Alleen van toepassing op producten van deze categorie."
+
+#, fuzzy
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Python-expressie die wordt geëvalueerd met:\n"
+"- unit_price: de oorspronkelijke eenheidsprijs\n"
+"- cost_price: de kostprijs van het product"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr "De prijslijst waartoe de lijn behoort."
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "Alleen van toepassing op dit product."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "Alleen toepassen wanneer de hoeveelheid groter is."
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Prijslijst"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"Ongeldige formule \"%(formula)s\" in prijslijstlijn \"%(line)s\" met "
+"uitzondering \"%(exception)s\"."
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Prijslijst"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Prijslijst"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Prijslijst regel"
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Product standaard"
diff --git a/modules/product_price_list/locale/pl.po b/modules/product_price_list/locale/pl.po
new file mode 100644
index 0000000000..e98b1cffaa
--- /dev/null
+++ b/modules/product_price_list/locale/pl.po
@@ -0,0 +1,123 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Wiersze"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Z podatkiem"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr "Jednostka"
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Kategoria"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Formuła"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Cennik"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "Główny identyfikator cennika."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr "Błąd \"%(exception)s\" w formule \"%(formula)s\" w wierszu \"%(line)s\" cennika."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Cennik"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Wiersz cennika"
+
+#, fuzzy
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Produkt"
diff --git a/modules/product_price_list/locale/pt.po b/modules/product_price_list/locale/pt.po
new file mode 100644
index 0000000000..34315653d7
--- /dev/null
+++ b/modules/product_price_list/locale/pt.po
@@ -0,0 +1,130 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Linhas"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Tributos Incluídos"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Fórmula"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Lista de Preços"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+"Faça com que o preço de tabela pertença à empresa.\n"
+"Isto define a moeda do preço de tabela."
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr "Adiciona fórmulas de preço para diversos critérios."
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "O identificador principal do preço de tabela."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "Marque se o resultado da fórmula incluir tributos."
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr "Aplicar apenas a produtos desta categoria."
+
+#, fuzzy
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Expressão Python que será avaliada com:\n"
+"- unit_price: o preço unitário original"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr "O preço de tabela ao qual esta linha pertence."
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "Aplicar apenas a este produto."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "Aplicar apenas quando a quantidade for maior."
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"A fórmula \"%(formula)s\" na linha \"%(line)s\" da lista de preços com a "
+"exceção \"%(exception)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Lista de Preços"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Linha da Lista de Preços"
+
+#, fuzzy
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Produto"
diff --git a/modules/product_price_list/locale/ro.po b/modules/product_price_list/locale/ro.po
new file mode 100644
index 0000000000..447b7f0acd
--- /dev/null
+++ b/modules/product_price_list/locale/ro.po
@@ -0,0 +1,126 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Rânduri"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Taxă inclusă"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr "Unitate"
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Formulă"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Listă de prețuri"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+"Faceți ca lista de prețuri să aparțină companiei.\n"
+"Acesta definește moneda listei de prețuri."
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr "Adăugați formule de preț pentru diferite criterii."
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "Identificatorul principal al listei de prețuri."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "Verificare dacă rezultatul al formulei include taxe."
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr "Unitatea în care este exprimată cantitatea."
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr "Se aplică numai produselor din această categorie."
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Expresia Python care va fi evaluată cu:\n"
+"- unit_price: preț_unitar original\n"
+"- cost_price: preț de cost al produsului"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr "Lista de prețuri la care aparține rândul."
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "Aplicare numai acestui produs."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "Se aplica numai atunci când cantitatea este mai mare."
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Liste de prețuri"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"Formula nevalidă \"%(formula)s\" din linia listei de prețuri \"%(line)s\" cu"
+" excepția \"%(exception)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Liste de prețuri"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Listă de prețuri"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Rândul al listei de prețuri"
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Implicit pentru produs"
diff --git a/modules/product_price_list/locale/ru.po b/modules/product_price_list/locale/ru.po
new file mode 100644
index 0000000000..0783b06a9c
--- /dev/null
+++ b/modules/product_price_list/locale/ru.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Учет.орг."
+
+#, fuzzy
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Строки"
+
+#, fuzzy
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr ""
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+#, fuzzy
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Товарно материальные ценности (ТМЦ)"
diff --git a/modules/product_price_list/locale/sl.po b/modules/product_price_list/locale/sl.po
new file mode 100644
index 0000000000..8638378dd5
--- /dev/null
+++ b/modules/product_price_list/locale/sl.po
@@ -0,0 +1,128 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr "Postavke"
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr "Davek vključen"
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr "Kategorija"
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr "Formula"
+
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Cenik"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr "Poveži cenik z družbo, ki s tem določa tudi valuto cenika."
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr "Dodaj formule cen za različne kriterije."
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr "Glavni identifikator cenika."
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr "Označite, če formula vključuje davek."
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr "Upoštevaj samo pri izdelkih te kategorije."
+
+#, fuzzy
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+"Pythonski izraz, preračunan z:\n"
+"- unit_price: izvorna cena"
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr "Cenik za postavko."
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr "Upoštevaj samo pri tem izdelku."
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr "Upoštevaj samo, ko je količina večja."
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"Neveljavna formula \"%(formula)s\" v postavki cenika \"%(line)s\" z napako "
+"\"%(exception)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Cenik"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr "Postavka cenika"
+
+#, fuzzy
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr "Izdelek"
diff --git a/modules/product_price_list/locale/tr.po b/modules/product_price_list/locale/tr.po
new file mode 100644
index 0000000000..ec5d104994
--- /dev/null
+++ b/modules/product_price_list/locale/tr.po
@@ -0,0 +1,121 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr ""
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr ""
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr ""
diff --git a/modules/product_price_list/locale/zh_CN.po b/modules/product_price_list/locale/zh_CN.po
new file mode 100644
index 0000000000..1147df1cc1
--- /dev/null
+++ b/modules/product_price_list/locale/zh_CN.po
@@ -0,0 +1,122 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.price_list,lines:"
+msgid "Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list,name:"
+msgid "Name"
+msgstr "纳木"
+
+msgctxt "field:product.price_list,tax_included:"
+msgid "Tax Included"
+msgstr ""
+
+msgctxt "field:product.price_list,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:product.price_list.line,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:product.price_list.line,formula:"
+msgid "Formula"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.price_list.line,price_list:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "field:product.price_list.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.price_list.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "help:product.price_list,company:"
+msgid ""
+"Make the price list belong to the company.\n"
+"It defines the currency of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,lines:"
+msgid "Add price formulas for different criterias."
+msgstr ""
+
+msgctxt "help:product.price_list,name:"
+msgid "The main identifier of the price list."
+msgstr ""
+
+msgctxt "help:product.price_list,tax_included:"
+msgid "Check if result's formula includes taxes."
+msgstr ""
+
+msgctxt "help:product.price_list,unit:"
+msgid "The unit in which the quantity is expressed."
+msgstr ""
+
+msgctxt "help:product.price_list.line,category:"
+msgid "Apply only to products of this category."
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- unit_price: the original unit_price\n"
+"- cost_price: the cost price of the product\n"
+"- list_price: the list price of the product"
+msgstr ""
+
+msgctxt "help:product.price_list.line,price_list:"
+msgid "The price list to which the line belongs."
+msgstr ""
+
+msgctxt "help:product.price_list.line,product:"
+msgid "Apply only to this product."
+msgstr ""
+
+msgctxt "help:product.price_list.line,quantity:"
+msgid "Apply only when quantity is greater."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_form"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+msgctxt "model:ir.message,text:msg_invalid_formula"
+msgid ""
+"Invalid formula \"%(formula)s\" in price list line \"%(line)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_price_list_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_price_list"
+msgid "Price Lists"
+msgstr "Price Lists"
+
+#, fuzzy
+msgctxt "model:product.price_list,name:"
+msgid "Price List"
+msgstr "Price Lists"
+
+msgctxt "model:product.price_list.line,name:"
+msgid "Price List Line"
+msgstr ""
+
+msgctxt "selection:product.price_list,unit:"
+msgid "Product Default"
+msgstr ""
diff --git a/modules/product_price_list/message.xml b/modules/product_price_list/message.xml
new file mode 100644
index 0000000000..96b50861dc
--- /dev/null
+++ b/modules/product_price_list/message.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ Invalid formula "%(formula)s" in price list line "%(line)s" with exception "%(exception)s".
+
+
+
diff --git a/modules/product_price_list/price_list.py b/modules/product_price_list/price_list.py
new file mode 100644
index 0000000000..8f105bd008
--- /dev/null
+++ b/modules/product_price_list/price_list.py
@@ -0,0 +1,171 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from decimal import Decimal
+
+from simpleeval import simple_eval
+
+from trytond.i18n import gettext
+from trytond.model import ModelView, ModelSQL, MatchMixin, fields, \
+ DeactivableMixin, sequence_ordered
+from trytond.tools import decistmt
+from trytond.transaction import Transaction
+from trytond.pool import Pool
+
+from .exceptions import FormulaError
+
+
+class PriceList(DeactivableMixin, ModelSQL, ModelView):
+ 'Price List'
+ __name__ = 'product.price_list'
+
+ name = fields.Char('Name', required=True, translate=True,
+ help="The main identifier of the price list.")
+ company = fields.Many2One(
+ 'company.company', "Company", required=True, select=True,
+ help="Make the price list belong to the company.\n"
+ "It defines the currency of the price list.")
+ tax_included = fields.Boolean('Tax Included',
+ help="Check if result's formula includes taxes.")
+ unit = fields.Selection([
+ ('product_default', "Product Default"),
+ ], "Unit", required=True,
+ help="The unit in which the quantity is expressed.")
+ lines = fields.One2Many('product.price_list.line', 'price_list', 'Lines',
+ help="Add price formulas for different criterias.")
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @staticmethod
+ def default_tax_included():
+ return False
+
+ @classmethod
+ def default_unit(cls):
+ return 'product_default'
+
+ def get_context_formula(self, party, product, unit_price, quantity, uom,
+ pattern=None):
+ if product:
+ cost_price = product.get_multivalue('cost_price') or Decimal('0')
+ list_price = product.list_price_used
+ if list_price is None:
+ list_price = unit_price
+ else:
+ cost_price = Decimal('0')
+ list_price = unit_price
+ return {
+ 'names': {
+ 'unit_price': unit_price,
+ 'cost_price': cost_price,
+ 'list_price': list_price,
+ },
+ }
+
+ def get_uom(self, product):
+ return product.default_uom
+
+ def compute(self, party, product, unit_price, quantity, uom,
+ pattern=None):
+ 'Compute price based on price list of party'
+
+ Uom = Pool().get('product.uom')
+
+ def parents(categories):
+ for category in categories:
+ while category:
+ yield category
+ category = category.parent
+
+ if pattern is None:
+ pattern = {}
+
+ pattern = pattern.copy()
+ if product:
+ pattern['categories'] = [
+ c.id for c in parents(product.categories_all)]
+ pattern['product'] = product.id
+ pattern['quantity'] = Uom.compute_qty(uom, quantity,
+ self.get_uom(product), round=False) if product else quantity
+
+ context = self.get_context_formula(
+ party, product, unit_price, quantity, uom, pattern=pattern)
+ for line in self.lines:
+ if line.match(pattern):
+ return line.get_unit_price(**context)
+ return unit_price
+
+
+class PriceListLine(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
+ 'Price List Line'
+ __name__ = 'product.price_list.line'
+
+ price_list = fields.Many2One('product.price_list', 'Price List',
+ required=True, ondelete='CASCADE',
+ help="The price list to which the line belongs.")
+ category = fields.Many2One(
+ 'product.category', "Category", ondelete='CASCADE',
+ help="Apply only to products of this category.")
+ product = fields.Many2One('product.product', 'Product', ondelete='CASCADE',
+ help="Apply only to this product.")
+ quantity = fields.Float(
+ 'Quantity',
+ domain=['OR', ('quantity', '>=', 0), ('quantity', '=', None)],
+ help="Apply only when quantity is greater.")
+ formula = fields.Char('Formula', required=True,
+ help=('Python expression that will be evaluated with:\n'
+ '- unit_price: the original unit_price\n'
+ '- cost_price: the cost price of the product\n'
+ '- list_price: the list price of the product'))
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.__access__.add('price_list')
+
+ @staticmethod
+ def default_formula():
+ return 'unit_price'
+
+ @classmethod
+ def validate(cls, lines):
+ super(PriceListLine, cls).validate(lines)
+ for line in lines:
+ line.check_formula()
+
+ def check_formula(self):
+ '''
+ Check formula
+ '''
+ context = self.price_list.get_context_formula(
+ None, None, Decimal('0'), 0, None)
+
+ try:
+ if not isinstance(self.get_unit_price(**context), Decimal):
+ raise ValueError
+ except Exception as exception:
+ raise FormulaError(
+ gettext('product_price_list.msg_invalid_formula',
+ formula=self.formula,
+ line=self.rec_name,
+ exception=exception)) from exception
+
+ def match(self, pattern):
+ if 'quantity' in pattern:
+ pattern = pattern.copy()
+ quantity = pattern.pop('quantity')
+ if self.quantity is not None and self.quantity > abs(quantity):
+ return False
+ if 'categories' in pattern:
+ pattern = pattern.copy()
+ categories = pattern.pop('categories')
+ if (self.category is not None
+ and self.category.id not in categories):
+ return False
+ return super(PriceListLine, self).match(pattern)
+
+ def get_unit_price(self, **context):
+ 'Return unit price (as Decimal)'
+ context.setdefault('functions', {})['Decimal'] = Decimal
+ return simple_eval(decistmt(self.formula), **context)
diff --git a/modules/product_price_list/price_list.xml b/modules/product_price_list/price_list.xml
new file mode 100644
index 0000000000..6d05548790
--- /dev/null
+++ b/modules/product_price_list/price_list.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ product.price_list
+ form
+ price_list_form
+
+
+
+ product.price_list
+ tree
+ price_list_tree
+
+
+
+ Price Lists
+ product.price_list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+ product.price_list.line
+ form
+ price_list_line_form
+
+
+
+ product.price_list.line
+ tree
+ price_list_line_tree
+
+
+
+ product.price_list.line
+ tree
+
+ price_list_line_tree_sequence
+
+
+
+
diff --git a/modules/product_price_list/setup.py b/modules/product_price_list/setup.py
new file mode 100755
index 0000000000..cfe21cff4f
--- /dev/null
+++ b/modules/product_price_list/setup.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_product_price_list'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = ['simpleeval', 'python-sql >= 0.4']
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module with price list',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/product_price_list',
+ },
+ keywords='tryton product price list',
+ package_dir={'trytond.modules.product_price_list': '.'},
+ packages=(
+ ['trytond.modules.product_price_list']
+ + ['trytond.modules.product_price_list.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.product_price_list': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ product_price_list = trytond.modules.product_price_list
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ )
diff --git a/modules/product_price_list/tests/__init__.py b/modules/product_price_list/tests/__init__.py
new file mode 100644
index 0000000000..38c350ab00
--- /dev/null
+++ b/modules/product_price_list/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.product_price_list.tests.test_product_price_list import suite # noqa: E501
+except ImportError:
+ from .test_product_price_list import suite
+
+__all__ = ['suite']
diff --git a/modules/product_price_list/tests/test_product_price_list.py b/modules/product_price_list/tests/test_product_price_list.py
new file mode 100644
index 0000000000..8754185366
--- /dev/null
+++ b/modules/product_price_list/tests/test_product_price_list.py
@@ -0,0 +1,220 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from decimal import Decimal
+import unittest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.pool import Pool
+
+from trytond.modules.company.tests import (
+ create_company, set_company, CompanyTestMixin)
+
+
+class ProductPriceListTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test ProductPriceList module'
+ module = 'product_price_list'
+
+ @with_transaction()
+ def test_price_list(self):
+ 'Test price_list'
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Party = pool.get('party.party')
+ Uom = pool.get('product.uom')
+ PriceList = pool.get('product.price_list')
+
+ company = create_company()
+ with set_company(company):
+ party = Party(name='Customer')
+ party.save()
+
+ kilogram, = Uom.search([
+ ('name', '=', 'Kilogram'),
+ ])
+ gram, = Uom.search([
+ ('name', '=', 'Gram'),
+ ])
+
+ template = Template(
+ name='Test Lot Sequence',
+ list_price=Decimal(10),
+ default_uom=kilogram,
+ )
+ template.save()
+ product = Product(template=template)
+ product.save()
+ variant = Product(template=template)
+ variant.save()
+
+ price_list, = PriceList.create([{
+ 'name': 'Default Price List',
+ 'lines': [('create', [{
+ 'quantity': 10.0,
+ 'product': variant.id,
+ 'formula': 'unit_price * 0.8',
+ }, {
+ 'quantity': 10.0,
+ 'formula': 'unit_price * 0.9',
+ }, {
+ 'product': variant.id,
+ 'formula': 'unit_price * 1.1',
+ }, {
+ 'formula': 'unit_price',
+ }])],
+ }])
+ tests = [
+ (product, 1.0, kilogram, Decimal(10.0)),
+ (product, 1000.0, gram, Decimal(10.0)),
+ (variant, 1.0, kilogram, Decimal(11.0)),
+ (product, 10.0, kilogram, Decimal(9.0)),
+ (product, -10.0, kilogram, Decimal(9.0)),
+ (product, 10000.0, gram, Decimal(9.0)),
+ (variant, 10.0, kilogram, Decimal(8.0)),
+ (variant, 10000.0, gram, Decimal(8.0)),
+ ]
+ for product, quantity, unit, result in tests:
+ self.assertEqual(
+ price_list.compute(party, product, product.list_price,
+ quantity, unit),
+ result)
+
+ @with_transaction()
+ def test_price_list_category(self):
+ "Test price list with category"
+ pool = Pool()
+ Category = pool.get('product.category')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ PriceList = pool.get('product.price_list')
+
+ category = Category(name="Category")
+ category.save()
+ child_category = Category(name="Child Category", parent=category)
+ child_category.save()
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+
+ company = create_company()
+ with set_company(company):
+ template = Template(
+ name="Template",
+ list_price=Decimal(10),
+ default_uom=unit,
+ products=None,
+ categories=[category],
+ )
+ template.save()
+ product = Product(template=template)
+ product.save()
+
+ price_list, = PriceList.create([{
+ 'name': "Price List",
+ 'lines': [('create', [{
+ 'category': category.id,
+ 'formula': 'unit_price * 0.8',
+ }, {
+ 'formula': 'unit_price',
+ }])],
+ }])
+
+ self.assertEqual(
+ price_list.compute(None, product, product.list_price, 1, unit),
+ Decimal(8))
+
+ template.categories = []
+ template.save()
+
+ self.assertEqual(
+ price_list.compute(None, product, product.list_price, 1, unit),
+ Decimal(10))
+
+ template.categories = [child_category]
+ template.save()
+
+ self.assertEqual(
+ price_list.compute(None, product, product.list_price, 1, unit),
+ Decimal(8))
+
+ @with_transaction()
+ def test_price_list_cost_price(self):
+ "Test price list with cost_price formula"
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ PriceList = pool.get('product.price_list')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+
+ company = create_company()
+ with set_company(company):
+ template = Template(
+ name="Template",
+ list_price=Decimal(10),
+ default_uom=unit,
+ products=None,
+ )
+ template.save()
+ product = Product(template=template)
+ product.save()
+
+ price_list, = PriceList.create([{
+ 'name': "Price List",
+ 'lines': [('create', [{
+ 'formula': 'cost_price * 1.2',
+ }])],
+ }])
+
+ self.assertEqual(
+ price_list.compute(None, product, product.list_price, 1, unit),
+ Decimal(0))
+
+ product.cost_price = Decimal(5)
+ product.save()
+
+ self.assertEqual(
+ price_list.compute(None, product, product.list_price, 1, unit),
+ Decimal(6))
+
+ @with_transaction()
+ def test_price_list_list_price(self):
+ "Test price list with list_price formula"
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ PriceList = pool.get('product.price_list')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+
+ company = create_company()
+ with set_company(company):
+ template = Template(
+ name="Template",
+ list_price=Decimal(10),
+ default_uom=unit,
+ products=None,
+ )
+ template.save()
+ product = Product(template=template)
+ product.save()
+
+ price_list, = PriceList.create([{
+ 'name': "Price List",
+ 'lines': [('create', [{
+ 'formula': 'list_price * 0.8',
+ }])],
+ }])
+
+ self.assertEqual(
+ price_list.compute(None, product, Decimal(0), 1, unit),
+ Decimal(8))
+
+
+def suite():
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductPriceListTestCase))
+ return suite
diff --git a/modules/product_price_list/tox.ini b/modules/product_price_list/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/product_price_list/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/product_price_list/tryton.cfg b/modules/product_price_list/tryton.cfg
new file mode 100644
index 0000000000..1e7031550f
--- /dev/null
+++ b/modules/product_price_list/tryton.cfg
@@ -0,0 +1,9 @@
+[tryton]
+version=6.0.1
+depends:
+ company
+ ir
+ product
+xml:
+ price_list.xml
+ message.xml
diff --git a/modules/product_price_list/view/price_list_form.xml b/modules/product_price_list/view/price_list_form.xml
new file mode 100644
index 0000000000..857200b1d3
--- /dev/null
+++ b/modules/product_price_list/view/price_list_form.xml
@@ -0,0 +1,29 @@
+
+
+
diff --git a/modules/product_price_list/view/price_list_line_form.xml b/modules/product_price_list/view/price_list_line_form.xml
new file mode 100644
index 0000000000..47bb79b835
--- /dev/null
+++ b/modules/product_price_list/view/price_list_line_form.xml
@@ -0,0 +1,19 @@
+
+
+
diff --git a/modules/product_price_list/view/price_list_line_tree.xml b/modules/product_price_list/view/price_list_line_tree.xml
new file mode 100644
index 0000000000..017e43c818
--- /dev/null
+++ b/modules/product_price_list/view/price_list_line_tree.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product_price_list/view/price_list_line_tree_sequence.xml b/modules/product_price_list/view/price_list_line_tree_sequence.xml
new file mode 100644
index 0000000000..b10771f546
--- /dev/null
+++ b/modules/product_price_list/view/price_list_line_tree_sequence.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/product_price_list/view/price_list_tree.xml b/modules/product_price_list/view/price_list_tree.xml
new file mode 100644
index 0000000000..f6de0e0d81
--- /dev/null
+++ b/modules/product_price_list/view/price_list_tree.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/product_price_list_dates/.drone.yml b/modules/product_price_list_dates/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/product_price_list_dates/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/product_price_list_dates/.flake8 b/modules/product_price_list_dates/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/product_price_list_dates/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/product_price_list_dates/CHANGELOG b/modules/product_price_list_dates/CHANGELOG
new file mode 100644
index 0000000000..2d4846a3df
--- /dev/null
+++ b/modules/product_price_list_dates/CHANGELOG
@@ -0,0 +1,31 @@
+Version 6.0.1 - 2022-07-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Initial release
diff --git a/modules/product_price_list_dates/COPYRIGHT b/modules/product_price_list_dates/COPYRIGHT
new file mode 100644
index 0000000000..585f9c6f67
--- /dev/null
+++ b/modules/product_price_list_dates/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2017-2022 Cédric Krier
+Copyright (C) 2017-2022 B2CK
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/product_price_list_dates/LICENSE b/modules/product_price_list_dates/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/product_price_list_dates/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/product_price_list_dates/MANIFEST.in b/modules/product_price_list_dates/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/product_price_list_dates/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/product_price_list_dates/README.rst b/modules/product_price_list_dates/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/product_price_list_dates/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/product_price_list_dates/__init__.py b/modules/product_price_list_dates/__init__.py
new file mode 100644
index 0000000000..234aca06f4
--- /dev/null
+++ b/modules/product_price_list_dates/__init__.py
@@ -0,0 +1,21 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import product
+from . import sale
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ product.PriceList,
+ product.PriceListLine,
+ product.PriceListLineContext,
+ module='product_price_list_dates', type_='model')
+ Pool.register(
+ sale.Line,
+ product.SaleContext,
+ module='product_price_list_dates', type_='model',
+ depends=['sale_price_list'])
diff --git a/modules/product_price_list_dates/doc/index.rst b/modules/product_price_list_dates/doc/index.rst
new file mode 100644
index 0000000000..1d67ea7fb0
--- /dev/null
+++ b/modules/product_price_list_dates/doc/index.rst
@@ -0,0 +1,5 @@
+Product Price List Dates Module
+###############################
+
+The product_price_list_dates module adds *Start Date* and *End Date* conditions
+to the *Price List Lines*.
diff --git a/modules/product_price_list_dates/locale/bg.po b/modules/product_price_list_dates/locale/bg.po
new file mode 100644
index 0000000000..097f951508
--- /dev/null
+++ b/modules/product_price_list_dates/locale/bg.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/ca.po b/modules/product_price_list_dates/locale/ca.po
new file mode 100644
index 0000000000..7cdc7ed3c2
--- /dev/null
+++ b/modules/product_price_list_dates/locale/ca.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Data final"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Data inicial"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Obre línies"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "Context de la línia de tarifa"
diff --git a/modules/product_price_list_dates/locale/cs.po b/modules/product_price_list_dates/locale/cs.po
new file mode 100644
index 0000000000..097f951508
--- /dev/null
+++ b/modules/product_price_list_dates/locale/cs.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/de.po b/modules/product_price_list_dates/locale/de.po
new file mode 100644
index 0000000000..7bdd19cd90
--- /dev/null
+++ b/modules/product_price_list_dates/locale/de.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Enddatum"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Startdatum"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Positionen öffnen"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "Preisliste Position Kontext"
diff --git a/modules/product_price_list_dates/locale/es.po b/modules/product_price_list_dates/locale/es.po
new file mode 100644
index 0000000000..df3d39ed75
--- /dev/null
+++ b/modules/product_price_list_dates/locale/es.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Fecha fin"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Fecha inicial"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Abrir lineas"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "Contexto de la línea de tarifa"
diff --git a/modules/product_price_list_dates/locale/es_419.po b/modules/product_price_list_dates/locale/es_419.po
new file mode 100644
index 0000000000..662804d125
--- /dev/null
+++ b/modules/product_price_list_dates/locale/es_419.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr ""
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/et.po b/modules/product_price_list_dates/locale/et.po
new file mode 100644
index 0000000000..543a8ed07f
--- /dev/null
+++ b/modules/product_price_list_dates/locale/et.po
@@ -0,0 +1,32 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Lõppkuupäev"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Alguskuupäev"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+#, fuzzy
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Read"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Avatud read"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "Hinnakirja rea sisu"
diff --git a/modules/product_price_list_dates/locale/fa.po b/modules/product_price_list_dates/locale/fa.po
new file mode 100644
index 0000000000..785a46104a
--- /dev/null
+++ b/modules/product_price_list_dates/locale/fa.po
@@ -0,0 +1,32 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "تاریخ پایان"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "تاریخ شروع"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+#, fuzzy
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "خطوط"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "مفاد خط لیست قیمت"
diff --git a/modules/product_price_list_dates/locale/fi.po b/modules/product_price_list_dates/locale/fi.po
new file mode 100644
index 0000000000..097f951508
--- /dev/null
+++ b/modules/product_price_list_dates/locale/fi.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/fr.po b/modules/product_price_list_dates/locale/fr.po
new file mode 100644
index 0000000000..e86d8216f0
--- /dev/null
+++ b/modules/product_price_list_dates/locale/fr.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Date de fin"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Date de début"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Ouvrir les lignes"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "Contexte de ligne de liste de prix"
diff --git a/modules/product_price_list_dates/locale/hu.po b/modules/product_price_list_dates/locale/hu.po
new file mode 100644
index 0000000000..097f951508
--- /dev/null
+++ b/modules/product_price_list_dates/locale/hu.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/id.po b/modules/product_price_list_dates/locale/id.po
new file mode 100644
index 0000000000..e5983935fc
--- /dev/null
+++ b/modules/product_price_list_dates/locale/id.po
@@ -0,0 +1,32 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Tanggal Akhir"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Tanggal Awal"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+#, fuzzy
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Baris"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr ""
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/it.po b/modules/product_price_list_dates/locale/it.po
new file mode 100644
index 0000000000..097f951508
--- /dev/null
+++ b/modules/product_price_list_dates/locale/it.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/lo.po b/modules/product_price_list_dates/locale/lo.po
new file mode 100644
index 0000000000..992f29fd30
--- /dev/null
+++ b/modules/product_price_list_dates/locale/lo.po
@@ -0,0 +1,33 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "ວັນທີສິ້ນສຸດ"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "ວັນທີເລີ່ມ"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+#, fuzzy
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "ບໍລິບົດລາຍການບັນຊີລາຄາ"
diff --git a/modules/product_price_list_dates/locale/lt.po b/modules/product_price_list_dates/locale/lt.po
new file mode 100644
index 0000000000..88dcbf811a
--- /dev/null
+++ b/modules/product_price_list_dates/locale/lt.po
@@ -0,0 +1,32 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Pabaigos data"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Pradžios data"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Pabaigos data"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/nl.po b/modules/product_price_list_dates/locale/nl.po
new file mode 100644
index 0000000000..2b39048ba0
--- /dev/null
+++ b/modules/product_price_list_dates/locale/nl.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Eind datum"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Start datum"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Regels"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open posities"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "Prijslijst regelcontext"
diff --git a/modules/product_price_list_dates/locale/pl.po b/modules/product_price_list_dates/locale/pl.po
new file mode 100644
index 0000000000..c53235e941
--- /dev/null
+++ b/modules/product_price_list_dates/locale/pl.po
@@ -0,0 +1,33 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Data ukończenia"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Data rozpoczęcia"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/pt.po b/modules/product_price_list_dates/locale/pt.po
new file mode 100644
index 0000000000..a2c96dc431
--- /dev/null
+++ b/modules/product_price_list_dates/locale/pt.po
@@ -0,0 +1,32 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Data de término"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Data de início"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Linhas"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "Contexto das linhas de Preço de Tabela"
diff --git a/modules/product_price_list_dates/locale/ro.po b/modules/product_price_list_dates/locale/ro.po
new file mode 100644
index 0000000000..6f19bd7fd5
--- /dev/null
+++ b/modules/product_price_list_dates/locale/ro.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Data de încheiere"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Data de început"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Rânduri"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Rânduri Deschide"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "Contextul rândului de prețuri"
diff --git a/modules/product_price_list_dates/locale/ru.po b/modules/product_price_list_dates/locale/ru.po
new file mode 100644
index 0000000000..097f951508
--- /dev/null
+++ b/modules/product_price_list_dates/locale/ru.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/sl.po b/modules/product_price_list_dates/locale/sl.po
new file mode 100644
index 0000000000..94c98e4e1b
--- /dev/null
+++ b/modules/product_price_list_dates/locale/sl.po
@@ -0,0 +1,33 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr "Konec veljavnosti"
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr "Pričetek veljavnosti"
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr "Datum"
+
+#, fuzzy
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr "Datum"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr "Kontekst postavke cenika"
diff --git a/modules/product_price_list_dates/locale/tr.po b/modules/product_price_list_dates/locale/tr.po
new file mode 100644
index 0000000000..097f951508
--- /dev/null
+++ b/modules/product_price_list_dates/locale/tr.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/locale/zh_CN.po b/modules/product_price_list_dates/locale/zh_CN.po
new file mode 100644
index 0000000000..097f951508
--- /dev/null
+++ b/modules/product_price_list_dates/locale/zh_CN.po
@@ -0,0 +1,31 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:product.price_list.line.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.sale.context,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_price_list_line_form"
+msgid "Lines"
+msgstr "Lines"
+
+msgctxt "model:ir.model.button,string:price_list_open_lines_button"
+msgid "Open Lines"
+msgstr "Open Lines"
+
+msgctxt "model:product.price_list.line.context,name:"
+msgid "Price List Line Context"
+msgstr ""
diff --git a/modules/product_price_list_dates/product.py b/modules/product_price_list_dates/product.py
new file mode 100644
index 0000000000..835fce4a9e
--- /dev/null
+++ b/modules/product_price_list_dates/product.py
@@ -0,0 +1,89 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, fields
+from trytond.pool import PoolMeta, Pool
+from trytond.pyson import Eval, If
+from trytond.transaction import Transaction
+
+
+class PriceList(metaclass=PoolMeta):
+ __name__ = 'product.price_list'
+
+ @classmethod
+ def __setup__(cls):
+ super(PriceList, cls).__setup__()
+ cls._buttons.update({
+ 'open_lines': {},
+ })
+
+ @classmethod
+ @ModelView.button_action(
+ 'product_price_list_dates.act_price_list_line_form')
+ def open_lines(cls, price_lists):
+ pass
+
+ def compute(
+ self, party, product, unit_price, quantity, uom, pattern=None):
+ context = Transaction().context
+ pattern = pattern.copy() if pattern is not None else {}
+ pattern.setdefault('date', context.get('date'))
+ return super().compute(
+ party, product, unit_price, quantity, uom, pattern=pattern)
+
+
+class PriceListLine(metaclass=PoolMeta):
+ __name__ = 'product.price_list.line'
+
+ start_date = fields.Date(
+ "Start Date",
+ domain=[
+ If(Eval('start_date') & Eval('end_date'),
+ ('start_date', '<=', Eval('end_date')),
+ ()),
+ ],
+ depends=['end_date'])
+ end_date = fields.Date(
+ "End Date",
+ domain=[
+ If(Eval('start_date') & Eval('end_date'),
+ ('end_date', '>=', Eval('start_date')),
+ ()),
+ ],
+ depends=['start_date'])
+
+ def match(self, pattern):
+ pool = Pool()
+ Date = pool.get('ir.date')
+
+ pattern = pattern.copy()
+ date = pattern.pop('date', None) or Date.today()
+ if self.start_date and self.start_date > date:
+ return False
+ if self.end_date and self.end_date < date:
+ return False
+ return super(PriceListLine, self).match(pattern)
+
+
+class PriceListLineContext(ModelView):
+ "Price List Line Context"
+ __name__ = 'product.price_list.line.context'
+
+ date = fields.Date("Date")
+
+ @classmethod
+ def default_date(cls):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ return Date.today()
+
+
+class SaleContext(metaclass=PoolMeta):
+ __name__ = 'product.sale.context'
+
+ date = fields.Function(
+ fields.Date("Date"),
+ 'on_change_with_date')
+
+ @fields.depends('sale_date')
+ def on_change_with_date(self, name=None):
+ return self.sale_date
diff --git a/modules/product_price_list_dates/product.xml b/modules/product_price_list_dates/product.xml
new file mode 100644
index 0000000000..cc7f13d482
--- /dev/null
+++ b/modules/product_price_list_dates/product.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+ product.price_list
+
+ price_list_form
+
+
+ open_lines
+ Open Lines
+
+
+
+
+ product.price_list.line
+
+ price_list_line_form
+
+
+
+ product.price_list.line
+
+ price_list_line_tree
+
+
+
+ product.price_list.line
+
+ price_list_line_tree_sequence
+
+
+
+ Lines
+ product.price_list.line
+ product.price_list.line.context
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ product.price_list.line.context
+ form
+ price_list_line_context_form
+
+
+
+
+
+ product.sale.context
+
+ product_sale_context_form
+
+
+
diff --git a/modules/product_price_list_dates/sale.py b/modules/product_price_list_dates/sale.py
new file mode 100644
index 0000000000..b7ed430ed5
--- /dev/null
+++ b/modules/product_price_list_dates/sale.py
@@ -0,0 +1,22 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import fields
+from trytond.pool import PoolMeta
+from trytond.pyson import Eval
+
+
+class Line(metaclass=PoolMeta):
+ __name__ = 'sale.line'
+
+ @classmethod
+ def __setup__(cls):
+ super(Line, cls).__setup__()
+ cls.product.context['date'] = Eval(
+ '_parent_sale', {}).get('sale_date')
+
+ @fields.depends('sale', '_parent_sale.sale_date')
+ def _get_context_sale_price(self):
+ context = super(Line, self)._get_context_sale_price()
+ if self.sale:
+ context.setdefault('date', self.sale.sale_date)
+ return context
diff --git a/modules/product_price_list_dates/setup.py b/modules/product_price_list_dates/setup.py
new file mode 100755
index 0000000000..6588f3dae0
--- /dev/null
+++ b/modules/product_price_list_dates/setup.py
@@ -0,0 +1,151 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_product_price_list_dates'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = []
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [get_require_version('trytond_sale_price_list')]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module to add dates on price list',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": (
+ 'https://hg.tryton.org/modules/product_price_list_dates'),
+ },
+ keywords='tryton price list',
+ package_dir={'trytond.modules.product_price_list_dates': '.'},
+ packages=(
+ ['trytond.modules.product_price_list_dates']
+ + ['trytond.modules.product_price_list_dates.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.product_price_list_dates': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.fodt',
+ 'icons/*.svg', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ product_price_list_dates = trytond.modules.product_price_list_dates
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/product_price_list_dates/tests/__init__.py b/modules/product_price_list_dates/tests/__init__.py
new file mode 100644
index 0000000000..338190d99d
--- /dev/null
+++ b/modules/product_price_list_dates/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.product_price_list_dates.tests.test_product_price_list_dates import suite # noqa: E501
+except ImportError:
+ from .test_product_price_list_dates import suite
+
+__all__ = ['suite']
diff --git a/modules/product_price_list_dates/tests/test_product_price_list_dates.py b/modules/product_price_list_dates/tests/test_product_price_list_dates.py
new file mode 100644
index 0000000000..58613b500d
--- /dev/null
+++ b/modules/product_price_list_dates/tests/test_product_price_list_dates.py
@@ -0,0 +1,104 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import unittest
+import datetime
+from decimal import Decimal
+
+from trytond.pool import Pool
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.tests.test_tryton import suite as test_suite
+
+from trytond.modules.company.tests import (
+ create_company, set_company, CompanyTestMixin)
+from trytond.transaction import Transaction
+
+
+class ProductPriceListDatesTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test Product Price List Dates module'
+ module = 'product_price_list_dates'
+ extras = ['sale_price_list']
+
+ def create_price_list(self, field, date):
+ pool = Pool()
+ PriceList = pool.get('product.price_list')
+
+ company = create_company()
+ with set_company(company):
+ price_list, = PriceList.create([{
+ 'name': "Price List",
+ 'lines': [('create', [{
+ field: date,
+ 'formula': 'unit_price * 0.9',
+ }, {
+ 'formula': 'unit_price',
+ }])],
+ }])
+ return price_list
+
+ @with_transaction()
+ def test_price_list_start_date(self):
+ "Test price list with start date"
+ pool = Pool()
+ Date = pool.get('ir.date')
+
+ today = Date.today()
+ tomorrow = today + datetime.timedelta(days=1)
+
+ price_list = self.create_price_list('start_date', tomorrow)
+
+ self.assertEqual(
+ price_list.compute(
+ None, None, Decimal(10), 1, None, pattern={'date': today}),
+ Decimal(10))
+ self.assertEqual(
+ price_list.compute(
+ None, None, Decimal(10), 1, None, pattern={'date': tomorrow}),
+ Decimal(9))
+
+ @with_transaction()
+ def test_price_list_end_date(self):
+ "Test price list with end date"
+ pool = Pool()
+ Date = pool.get('ir.date')
+
+ today = Date.today()
+ yesterday = today - datetime.timedelta(days=1)
+
+ price_list = self.create_price_list('end_date', yesterday)
+
+ self.assertEqual(
+ price_list.compute(
+ None, None, Decimal(10), 1, None, pattern={'date': today}),
+ Decimal(10))
+ self.assertEqual(
+ price_list.compute(
+ None, None, Decimal(10), 1, None, pattern={'date': yesterday}),
+ Decimal(9))
+
+ @with_transaction()
+ def test_price_list_with_context_date(self):
+ "Test price list with context date"
+ pool = Pool()
+ Date = pool.get('ir.date')
+
+ today = Date.today()
+ tomorrow = today + datetime.timedelta(days=1)
+
+ price_list = self.create_price_list('start_date', tomorrow)
+
+ with Transaction().set_context(date=today):
+ self.assertEqual(
+ price_list.compute(None, None, Decimal(10), 1, None),
+ Decimal(10))
+ with Transaction().set_context(date=tomorrow):
+ self.assertEqual(
+ price_list.compute(None, None, Decimal(10), 1, None),
+ Decimal(9))
+
+
+def suite():
+ suite = test_suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductPriceListDatesTestCase))
+ return suite
diff --git a/modules/product_price_list_dates/tox.ini b/modules/product_price_list_dates/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/product_price_list_dates/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/product_price_list_dates/tryton.cfg b/modules/product_price_list_dates/tryton.cfg
new file mode 100644
index 0000000000..cc71271dd1
--- /dev/null
+++ b/modules/product_price_list_dates/tryton.cfg
@@ -0,0 +1,9 @@
+[tryton]
+version=6.0.2
+depends:
+ ir
+ product_price_list
+extras_depend:
+ sale_price_list
+xml:
+ product.xml
diff --git a/modules/product_price_list_dates/view/price_list_form.xml b/modules/product_price_list_dates/view/price_list_form.xml
new file mode 100644
index 0000000000..fd7fa5bd25
--- /dev/null
+++ b/modules/product_price_list_dates/view/price_list_form.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/product_price_list_dates/view/price_list_line_context_form.xml b/modules/product_price_list_dates/view/price_list_line_context_form.xml
new file mode 100644
index 0000000000..e65847939d
--- /dev/null
+++ b/modules/product_price_list_dates/view/price_list_line_context_form.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/modules/product_price_list_dates/view/price_list_line_form.xml b/modules/product_price_list_dates/view/price_list_line_form.xml
new file mode 100644
index 0000000000..6255a76594
--- /dev/null
+++ b/modules/product_price_list_dates/view/price_list_line_form.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/product_price_list_dates/view/price_list_line_tree.xml b/modules/product_price_list_dates/view/price_list_line_tree.xml
new file mode 100644
index 0000000000..be4860858e
--- /dev/null
+++ b/modules/product_price_list_dates/view/price_list_line_tree.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/product_price_list_dates/view/price_list_line_tree_sequence.xml b/modules/product_price_list_dates/view/price_list_line_tree_sequence.xml
new file mode 100644
index 0000000000..841ead1081
--- /dev/null
+++ b/modules/product_price_list_dates/view/price_list_line_tree_sequence.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/product_price_list_dates/view/product_sale_context_form.xml b/modules/product_price_list_dates/view/product_sale_context_form.xml
new file mode 100644
index 0000000000..56f0516bfa
--- /dev/null
+++ b/modules/product_price_list_dates/view/product_sale_context_form.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/product_price_list_parent/.drone.yml b/modules/product_price_list_parent/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/product_price_list_parent/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/product_price_list_parent/.flake8 b/modules/product_price_list_parent/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/product_price_list_parent/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/product_price_list_parent/CHANGELOG b/modules/product_price_list_parent/CHANGELOG
new file mode 100644
index 0000000000..65a0133a2e
--- /dev/null
+++ b/modules/product_price_list_parent/CHANGELOG
@@ -0,0 +1,18 @@
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Initial release
diff --git a/modules/product_price_list_parent/COPYRIGHT b/modules/product_price_list_parent/COPYRIGHT
new file mode 100644
index 0000000000..6fc1a91dd5
--- /dev/null
+++ b/modules/product_price_list_parent/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2018-2021 B2CK
+Copyright (C) 2018-2021 Cédric Krier
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/product_price_list_parent/LICENSE b/modules/product_price_list_parent/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/product_price_list_parent/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/product_price_list_parent/MANIFEST.in b/modules/product_price_list_parent/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/product_price_list_parent/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/product_price_list_parent/README.rst b/modules/product_price_list_parent/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/product_price_list_parent/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/product_price_list_parent/__init__.py b/modules/product_price_list_parent/__init__.py
new file mode 100644
index 0000000000..e2300979b4
--- /dev/null
+++ b/modules/product_price_list_parent/__init__.py
@@ -0,0 +1,14 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import product
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ product.PriceList,
+ product.PriceListLine,
+ module='product_price_list_parent', type_='model')
diff --git a/modules/product_price_list_parent/doc/index.rst b/modules/product_price_list_parent/doc/index.rst
new file mode 100644
index 0000000000..637f062fa1
--- /dev/null
+++ b/modules/product_price_list_parent/doc/index.rst
@@ -0,0 +1,6 @@
+Product Price List Parent Module
+################################
+
+The product_price_list_parent module adds a *Parent* to the price list and the
+keyword `parent_unit_price` for the formula which contains the unit price
+computed by the parent price list.
diff --git a/modules/product_price_list_parent/locale/bg.po b/modules/product_price_list_parent/locale/bg.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/bg.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/ca.po b/modules/product_price_list_parent/locale/ca.po
new file mode 100644
index 0000000000..9d74c2af2f
--- /dev/null
+++ b/modules/product_price_list_parent/locale/ca.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
+"\n"
+"- parent_unit_price: el preu unitari del pare"
diff --git a/modules/product_price_list_parent/locale/cs.po b/modules/product_price_list_parent/locale/cs.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/cs.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/de.po b/modules/product_price_list_parent/locale/de.po
new file mode 100644
index 0000000000..20e66f1906
--- /dev/null
+++ b/modules/product_price_list_parent/locale/de.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Übergeordnet (Preisliste)"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
+"\n"
+"- parent_unit_price: Der Einzelpreis der übergeordneten Preisliste"
diff --git a/modules/product_price_list_parent/locale/es.po b/modules/product_price_list_parent/locale/es.po
new file mode 100644
index 0000000000..74905ed3d4
--- /dev/null
+++ b/modules/product_price_list_parent/locale/es.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
+"\n"
+"- parent_unit_price: precio unitario del padre"
diff --git a/modules/product_price_list_parent/locale/es_419.po b/modules/product_price_list_parent/locale/es_419.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/es_419.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/et.po b/modules/product_price_list_parent/locale/et.po
new file mode 100644
index 0000000000..1b0353a8df
--- /dev/null
+++ b/modules/product_price_list_parent/locale/et.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Ülem"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
+"\n"
+"- ülem_ühiku_hind: ühiku_hind ülemalt"
diff --git a/modules/product_price_list_parent/locale/fa.po b/modules/product_price_list_parent/locale/fa.po
new file mode 100644
index 0000000000..b4a3572dfd
--- /dev/null
+++ b/modules/product_price_list_parent/locale/fa.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "مرجع"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/fi.po b/modules/product_price_list_parent/locale/fi.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/fi.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/fr.po b/modules/product_price_list_parent/locale/fr.po
new file mode 100644
index 0000000000..fce3c349fa
--- /dev/null
+++ b/modules/product_price_list_parent/locale/fr.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
+"\n"
+"- parent_unit_price : le prix unitaire du parent"
diff --git a/modules/product_price_list_parent/locale/hu.po b/modules/product_price_list_parent/locale/hu.po
new file mode 100644
index 0000000000..4a5e632b05
--- /dev/null
+++ b/modules/product_price_list_parent/locale/hu.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Fölérendelt"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
+"\n"
+"- parent_unit_price: a fölérendelt árlista egységára"
diff --git a/modules/product_price_list_parent/locale/id.po b/modules/product_price_list_parent/locale/id.po
new file mode 100644
index 0000000000..60a8c4addc
--- /dev/null
+++ b/modules/product_price_list_parent/locale/id.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Induk"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/it.po b/modules/product_price_list_parent/locale/it.po
new file mode 100644
index 0000000000..1456e93548
--- /dev/null
+++ b/modules/product_price_list_parent/locale/it.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/lo.po b/modules/product_price_list_parent/locale/lo.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/lo.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/lt.po b/modules/product_price_list_parent/locale/lt.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/lt.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/nl.po b/modules/product_price_list_parent/locale/nl.po
new file mode 100644
index 0000000000..80735ce415
--- /dev/null
+++ b/modules/product_price_list_parent/locale/nl.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
+"\n"
+"- parent_unit_price: de eenheidsprijs van het bovenliggend niveau"
diff --git a/modules/product_price_list_parent/locale/pl.po b/modules/product_price_list_parent/locale/pl.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/pl.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/pt.po b/modules/product_price_list_parent/locale/pt.po
new file mode 100644
index 0000000000..5b6923da9e
--- /dev/null
+++ b/modules/product_price_list_parent/locale/pt.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Pai"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/ro.po b/modules/product_price_list_parent/locale/ro.po
new file mode 100644
index 0000000000..d17cf644ef
--- /dev/null
+++ b/modules/product_price_list_parent/locale/ro.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr "Parinte"
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
+"\n"
+"- parent_unit_price: unit_price de la părinte"
diff --git a/modules/product_price_list_parent/locale/ru.po b/modules/product_price_list_parent/locale/ru.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/ru.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/sl.po b/modules/product_price_list_parent/locale/sl.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/sl.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/tr.po b/modules/product_price_list_parent/locale/tr.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/tr.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/locale/zh_CN.po b/modules/product_price_list_parent/locale/zh_CN.po
new file mode 100644
index 0000000000..78d8d936e2
--- /dev/null
+++ b/modules/product_price_list_parent/locale/zh_CN.po
@@ -0,0 +1,13 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.price_list,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "help:product.price_list.line,formula:"
+msgid ""
+"\n"
+"- parent_unit_price: the unit_price from the parent"
+msgstr ""
diff --git a/modules/product_price_list_parent/product.py b/modules/product_price_list_parent/product.py
new file mode 100644
index 0000000000..9a598141cc
--- /dev/null
+++ b/modules/product_price_list_parent/product.py
@@ -0,0 +1,31 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import PoolMeta
+from trytond.model import tree, fields
+
+
+class PriceList(tree(), metaclass=PoolMeta):
+ __name__ = 'product.price_list'
+
+ parent = fields.Many2One('product.price_list', "Parent")
+
+ def get_context_formula(self, party, product, unit_price, quantity, uom,
+ pattern=None):
+ context = super(PriceList, self).get_context_formula(
+ party, product, unit_price, quantity, uom, pattern=pattern)
+ if self.parent:
+ parent_unit_price = self.parent.compute(
+ party, product, unit_price, quantity, uom, pattern=pattern)
+ context['names']['parent_unit_price'] = parent_unit_price
+ return context
+
+
+class PriceListLine(metaclass=PoolMeta):
+ __name__ = 'product.price_list.line'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.formula.help += (
+ '\n- parent_unit_price: the unit_price from the parent')
diff --git a/modules/product_price_list_parent/product.xml b/modules/product_price_list_parent/product.xml
new file mode 100644
index 0000000000..694a3e6faa
--- /dev/null
+++ b/modules/product_price_list_parent/product.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ product.price_list
+
+ product_price_list_form
+
+
+
diff --git a/modules/product_price_list_parent/setup.py b/modules/product_price_list_parent/setup.py
new file mode 100755
index 0000000000..7316c3804d
--- /dev/null
+++ b/modules/product_price_list_parent/setup.py
@@ -0,0 +1,151 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_product_price_list_parent'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = []
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = []
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module to use price from another price list',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": (
+ 'https://hg.tryton.org/modules/product_price_list_parent'),
+ },
+ keywords='tryton price list',
+ package_dir={'trytond.modules.product_price_list_parent': '.'},
+ packages=(
+ ['trytond.modules.product_price_list_parent']
+ + ['trytond.modules.product_price_list_parent.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.product_price_list_parent': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.fodt',
+ 'icons/*.svg', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ product_price_list_parent = trytond.modules.product_price_list_parent
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/product_price_list_parent/tests/__init__.py b/modules/product_price_list_parent/tests/__init__.py
new file mode 100644
index 0000000000..7eccdbb5c9
--- /dev/null
+++ b/modules/product_price_list_parent/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.product_price_list_parent.tests.test_product_price_list_parent import suite # noqa: E501
+except ImportError:
+ from .test_product_price_list_parent import suite
+
+__all__ = ['suite']
diff --git a/modules/product_price_list_parent/tests/test_product_price_list_parent.py b/modules/product_price_list_parent/tests/test_product_price_list_parent.py
new file mode 100644
index 0000000000..d349315a14
--- /dev/null
+++ b/modules/product_price_list_parent/tests/test_product_price_list_parent.py
@@ -0,0 +1,76 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import unittest
+from decimal import Decimal
+
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.tests.test_tryton import suite as test_suite
+from trytond.pool import Pool
+
+from trytond.modules.company.tests import (
+ create_company, set_company, CompanyTestMixin)
+
+
+class ProductPriceListParentTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test Product Price List Parent module'
+ module = 'product_price_list_parent'
+
+ @with_transaction()
+ def test_price_list_parent(self):
+ "Test price list with parent"
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Party = pool.get('party.party')
+ Uom = pool.get('product.uom')
+ PriceList = pool.get('product.price_list')
+
+ company = create_company()
+ with set_company(company):
+ party = Party(name='Customer')
+ party.save()
+
+ unit, = Uom.search([('name', '=', "Unit")])
+
+ template = Template(
+ name="Template", list_price=Decimal(10), default_uom=unit)
+ template.save()
+ product = Product(template=template)
+ product.save()
+
+ price_list_parent, = PriceList.create([{
+ 'name': "Parent",
+ 'lines': [('create', [{
+ 'formula': 'unit_price * 2',
+ }])],
+ }])
+ price_list, = PriceList.create([{
+ 'name': "List",
+ 'parent': price_list_parent.id,
+ 'lines': [('create', [{
+ 'formula': 'parent_unit_price * 2',
+ }])],
+ }])
+
+ self.assertEqual(
+ price_list.compute(
+ party, product, product.list_price, 1, unit),
+ Decimal('40'))
+
+ @with_transaction()
+ def test_line_formula_help(self):
+ "Test help of line formula"
+ pool = Pool()
+ PriceListLine = pool.get('product.price_list.line')
+
+ fields = PriceListLine.fields_get(['formula'])
+
+ self.assertIn('parent_unit_price', fields['formula']['help'])
+
+
+def suite():
+ suite = test_suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductPriceListParentTestCase))
+ return suite
diff --git a/modules/product_price_list_parent/tox.ini b/modules/product_price_list_parent/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/product_price_list_parent/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/product_price_list_parent/tryton.cfg b/modules/product_price_list_parent/tryton.cfg
new file mode 100644
index 0000000000..2b8b90b390
--- /dev/null
+++ b/modules/product_price_list_parent/tryton.cfg
@@ -0,0 +1,7 @@
+[tryton]
+version=6.0.1
+depends:
+ ir
+ product_price_list
+xml:
+ product.xml
diff --git a/modules/product_price_list_parent/view/product_price_list_form.xml b/modules/product_price_list_parent/view/product_price_list_form.xml
new file mode 100644
index 0000000000..a615e272a3
--- /dev/null
+++ b/modules/product_price_list_parent/view/product_price_list_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/production/.drone.yml b/modules/production/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/production/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/production/.flake8 b/modules/production/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/production/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/production/CHANGELOG b/modules/production/CHANGELOG
new file mode 100644
index 0000000000..a65be430f3
--- /dev/null
+++ b/modules/production/CHANGELOG
@@ -0,0 +1,94 @@
+Version 6.0.4 - 2022-08-03
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.3 - 2022-04-15
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.2 - 2022-01-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.1 - 2021-06-17
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+* Allow productions to be automatically assigned
+* Default to ordering productions by date
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+* Add production picking and output locations
+* Add cron task to reschedule past productions
+* Allow lost_found as output of production
+* Keep cost of unused input products
+* Use the shipment assign wizard for production
+* Rename production state from cancel to cancelled
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+* Add origin to production
+* Delete cancelled moves when a production is reset to draft
+* Add employee on productions for some states
+* Convert set_moves into dualmethod
+* Add reference to production record name
+* Add cron task to update production cost
+* Allocate cost based on list price of each product
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+* Set output cost in done transition
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+* Ceil input and floor output quantities
+* Add producible to product template
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+* Add Lead Time of Production
+* Add Start Dates on Production
+
+Version 4.0.0 - 2016-05-02
+* Bug fixes (see mercurial logs for details)
+* Rename Production code into number
+* Add Python3 support
+
+Version 3.8.0 - 2015-11-02
+* Bug fixes (see mercurial logs for details)
+
+Version 3.6.0 - 2015-04-20
+* Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+Version 3.4.0 - 2014-10-20
+* Bug fixes (see mercurial logs for details)
+
+Version 3.2.0 - 2014-04-21
+* Bug fixes (see mercurial logs for details)
+* Allow to define effective date of productions
+
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+* Add calendar view
+
+Version 2.8.0 - 2013-04-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.6.0 - 2012-10-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.4.0 - 2012-08-15
+* Initial release
diff --git a/modules/production/COPYRIGHT b/modules/production/COPYRIGHT
new file mode 100644
index 0000000000..03f4719f79
--- /dev/null
+++ b/modules/production/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2012-2022 Cédric Krier.
+Copyright (C) 2012-2022 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/production/LICENSE b/modules/production/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/production/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/production/MANIFEST.in b/modules/production/MANIFEST.in
new file mode 100644
index 0000000000..94499680c6
--- /dev/null
+++ b/modules/production/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
+include icons/LICENSE
diff --git a/modules/production/README.rst b/modules/production/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/production/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/production/__init__.py b/modules/production/__init__.py
new file mode 100644
index 0000000000..d8269c6dfa
--- /dev/null
+++ b/modules/production/__init__.py
@@ -0,0 +1,35 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import configuration
+from . import bom
+from . import product
+from . import production
+from . import stock
+from . import ir
+
+
+def register():
+ Pool.register(
+ configuration.Configuration,
+ configuration.ConfigurationProductionSequence,
+ bom.BOM,
+ bom.BOMInput,
+ bom.BOMOutput,
+ bom.BOMTree,
+ bom.OpenBOMTreeStart,
+ bom.OpenBOMTreeTree,
+ production.Production,
+ product.Template,
+ product.Product,
+ product.ProductBom,
+ product.ProductionLeadTime,
+ stock.Location,
+ stock.Move,
+ stock.ProductQuantitiesByWarehouseMove,
+ ir.Cron,
+ module='production', type_='model')
+ Pool.register(
+ bom.OpenBOMTree,
+ module='production', type_='wizard')
diff --git a/modules/production/bom.py b/modules/production/bom.py
new file mode 100644
index 0000000000..c3429a529f
--- /dev/null
+++ b/modules/production/bom.py
@@ -0,0 +1,280 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, ModelSQL, DeactivableMixin, fields, Unique
+from trytond.wizard import Wizard, StateView, Button
+from trytond.pyson import Eval
+from trytond.pool import Pool
+
+
+class BOM(DeactivableMixin, ModelSQL, ModelView):
+ "Bill of Material"
+ __name__ = 'production.bom'
+
+ name = fields.Char('Name', required=True, translate=True)
+ inputs = fields.One2Many('production.bom.input', 'bom', 'Inputs')
+ outputs = fields.One2Many('production.bom.output', 'bom', 'Outputs')
+ output_products = fields.Many2Many('production.bom.output',
+ 'bom', 'product', 'Output Products')
+
+ def compute_factor(self, product, quantity, uom):
+ '''
+ Compute factor for an output product
+ '''
+ Uom = Pool().get('product.uom')
+ for output in self.outputs:
+ if output.product == product:
+ if not output.quantity:
+ return 0.0
+ quantity = Uom.compute_qty(uom, quantity,
+ output.uom, round=False)
+ return quantity / output.quantity
+ else:
+ return 0.0
+
+ @classmethod
+ def copy(cls, records, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('output_products', None)
+ return super(BOM, cls).copy(records, default=default)
+
+
+class BOMInput(ModelSQL, ModelView):
+ "Bill of Material Input"
+ __name__ = 'production.bom.input'
+
+ bom = fields.Many2One('production.bom', 'BOM', required=True,
+ select=1, ondelete='CASCADE')
+ product = fields.Many2One('product.product', 'Product', required=True)
+ uom_category = fields.Function(fields.Many2One(
+ 'product.uom.category', 'Uom Category'), 'on_change_with_uom_category')
+ uom = fields.Many2One('product.uom', 'Uom', required=True,
+ domain=[
+ ('category', '=', Eval('uom_category')),
+ ], depends=['uom_category'])
+ unit_digits = fields.Function(fields.Integer('Unit Digits'),
+ 'on_change_with_unit_digits')
+ quantity = fields.Float('Quantity', required=True,
+ domain=['OR',
+ ('quantity', '>=', 0),
+ ('quantity', '=', None),
+ ],
+ digits=(16, Eval('unit_digits', 2)),
+ depends=['unit_digits'])
+
+ @classmethod
+ def __setup__(cls):
+ super(BOMInput, cls).__setup__()
+ cls.product.domain = [('type', 'in', cls.get_product_types())]
+ cls.__access__.add('bom')
+ t = cls.__table__()
+ cls._sql_constraints = [
+ ('product_bom_uniq', Unique(t, t.product, t.bom),
+ 'production.msg_product_bom_unique'),
+ ]
+
+ @classmethod
+ def get_product_types(cls):
+ return ['goods', 'assets']
+
+ @fields.depends('product', 'uom')
+ def on_change_product(self):
+ if self.product:
+ category = self.product.default_uom.category
+ if not self.uom or self.uom.category != category:
+ self.uom = self.product.default_uom
+ self.unit_digits = self.product.default_uom.digits
+ else:
+ self.uom = None
+
+ @fields.depends('product')
+ def on_change_with_uom_category(self, name=None):
+ if self.product:
+ return self.product.default_uom.category.id
+
+ @fields.depends('uom')
+ def on_change_with_unit_digits(self, name=None):
+ if self.uom:
+ return self.uom.digits
+ return 2
+
+ def get_rec_name(self, name):
+ return self.product.rec_name
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return [('product.rec_name',) + tuple(clause[1:])]
+
+ @classmethod
+ def validate(cls, boms):
+ super(BOMInput, cls).validate(boms)
+ for bom in boms:
+ bom.check_bom_recursion()
+
+ def check_bom_recursion(self):
+ '''
+ Check BOM recursion
+ '''
+ self.product.check_bom_recursion()
+
+ def compute_quantity(self, factor):
+ return self.uom.ceil(self.quantity * factor)
+
+
+class BOMOutput(BOMInput):
+ "Bill of Material Output"
+ __name__ = 'production.bom.output'
+ _table = 'production_bom_output' # Needed to override BOMInput._table
+
+ def compute_quantity(self, factor):
+ return self.uom.floor(self.quantity * factor)
+
+ @classmethod
+ def delete(cls, outputs):
+ pool = Pool()
+ ProductBOM = pool.get('product.product-production.bom')
+ bom_products = [b for o in outputs for b in o.product.boms]
+ super(BOMOutput, cls).delete(outputs)
+ # Validate that output_products domain on bom is still valid
+ ProductBOM._validate(bom_products, ['bom'])
+
+
+class BOMTree(ModelView):
+ 'BOM Tree'
+ __name__ = 'production.bom.tree'
+
+ product = fields.Many2One('product.product', 'Product')
+ quantity = fields.Float('Quantity', digits=(16, Eval('unit_digits', 2)),
+ depends=['unit_digits'])
+ uom = fields.Many2One('product.uom', 'Uom')
+ unit_digits = fields.Integer('Unit Digits')
+ childs = fields.One2Many('production.bom.tree', None, 'Childs')
+
+ @classmethod
+ def tree(cls, product, quantity, uom, bom=None):
+ Input = Pool().get('production.bom.input')
+
+ result = []
+ if bom is None:
+ if not product.boms:
+ return result
+ bom = product.boms[0].bom
+
+ factor = bom.compute_factor(product, quantity, uom)
+ for input_ in bom.inputs:
+ quantity = Input.compute_quantity(input_, factor)
+ childs = cls.tree(input_.product, quantity, input_.uom)
+ values = {
+ 'product': input_.product.id,
+ 'product.': {
+ 'rec_name': input_.product.rec_name,
+ },
+ 'quantity': quantity,
+ 'uom': input_.uom.id,
+ 'uom.': {
+ 'rec_name': input_.uom.rec_name,
+ },
+ 'unit_digits': input_.uom.digits,
+ 'childs': childs,
+ }
+ result.append(values)
+ return result
+
+
+class OpenBOMTreeStart(ModelView):
+ 'Open BOM Tree'
+ __name__ = 'production.bom.tree.open.start'
+
+ quantity = fields.Float('Quantity', required=True,
+ digits=(16, Eval('unit_digits', 2)), depends=['unit_digits'])
+ uom = fields.Many2One('product.uom', 'Unit', required=True,
+ domain=[
+ ('category', '=', Eval('category')),
+ ], depends=['category'])
+ unit_digits = fields.Integer('Unit Digits', readonly=True)
+ category = fields.Many2One('product.uom.category', 'Category',
+ readonly=True)
+ bom = fields.Many2One('product.product-production.bom',
+ 'BOM', required=True, domain=[
+ ('product', '=', Eval('product')),
+ ], depends=['product'])
+ product = fields.Many2One('product.product', 'Product', readonly=True)
+
+ @fields.depends('uom')
+ def on_change_with_unit_digits(self):
+ if self.uom:
+ return self.uom.digits
+ return 2
+
+
+class OpenBOMTreeTree(ModelView):
+ 'Open BOM Tree'
+ __name__ = 'production.bom.tree.open.tree'
+
+ bom_tree = fields.One2Many('production.bom.tree', None, 'BOM Tree',
+ readonly=True)
+
+ @classmethod
+ def tree(cls, bom, product, quantity, uom):
+ pool = Pool()
+ Tree = pool.get('production.bom.tree')
+
+ childs = Tree.tree(product, quantity, uom, bom=bom)
+ bom_tree = [{
+ 'product': product.id,
+ 'product.': {
+ 'rec_name': product.rec_name,
+ },
+ 'quantity': quantity,
+ 'uom': uom.id,
+ 'uom.': {
+ 'rec_name': uom.rec_name,
+ },
+ 'unit_digits': uom.digits,
+ 'childs': childs,
+ }]
+ return {
+ 'bom_tree': bom_tree,
+ }
+
+
+class OpenBOMTree(Wizard):
+ 'Open BOM Tree'
+ __name__ = 'production.bom.tree.open'
+
+ start = StateView('production.bom.tree.open.start',
+ 'production.bom_tree_open_start_view_form', [
+ Button('Cancel', 'end', 'tryton-cancel'),
+ Button('OK', 'tree', 'tryton-ok', True),
+ ])
+ tree = StateView('production.bom.tree.open.tree',
+ 'production.bom_tree_open_tree_view_form', [
+ Button('Change', 'start', 'tryton-back'),
+ Button('Close', 'end', 'tryton-close'),
+ ])
+
+ def default_start(self, fields):
+ defaults = {}
+ product = self.record
+ defaults['category'] = product.default_uom.category.id
+ if getattr(self.start, 'uom', None):
+ defaults['uom'] = self.start.uom.id
+ defaults['unit_digits'] = self.start.unit_digits
+ else:
+ defaults['uom'] = product.default_uom.id
+ defaults['unit_digits'] = product.default_uom.digits
+ defaults['product'] = product.id
+ if getattr(self.start, 'bom', None):
+ defaults['bom'] = self.start.bom.id
+ elif product.boms:
+ defaults['bom'] = product.boms[0].id
+ defaults['quantity'] = getattr(self.start, 'quantity', None)
+ return defaults
+
+ def default_tree(self, fields):
+ pool = Pool()
+ BomTree = pool.get('production.bom.tree.open.tree')
+ return BomTree.tree(self.start.bom.bom, self.start.product,
+ self.start.quantity, self.start.uom)
diff --git a/modules/production/bom.xml b/modules/production/bom.xml
new file mode 100644
index 0000000000..68d7fba8a5
--- /dev/null
+++ b/modules/production/bom.xml
@@ -0,0 +1,140 @@
+
+
+
+
+
+ production.bom
+ tree
+ bom_list
+
+
+
+ production.bom
+ form
+ bom_form
+
+
+
+ BOMs
+ production.bom
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ BOM
+ production.bom
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ production.bom.input
+ tree
+ bom_input_list
+
+
+ production.bom.input
+ form
+ bom_input_form
+
+
+
+ production.bom.output
+ tree
+ bom_output_list
+
+
+ production.bom.output
+ form
+ bom_output_form
+
+
+
+ production.bom.tree
+ tree
+ childs
+ bom_tree_tree
+
+
+
+ production.bom.tree.open.start
+ form
+ bom_tree_open_start_form
+
+
+
+ production.bom.tree.open.tree
+ form
+ bom_tree_open_tree_form
+
+
+
+ BOM Tree
+ production.bom.tree.open
+ product.product
+
+
+
+ form_relate
+ product.product,-1
+
+
+
+
+ BOMs
+ production.bom
+
+
+ As Inputs
+
+
+
+
+
+ As Outputs
+
+
+
+
+
+ form_relate
+ product.product,-1
+
+
+
+
+
diff --git a/modules/production/configuration.py b/modules/production/configuration.py
new file mode 100644
index 0000000000..30445759c7
--- /dev/null
+++ b/modules/production/configuration.py
@@ -0,0 +1,69 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond import backend
+from trytond.model import ModelView, ModelSQL, ModelSingleton, fields
+from trytond.pool import Pool
+from trytond.pyson import Eval, Id
+from trytond.tools.multivalue import migrate_property
+from trytond.modules.company.model import (
+ CompanyMultiValueMixin, CompanyValueMixin)
+
+
+class Configuration(
+ ModelSingleton, ModelSQL, ModelView, CompanyMultiValueMixin):
+ 'Production Configuration'
+ __name__ = 'production.configuration'
+
+ production_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Production Sequence", required=True,
+ domain=[
+ ('company', 'in',
+ [Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('production', 'sequence_type_production')),
+ ]))
+
+ @classmethod
+ def default_production_sequence(cls, **pattern):
+ return cls.multivalue_model(
+ 'production_sequence').default_production_sequence()
+
+
+class ConfigurationProductionSequence(ModelSQL, CompanyValueMixin):
+ "Production Configuration Production Sequence"
+ __name__ = 'production.configuration.production_sequence'
+ production_sequence = fields.Many2One(
+ 'ir.sequence', "Production Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('production', 'sequence_type_production')),
+ ],
+ depends=['company'])
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+
+ super(ConfigurationProductionSequence, cls).__register__(module_name)
+
+ if not exist:
+ cls._migrate_property([], [], [])
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.append('production_sequence')
+ value_names.append('production_sequence')
+ fields.append('company')
+ migrate_property(
+ 'production.configuration', field_names, cls, value_names,
+ fields=fields)
+
+ @classmethod
+ def default_production_sequence(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id('production', 'sequence_production')
+ except KeyError:
+ return None
diff --git a/modules/production/configuration.xml b/modules/production/configuration.xml
new file mode 100644
index 0000000000..da59f20556
--- /dev/null
+++ b/modules/production/configuration.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+ production.configuration
+ form
+ configuration_form
+
+
+
+ Configuration
+ production.configuration
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/production/doc/index.rst b/modules/production/doc/index.rst
new file mode 100644
index 0000000000..dbc362ec4a
--- /dev/null
+++ b/modules/production/doc/index.rst
@@ -0,0 +1,74 @@
+Production Module
+#################
+
+The production module defines basics for production management: Bill of
+material and production order.
+
+
+Bill of Material
+****************
+
+Bills of Material are list of products and quantities needed to produce a
+product. It is often shorten with BOM.
+
+Production
+**********
+
+A Production is mainly defined by a product, a BOM, a location, a quantity and
+two lists of moves:
+
+* Inputs
+
+ The moves between the production picking location, or the storage location
+ if product picking location is empty, and the production location
+ (as defined on the warehouse) for products used for production.
+
+* Outputs
+
+ The moves between the production location and the production output
+ location, or the storage location if production output is empty, for produced
+ products.
+
+The production can be in one of this states:
+
+* Request
+
+ The production is requested by the system.
+
+* Draft
+
+ Input and output moves are in draft.
+
+* Waiting
+
+ The production is waiting for action and all moves are still in draft.
+
+* Assigned
+
+ The input moves are assigned.
+
+* Running
+
+ The input moves are in state done.
+
+* Done
+
+ The output moves are in state done.
+
+* Cancelled
+
+ All moves are cancelled.
+
+The cost of the production is computed with the sum of the cost price of all
+incoming products. This cost is allocated to the output products based on the
+list price of each (the product without a list price are considered as waste).
+
+A cron task runs every day and updates the cost of productions if the cost
+price of the incoming products has changed.
+
+
+Rescheduling Production
+-----------------------
+
+It is possible to setup a cron task to reschedule the productions that are
+planned to start in the past. By default they are rescheduled to today.
diff --git a/modules/production/icons/LICENSE b/modules/production/icons/LICENSE
new file mode 100644
index 0000000000..7a4a3ea242
--- /dev/null
+++ b/modules/production/icons/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/modules/production/icons/tryton-production.svg b/modules/production/icons/tryton-production.svg
new file mode 100644
index 0000000000..1ee229783a
--- /dev/null
+++ b/modules/production/icons/tryton-production.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/production/ir.py b/modules/production/ir.py
new file mode 100644
index 0000000000..4caba21423
--- /dev/null
+++ b/modules/production/ir.py
@@ -0,0 +1,16 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import PoolMeta
+
+
+class Cron(metaclass=PoolMeta):
+ __name__ = 'ir.cron'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.method.selection.extend([
+ ('production|set_cost_from_moves', "Set Cost from Moves"),
+ ('production|reschedule', "Reschedule Productions"),
+ ('production|assign_cron', "Assign Productions"),
+ ])
diff --git a/modules/production/locale/bg.po b/modules/production/locale/bg.po
new file mode 100644
index 0000000000..af62db49aa
--- /dev/null
+++ b/modules/production/locale/bg.po
@@ -0,0 +1,618 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "Спецификации"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Цена"
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Ефективна дата"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Входящи"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Местонахождение"
+
+#, fuzzy
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Изходящи"
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Назначен"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Планирана дата"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Препратка"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Десетични единици"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "Мерни единици"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Категория мер. ед."
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Входящи"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Изходящи продукти"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Изходящи"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Десетични единици"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "Мерни единици"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Категория мер. ед."
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Десетични единици"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "Мерни единици"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Категория мер. ед."
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Наследници"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Десетични единици"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "Мерни единици"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Категория"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Десетични единици"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Единица"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Дърво от спецификацията"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Последователност на производство"
+
+#, fuzzy
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Последователност на производство"
+
+#, fuzzy
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Производство"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Изход на производство"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Производство"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Вход на производство"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Изход на производство"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "Спецификации"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Производства"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Заявки"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "В изпълнение"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Очакване"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Производства"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Продукт - Спецификация"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Производство"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Спецификация"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Спецификация Входящ"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Спецификация Изходящ"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Дърво от спецификацията"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Отваряне на дърво от спецификацията"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Отваряне на дърво от спецификацията"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Настройки Производство"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Производства"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Заявка"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "В изпълнение"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Очакване"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Производство"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Друга информация"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "Добре"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Затваряне"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "Промяна"
diff --git a/modules/production/locale/ca.po b/modules/production/locale/ca.po
new file mode 100644
index 0000000000..1b5da12d65
--- /dev/null
+++ b/modules/production/locale/ca.po
@@ -0,0 +1,581 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "Llistes de materials"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "Temps d'espera"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "Produïble"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "Llista de materials"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "Produïble"
+
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Reservat per"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "Llista de materials"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Finalitzat per"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Data efectiva"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Data d'inici efectiva"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Entrades"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr "Origen"
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Sortides"
+
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Reservat parcialment"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Data estimada"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Data d'inici estimada"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr "Executat per"
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria d'UdM"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Entrades"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Productes de sortida"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Sortides"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "Llistes de materials"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria d'UdM"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "Llista de materials"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria d'UdM"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Fills"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "Llista de materials"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Arbre de la llista de materials"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Seqüència de producció"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Seqüència de producció"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "Llista de materials"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Temps d'espera"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Sortida de la producció"
+
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Recollida de la producció"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr "Preu de cost actualitzat"
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Entrada de la producció"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Sortida de la producció"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+"On s'emagatzemen els productes produïts.\n"
+"Deixeu en blanc per utilitzar la zona d'emmagatzematge del magatzem."
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+"Des d'on es recullen els components de la producció.\n"
+"Deixeu-ho en blanc per utitlizar la zona d'emagatzematge del magatzem."
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "Llistes de materials"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "Llistes de materials"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "Llistes de materials"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Produccions"
+
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Produccions"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "Arbre de la llista de materials"
+
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Reserva la producció"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "Com entrades"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "Com sortides"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Reservada"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Reservat parcialment"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Sol·licituds"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "En execució"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr "Un producte només pot aparèixer una vegada a cada LdM."
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr "No podeu crear una LdM recursiva pel producte \"%(product)s\"."
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr "Esteu segurs que voleu completar la producció?"
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Reserva"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Finalitza"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Restaura amb la LdM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Executa"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "En espera"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "Llistes de materials"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Produccions"
+
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Produccions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Producte - Llista de materials"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Llista de materials"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Entrades de la llista de materials"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Sortida de la llista de materials"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Arbre de l'escandall"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Obre l'arbre de llistes de materials"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Obre l'arbre de llistes de materials"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Configuració de la producció"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "Configuració de la seqüencia de producció"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "Temps d'espera de la producció"
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Administració de producció"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Reserva les produccions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Replanifica les produccions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr "Estableix cost a partir dels moviments"
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Reservada"
+
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Cancel·lada"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Finalitzada"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Sol·licitud"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "En execució"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "D'acord"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Tanca"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "Canvia"
diff --git a/modules/production/locale/cs.po b/modules/production/locale/cs.po
new file mode 100644
index 0000000000..2dcd77bccb
--- /dev/null
+++ b/modules/production/locale/cs.po
@@ -0,0 +1,611 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr ""
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr ""
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Production"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr ""
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr ""
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr ""
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Production Configuration"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Productions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr ""
diff --git a/modules/production/locale/de.po b/modules/production/locale/de.po
new file mode 100644
index 0000000000..2db3fc39fe
--- /dev/null
+++ b/modules/production/locale/de.po
@@ -0,0 +1,582 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "Stücklisten"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "Beschaffungszeiten"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "Produzierbar"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "Stückliste"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "Produzierbar"
+
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Reserviert von"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "Stückliste"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Erledigt von"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Effektives Datum"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Effektives Startdatum"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Eingänge"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Lagerort"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr "Herkunft"
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Ausgänge"
+
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Teilweise Reserviert"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Geplantes Datum"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Geplantes Startdatum"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Referenz"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr "Ausgeführt von"
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Nachkommastellen"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "Maßeinheit"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Maßeinheitenkategorie"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Warenlager"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Eingänge"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Erzeugte Produkte"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Ausgänge"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "Stückliste"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Nachkommastellen"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "Maßeinheit"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Maßeinheitenkategorie"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "Stückliste"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Nachkommastellen"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "Maßeinheit"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Maßeinheitenkategorie"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Untergeordnet (Stücklisten)"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Nachkommastellen"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "Maßeinheit"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "Stückliste"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Nachkommastellen"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Stück"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Stücklistenbaum"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Nummernkreis Produktion"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Nummernkreis Produktion"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "Stückliste"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Beschaffungszeit"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Produktion Ausgänge"
+
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Produktion Kommissionierung"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr "Einstandspreis aktualisiert"
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Produktion Eingänge"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Produktion Ausgänge"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+"Wo die produzierten Waren gelagert werden.\n"
+"Leer lassen, um die Lagerzone des Warenlagers zu verwenden."
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+"Woher die Produktkomponenten kommissioniert werden.\n"
+"Leer lassen, um die Lagerzone des Warenlagers zu verwenden."
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "Stückliste"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "Stücklisten"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "Stücklisten"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Produktionsaufträge"
+
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Produktionsaufträge"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "Stücklistenbaum"
+
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Produktionsaufträge reservieren"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "Als Eingänge"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "Als Ausgänge"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Reserviert"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Teilweise Reserviert"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Anforderungen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "In Ausführung"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr "Artikel dürfen nur einmal je Stückliste verwendet werden."
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+"Für Artikel \"%(product)s\" darf keine rekursive Stückliste erstellt werden."
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr "Sind Sie sicher, dass Sie den Produktionsauftrag abschließen wollen?"
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Reservieren"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Auf Stückliste zurücksetzen"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Ausführen"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Warten"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "Stücklisten"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Produktionsaufträge"
+
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Produktionsaufträge"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Artikel - Stückliste"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Stückliste"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Stückliste Eingang"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Stückliste Ausgang"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Stücklistenbaum"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Stücklistenbaum öffnen"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Stücklistenbaum öffnen"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Einstellungen Produktion"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "Einstellungen Produktion Nummernkreis"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "Produktion Beschaffungszeit"
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Produktion Administration"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Produktionsaufträge reservieren"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Produktionsaufträge neu planen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr "Einstandpreis auf Lagerbewegungen setzen"
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Reserviert"
+
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Angefordert"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "In Ausführung"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Schließen"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "Ändern"
diff --git a/modules/production/locale/es.po b/modules/production/locale/es.po
new file mode 100644
index 0000000000..7cbd0a957c
--- /dev/null
+++ b/modules/production/locale/es.po
@@ -0,0 +1,581 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "LdM"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "Tiempo de espera"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "Producible"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "LdM"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "Producible"
+
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Reservado por"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "LdM"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Coste"
+
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Finalizado por"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Fecha efectiva"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Fecha inicio efectiva"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Entradas"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr "Origen"
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Salidas"
+
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Reservado parcialmente"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Fecha estimada"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Fecha inicio estimada"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr "Ejecutado por"
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Categoría de UdM"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Entradas"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Productos salida"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Salidas"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "LdM"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Categoría de UdM"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "LdM"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Categoría de UdM"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Hijos"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "LdM"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Árbol LdM"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Secuencia de producción"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Secuencia de producción"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "Lista de material"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Tiempo de espera"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Salida de la producción"
+
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Recogida de la producción"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr "Precio de coste actualizado"
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Entrada producción"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Salida producción"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+"Donde se almacenan los productos producidos.\n"
+"Dejar en blanco para utilizar la zona de almacenamiento del almacén."
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+"Desde donde se recogen los componentes de la producción.\n"
+"Dejar en blanco para utilizar la zona de almacenamiento del almacén."
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "Listas de materiales"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "Listas de materiales"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "Listas de materiales"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Producciones"
+
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Producciones"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "Árbol de la lista de materiales"
+
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Reservar la producción"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "Como entradas"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "Como salidas"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Reservado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Reservado parcialmente"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Solicitudes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "En ejecución"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr "Los productos solo pueden aparecer una vez en cada LdM."
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr "No puede crear una LdM recursiva para el producto \"%(product)s\"."
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr "Seguro que quieres finalizar la producción?"
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Reservar"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Finalizar"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Restaurar con la LdM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Ejecutar"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "En espera"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Producciones"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "Listas de materiales"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Producciones"
+
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Producciones"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Producto - LdM"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Lista de Material"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Entrada Lista de Material"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Salida Lista de Material"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Árbol LdM"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Abrir árbol BOM"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Abrir árbol BOM"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Configuración de la producción"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "Configuración de la secuencia de producción"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "Tiempo de espera de la producción"
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Administración de producción"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Reserva las producciones"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Replanificar las producciones"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr "Establecer el coste desde los movimientos"
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Reservada"
+
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Cancelada"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Finalizada"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "En ejecución"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Cerrar"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "Cambiar"
diff --git a/modules/production/locale/es_419.po b/modules/production/locale/es_419.po
new file mode 100644
index 0000000000..f4ed36c39d
--- /dev/null
+++ b/modules/production/locale/es_419.po
@@ -0,0 +1,579 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr ""
+
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr ""
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr ""
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr ""
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr ""
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr ""
+
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr ""
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr ""
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Canel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr ""
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr ""
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr ""
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr ""
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr ""
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr ""
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr ""
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Canel"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr ""
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Canel"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr ""
diff --git a/modules/production/locale/et.po b/modules/production/locale/et.po
new file mode 100644
index 0000000000..c8858ff074
--- /dev/null
+++ b/modules/production/locale/et.po
@@ -0,0 +1,591 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "Retseptid"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "Viiteaeg"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "Toodetav"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "Retsept"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "Toodetav"
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Omistatud"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "Retsept"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Hind"
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Tehtud"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Kehtiv kuupäev"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Tegelik alguskuupäev"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Sisendid"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Asukoht"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Väljundid"
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Omistatud"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Planeeritud kuuüäev"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Planeeritud alguskuupäev"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Viide"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Ühiku numbriväärtus"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "Mõõtühik"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Mõõtühiku kategooria"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Sisendid"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Nimi"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Valmistooted"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Väljundid"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "Retsept"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Ühiku numbriväärtus"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "Mõõtühik"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Mõõtühiku kategooria"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "Retsept"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Ühiku numbriväärtus"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "Mõõtühik"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Mõõtühiku kategooria"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Alamjaotused"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Ühiku numbriväärtus"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "Mõõtühik"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "Retsept"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Kategooria"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Ühiku numbriväärtus"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Ühik"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Retseptipuu"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Tootmise järjestus"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Tootmise järjestus"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "Retsept"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Viiteaeg"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Tootmine"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Tootmise väljund"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Tootmine"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Tootmise sisend"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Tootmise väljund"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "Retsept"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "Retseptid"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "Retseptid"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Tootmised"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Tootmised"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "Retseptipuu"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Tootmise omistamine"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "Kui sisendid"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "Kui väljundid"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Omistatud"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Omistatud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Päring"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Jooksev"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr "Toode võib retseptis olla ainult ühekordselt."
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Omista"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Taasta reteptile"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Käivita"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Oota"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Tootmine"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Tootmine"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "Retseptid"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Tootmine"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Tootmised"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Tootmised"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Toode - Retsept"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Tootmine"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Retsept"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Retsepti sisend"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Retsepti väljund"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Retseptipuu"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Ava retseptipuu"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Ava retseptipuu"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Tootmise seadistus"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "Tootmise seadistus tootmise järjestus"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "Tootmise aeg"
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Tootmine"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Tootmine administreerimine"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Tootmine"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Tootmise omistamine"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Tootmised"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Omistatud"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Päring"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Jooksev"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Ootel"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Tootmine"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Read"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Read"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Muu info"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Sulge"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "Muuda"
diff --git a/modules/production/locale/fa.po b/modules/production/locale/fa.po
new file mode 100644
index 0000000000..9321d39c4d
--- /dev/null
+++ b/modules/production/locale/fa.po
@@ -0,0 +1,590 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "زمان پیشبرد"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "قابل توليد"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "قابل توليد"
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "تخصیص داده شده"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "هزینه"
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "تاریخ موثر"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "شروع تاریخ موثر"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "ورودی ها"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "مکان"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "خروجی ها"
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "تخصیص داده شده"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "تاریخ برنامه ریزی شده"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "شروع تاریخ برنامه ریزی شده"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "مرجع"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "ارقام واحد"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "واحد اندازی گیری"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "دسته بندی واحد اندازه گیری"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "ورودی ها"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "محصولات خروجی"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "خروجی ها"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "ارقام واحد"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "واحد اندازی گیری"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "دسته بندی واحد اندازه گیری"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "ارقام واحد"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "واحد اندازی گیری"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "دسته بندی واحد اندازه گیری"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "زیرمجموعه ها"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "ارقام واحد"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "واحد اندازی گیری"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "دستهبندی"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "ارقام واحد"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "واحد"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "BOM درخت"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "ادامه تولید"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "ادامه تولید"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "زمان انجام کار"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "تهیه کننده"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "تولیدات خروجی"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "تهیه کننده"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "تولیدات ورودی"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "تولیدات خروجی"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "تولیدات"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "تولیدات"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM درخت"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "اختصاص تولید"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "به عنوان ورودی ها"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "به عنوان خروجی ها"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "تخصیص داده شده"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "تخصیص داده شده"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "درخواست ها"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "در حال اجرا"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "در انتظار"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr "محصولات فقط می تواند یک بار در هر BOM ظاهر می شود."
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr "شما نمیتوانید یک BOM بازگشتی برای محصول :\"%(product)s\" ایجاد کنید."
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "تولید"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "تولید"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "تولید"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "تولیدات"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "تولیدات"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "محصول - BOM"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "تولید"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "صورت حساب مواد اولیه"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "صورت حساب مواد اولیه ورودی"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "صورت حساب مواد اولیه خروجی"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "BOM درخت"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "بازکردن BOM درخت"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "بازکردن BOM درخت"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "پیکره بندی تولید"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "پیکره بندی تولید ادامه تولید"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "زمان پیشبرد تولید"
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "تولید"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "مدیریت تولید"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "تولید"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "اختصاص تولید"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "تولیدات"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "تخصیص داده شده"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "درخواست"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "در حال اجرا"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "در انتظار"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "تهیه کننده"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "خطوط"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "خطوط"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "سایر اطلاعات"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "انصراف"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "قبول"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "بسته"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "تغییر"
diff --git a/modules/production/locale/fi.po b/modules/production/locale/fi.po
new file mode 100644
index 0000000000..0853d5b314
--- /dev/null
+++ b/modules/production/locale/fi.po
@@ -0,0 +1,610 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr ""
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr ""
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Production"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr ""
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr ""
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr ""
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Production Configuration"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Productions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr ""
diff --git a/modules/production/locale/fr.po b/modules/production/locale/fr.po
new file mode 100644
index 0000000000..f2bac607cb
--- /dev/null
+++ b/modules/production/locale/fr.po
@@ -0,0 +1,584 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "Nomenclatures"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "Délais de production"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "Productible"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "Nomenclature"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "Productible"
+
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assignée par"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "Nomenclature"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Coût"
+
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Effectuée par"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Date effective"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Date de début effective"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Entrées"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr "Origine"
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Sorties"
+
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Partiellement assignées"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Date planifiée"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Date de début planifiée"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr "Exécutée par"
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "Unité de mesure"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Entrées"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Produits en sortie"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Sorties"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "Nomenclature"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "Unité de mesure"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "Nomenclature"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "Unité de mesure"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Enfants"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "Unité de mesure"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "Nomenclature"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Arbre de nomenclature"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Séquence de production"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Séquence de production"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "Nomenclature"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Délai de production"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Sortie de production"
+
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Prélèvement de production"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr "Prix de revient actualisé"
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Entrée de production"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Sortie de production"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+"Où les biens produits sont stockés.\n"
+"Laissez vide pour utiliser l'emplacement de stockage de l'entrepôt."
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+"Où les composants de production sont prélevés.\n"
+"Laissez vide pour utiliser l'emplacement de stockage de l'entrepôt."
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "Nomenclature"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "Nomenclatures"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "Nomenclatures"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "Arbre de nomenclatures"
+
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assigner la production"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "Comme entrées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "Comme sorties"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "Toutes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assignées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Partiellement assignées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Demandées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "En cours"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "En attentes"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+"Les produits ne peuvent apparaître qu'une seule fois par nomenclature."
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+"Vous ne pouvez pas créer une nomenclature récursive pour le produit "
+"« %(product)s »."
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr "Êtes-vous sûr de vouloir terminer la production ?"
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assigner"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Terminée"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Réinitialiser à la nomenclature"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Lancer"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Attendre"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "Nomenclatures"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Produit - Nomenclature"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Nomenclature"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Entrée nomenclature"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Sortie nomenclature"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Arbre de nomenclatures"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Ouvrir l'arbre de nomenclatures"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Ouvrir l'arbre de nomenclatures"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Configuration de la production"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "Configuration de production séquence de production"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "Délai de production"
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Administration de la production"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assigner les productions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Reprogrammer les productions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr "Établir les coûts des mouvements"
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Assignée"
+
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Annulée"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Terminée"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Demande"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "En cours"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Fermer"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "Changer"
diff --git a/modules/production/locale/hu.po b/modules/production/locale/hu.po
new file mode 100644
index 0000000000..6ec5ea4f86
--- /dev/null
+++ b/modules/production/locale/hu.po
@@ -0,0 +1,660 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Társaság"
+
+#, fuzzy
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Költség"
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Raktár hely"
+
+#, fuzzy
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Állapot"
+
+#, fuzzy
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Tizedes vessző utáni számjegy"
+
+#, fuzzy
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "Egység"
+
+#, fuzzy
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Egység kategória"
+
+#, fuzzy
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr ""
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+#, fuzzy
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Tizedes vessző utáni számjegy"
+
+#, fuzzy
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "Egység"
+
+#, fuzzy
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Egység kategória"
+
+#, fuzzy
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+#, fuzzy
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Tizedes vessző utáni számjegy"
+
+#, fuzzy
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "Egység"
+
+#, fuzzy
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Egység kategória"
+
+#, fuzzy
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Alárendelt (modul)"
+
+#, fuzzy
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+#, fuzzy
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Tizedes vessző utáni számjegy"
+
+#, fuzzy
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "Egység"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Kategória"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Tizedes vessző utáni számjegy"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Egység"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Társaság"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Termelés"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Termelés"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Termelés"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr ""
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Termelés"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Beállítások"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Termelés"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "Összes"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Termelés"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Termelés"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Beállítások"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Termelés"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Termelés"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Beállítások"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Termelés"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Termelés"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr ""
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr ""
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Production Configuration"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Termelés"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Termelés"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Termelés"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Mégse"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Kész"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Termelés"
+
+#, fuzzy
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Sor"
+
+#, fuzzy
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Sor"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Mégse"
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "OK"
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Bezár"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr ""
diff --git a/modules/production/locale/id.po b/modules/production/locale/id.po
new file mode 100644
index 0000000000..636c7adafc
--- /dev/null
+++ b/modules/production/locale/id.po
@@ -0,0 +1,585 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Lokasi"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr ""
+
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Referensi"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr ""
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr ""
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr ""
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr ""
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Produksi"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Produksi"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Produksi"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr ""
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Produksi"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Produksi"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Produksi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Produksi"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Produksi"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr ""
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr ""
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr ""
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr ""
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr ""
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Produksi"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Produksi"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Produksi"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Dibatalkan"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Baris"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Baris"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Info Lain"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Tutup"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr ""
diff --git a/modules/production/locale/it.po b/modules/production/locale/it.po
new file mode 100644
index 0000000000..5e85cdb779
--- /dev/null
+++ b/modules/production/locale/it.po
@@ -0,0 +1,602 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "Distinte materiali"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "Tempi di consegna"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "Producible"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "Distinta materiali"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "Producible"
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assegnato"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "Distinta materiali"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Costo"
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Fatto"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Data Registrazione"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Data Iniziale Effettiva"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Inputs"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Luogo"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Numero"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Risultati"
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assegnato"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Data prevista"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Data di inizio pianificata"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Riferimento"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Cifre unità"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria UdM"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+#, fuzzy
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Inputs"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Prodotti in uscita"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Risultati"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "Distinta materiali"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+#, fuzzy
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Posizioni Unità"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "Udm"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria UdM"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "Distinta materiali"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+#, fuzzy
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Posizioni Unità"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria UdM"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Figli"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+#, fuzzy
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Posizioni Unità"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "Udm"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "Distinta materiali"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Posizioni Unità"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Unità"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Albero distinta materiali"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Sequenza Produzione"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Sequenza Produzione"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "Distinta materiali"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Tempi di Consegna"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Produzione"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Uscita produzione"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Produzione"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Ingresso produzione"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Uscita produzione"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "Distinta materiali"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "Distinte materiali"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "Distinte materiali"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "Albero distinta componenti"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assegnato"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assegnato"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "In funzione"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "In attesa"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+"I prodotti possono solo essere presenti una sola volta su ciascuna distinta "
+"materiali."
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+"Non è possibile creare una distinta materiali ricorsiva per il prodotto "
+"\"%(product)s\"."
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assegna"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Fatto"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Ripristina distinta materiali"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr "Utente in azienda"
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "Distinte materiali"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Produzione"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Produzioni"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Produzioni"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Prodotto - distinta materiali"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Produzione"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Distinta materiali"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Immissione della distinta materiali"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Emissione distinta materiali"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Albero distinta componenti"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Apri l'albero della distinta materiali"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Apri l'albero della distinta materiali"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Configurazione della produzione"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "Configurazione Sequenza Produzione"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "Tempi di consegna produzione"
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Produzione"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Amministrazione della produzione"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Produzione"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Productions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Assegnato"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Fatto"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Richiesta"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "In funzione"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "In attesa"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Produzione"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Linee"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Linee"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Altre Info"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Chiudi"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "Cambia"
diff --git a/modules/production/locale/lo.po b/modules/production/locale/lo.po
new file mode 100644
index 0000000000..f5ab34e4af
--- /dev/null
+++ b/modules/production/locale/lo.po
@@ -0,0 +1,649 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "ວັນທີມີຜົນ"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "ສະຖານທີ່"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "ເອກະສານອ້າງອີງ"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "ຫົວໜ່ວຍເສດ"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "ຫົວໜ່ວຍ"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "ໝວດຫົວໜ່ວຍ"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr ""
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "ຫົວໜ່ວຍເສດ"
+
+#, fuzzy
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "ຫົວໜ່ວຍ"
+
+#, fuzzy
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "ໝວດຫົວໜ່ວຍ"
+
+#, fuzzy
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "ຫົວໜ່ວຍເສດ"
+
+#, fuzzy
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "ຫົວໜ່ວຍ"
+
+#, fuzzy
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "ໝວດຫົວໜ່ວຍ"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "ຫົວໜ່ວຍເສດ"
+
+#, fuzzy
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "ຫົວໜ່ວຍ"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "ໝວດ"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "ຫົວໜ່ວຍເສດ"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "ໜ່ວຍ"
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr ""
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "ການຕັ້ງຄ່າ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "ກຳລັງດຳເນີນງານ"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "ການຕັ້ງຄ່າ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "ການຕັ້ງຄ່າ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr ""
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr ""
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Production Configuration"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກແລ້ວ"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "ກຳລັງດຳເນີນງານ"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "ຮ່ວງ"
+
+#, fuzzy
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "ຮ່ວງ"
+
+#, fuzzy
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "ຂໍ້ມູນອື່ນໆ"
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "ຍົກເລີກ"
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "ຕົກລົງ"
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "ອັດ"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr ""
diff --git a/modules/production/locale/lt.po b/modules/production/locale/lt.po
new file mode 100644
index 0000000000..bfc0176a18
--- /dev/null
+++ b/modules/production/locale/lt.po
@@ -0,0 +1,611 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Faktinė data"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Faktinė pradžios data"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Planuojama pradžios data"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr ""
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr ""
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Production"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr ""
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr ""
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr ""
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Production Configuration"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Productions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr ""
diff --git a/modules/production/locale/nl.po b/modules/production/locale/nl.po
new file mode 100644
index 0000000000..433efc3e83
--- /dev/null
+++ b/modules/production/locale/nl.po
@@ -0,0 +1,587 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "stuklijsten"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "Doorlooptijd"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "produceerbaar"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "stuklijst"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "produceerbaar"
+
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Toegewezen door"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "stuklijst"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Gedaan door"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Effectieve datum"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Effectieve startdatum"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Invoer"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Plaats"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr "Oorsprong"
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "uitgang (output)"
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "toegewezen"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Geplande datum"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Geplande startdatum"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr "Uitgevoerd door"
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalen eenheid"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "maateenheid"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "maateenheid categorie"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Invoer"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Gegenereerde producten"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "uitgang (output)"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "stuklijst"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalen eenheid"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "meeteenheid"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "maateenheid categorie"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "stuklijst"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalen eenheid"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "maateenheid"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "maateenheid categorie"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "onderliggen niveau (child)"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalen eenheid"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "maateenheid"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "stuklijst"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalen eenheid"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "stuklijst boom structuur"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Productiereeks"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Productiereeks"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "stuklijst"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Doorlooptijd"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Productie output"
+
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Productie picking"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr "Kostprijs bijgewerkt"
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Productie-invoer"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Productie output"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+"Waar de gemaakte goederen worden opgeslagen.\n"
+"Laat leeg om de opslaglocatie van het magazijn te gebruiken."
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+"Waar de productiecomponenten vandaan worden gehaald.\n"
+"Laat leeg om de opslaglocatie van het magazijn te gebruiken."
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "stuklijst"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "stuklijsten"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "stuklijsten"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Producties"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Producties"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "stuklijst boom structuur"
+
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Wijs productie toe"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "Als Input"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "Als Outputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "toegewezen"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "toegewezen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "verzoeken"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "in uitvoering"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr "Producten kunnen slechts eenmaal op elke stuklijst verschijnen."
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr "U kunt geen recursieve stuklijst maken voor product \"%(product)s\"."
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr "Weet je zeker dat je de productie wilt voltooien?"
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Toewijzen"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Terugzetten naar stuklijst"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "uitvoeren"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "wachten"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "stuklijsten"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Producties"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Producties"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Product - stocklijst"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Stuklijst"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Stuklijst invoer"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Stuklijst output"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "stuklijst boom structuur"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Open boomstructuur stuklijst"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Open boomstructuur stuklijst"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Productie configuratie"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "Productieconfiguratie Productievolgorde"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "Productie doorlooptijd"
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Productie administratie"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Productie"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Wijs productie toe"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Productions opnieuw plannen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr "Stel kosten in van beweging"
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "toegewezen"
+
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Verzoek"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "in uitvoering"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Regels"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Regels"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Aanvullende informatie"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "Ok"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Sluiten"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "wijzigen"
diff --git a/modules/production/locale/pl.po b/modules/production/locale/pl.po
new file mode 100644
index 0000000000..655bd95815
--- /dev/null
+++ b/modules/production/locale/pl.po
@@ -0,0 +1,617 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "BOMy"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigned"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Koszt"
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Wejścia"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Lokalizacja"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Wyjścia"
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Data planowana"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Zaplanowana data rozpoczęcia"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Referencja"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "Jm"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Kategoria jednostki miary"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Wejścia"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr ""
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Wyjścia"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "Jm"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Kategoria jednostki miary"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "Jm"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Kategoria jednostki miary"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Elementy podrzędne"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "Jm"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Kategoria"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Jednostka"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Drzewo BOM"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Sekwencja produkcji"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Sekwencja produkcji"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Produkcja"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Produkcja"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Produkcja"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr ""
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Produkt - BOM"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Produkcja"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Wielopoziomowa struktura produktu (BOM)"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr ""
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr ""
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Drzewo BOM"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Otwórz drzewo BOM"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Otwórz drzewo BOM"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Konfiguracja produkcji"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Productions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Przydzielono"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Requests"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Uruchomione"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Produkcja"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Inne informacje"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Anuluj"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Zamknij"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr ""
diff --git a/modules/production/locale/pt.po b/modules/production/locale/pt.po
new file mode 100644
index 0000000000..443c0c3c33
--- /dev/null
+++ b/modules/production/locale/pt.po
@@ -0,0 +1,590 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "Listas de Materiais"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "Tempo de Espera"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "Produzível"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "Lista de Materiais"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "Produzível"
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Atribuído"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "Lista de materiais"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Custo"
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Data efetiva"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Data Efetiva de Início"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Entradas"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Localização"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Saídas"
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Atribuído"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Data planejada"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Data Planejada para Início"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Referência"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos da unidade"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "Uom"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria da UDM"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Entradas"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Entradas"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Produtos de saída"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "Lista de materiais"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos da unidade"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "Uom"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria da UDM"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "Lista de Materiais"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos da unidade"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "Uom"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria da UDM"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Filhos"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos da unidade"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "Uom"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "Lista de materiais"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos da unidade"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Unidade"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Listagem da lista de materiais"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Sequência de produção"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Sequência de Produção"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "Lista de Materiais"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Tempo de Espera"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Produção"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Saída da produção"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Produção"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Entrada da produção"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Saída da produção"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "Lista de Materiais"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "Listas de Materiais"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "Listas de Materiais"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Produções"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configuração"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Produções"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "Listagem da lista de materiais"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Atribuir Produção"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "Como Entradas"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "Como Saídas"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "Todos"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Atribuído"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Atribuído"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Solicitações"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Executando"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Esperando"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Produção"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Produção"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "Listas de Materiais"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuração"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Produção"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Produções"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configuração"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Produções"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Produto - Lista de materiais"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Produção"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Lista de materiais"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Entrada da lista de materiais"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Reservar produções"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Saída da lista de materiais"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Abrir listagem da lista de materiais"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Abrir listagem da lista de materiais"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Configuração de produção"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "Configuração de Produção Sequência de Produção"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "Tempo de Espera da Produção"
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Produção"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Administração de Produção"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Produção"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Atribuir Produção"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Produções"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Atribuído"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Solicitação"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Em execução"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Espera"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Produção"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Linhas"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Reservado"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Informação adicional"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Fechar"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "OK"
diff --git a/modules/production/locale/ro.po b/modules/production/locale/ro.po
new file mode 100644
index 0000000000..fa34cf5b2f
--- /dev/null
+++ b/modules/production/locale/ro.po
@@ -0,0 +1,584 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr "Origine"
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr ""
+
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Referinţă"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr ""
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr ""
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr ""
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr ""
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Produs"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Produs"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr ""
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configurare"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Produs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configurare"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configurație"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr ""
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr ""
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr ""
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr ""
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr ""
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr ""
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr ""
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Produs"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Produs"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Produs"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr ""
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr ""
diff --git a/modules/production/locale/ru.po b/modules/production/locale/ru.po
new file mode 100644
index 0000000000..eb8cbb70e0
--- /dev/null
+++ b/modules/production/locale/ru.po
@@ -0,0 +1,617 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "Спецификации"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigned"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Стоимость"
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Учетная дата"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Исходные"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Местоположение"
+
+#, fuzzy
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Продукция"
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Плановая дата"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Ссылка"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Состояние"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Кол-во цифр после запятой"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "Ед.изм."
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Категория ед. измерения"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Исходные"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Готовая продукция"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Продукция"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Кол-во цифр после запятой"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "Ед.изм."
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Категория ед. измерения"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Кол-во цифр после запятой"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "Ед.изм."
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Категория ед. измерения"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Подчиненные"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Кол-во цифр после запятой"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "Ед.изм."
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Категория"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Кол-во цифр после запятой"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Единица измерения"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Дерево спецификации"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Нумерация производства"
+
+#, fuzzy
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Организация"
+
+#, fuzzy
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Нумерация производства"
+
+#, fuzzy
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Производство"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Готовая продукция производства"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Производство"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Исходные для производства"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Готовая продукция производства"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "Спецификации"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Производства"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Производства"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Продукция - Спецификация"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Производство"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Спецификация"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Спецификация, исходные"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Спецификация, продукция"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Дерево спецификации"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Открыть дерево спецификации"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Открыть дерево спецификации"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Конфигурация производства"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Производства"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Переданный"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Отменено"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Сообщение"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Выполняется"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Ожидание"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Производство"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Строки"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Строки"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Другая информация"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Отменить"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "Ок"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Закрыть"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "Изменить"
diff --git a/modules/production/locale/sl.po b/modules/production/locale/sl.po
new file mode 100644
index 0000000000..c4d705c02c
--- /dev/null
+++ b/modules/production/locale/sl.po
@@ -0,0 +1,614 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "Kosovnice"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "Dobavni roki"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "Se proizvaja"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "Kosovnica"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "Se proizvaja"
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigned"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "Kosovnica"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Strošek"
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Dejanski datum"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Dejanski začetek"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Vhodi"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Lokacija"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Izhodi"
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Načrtovan datum"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Planirano od"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Sklic"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalke"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "ME"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Kategorija ME"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Vhodi"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Izhodni izdelki"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Izhodi"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "Kosovnica"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalke"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "ME"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Kategorija ME"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "Kosovnica"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalke"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "ME"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Kategorija ME"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Podrejeni"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalke"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "ME"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "Kosovnica"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Kategorija"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalke"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "enota"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "Drevo kosovnice"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Proizvodni nalog"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Štetje proizvodnih nalogov"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "Kosovnica"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Dobavni rok"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Proizvodnja"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Izhod proizvodnega naloga"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Proizvodnja"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Vhod proizvodnega naloga"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Izhod proizvodnega naloga"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Izdelek - Kosovnica"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Proizvodni nalog"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "Kosovnica"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "Vhod kosovnice"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "Izhod kosovnice"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "Drevo kosovnice"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "Odpri drevo kosovnice"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "Odpri drevo kosovnice"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Proizvodna konfiguracija"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "Konfiguracija štetja proizvodnih nalogov"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "Proizvodni dobavni rok"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Productions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Dodeljeno"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Zahtevek"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Tekoče"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Čakajoče"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Proizvodnja"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Postavke"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Postavke"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Drugo"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Prekliči"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "V redu"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Zapri"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "Spremeni"
diff --git a/modules/production/locale/tr.po b/modules/production/locale/tr.po
new file mode 100644
index 0000000000..2b103a6ba2
--- /dev/null
+++ b/modules/production/locale/tr.po
@@ -0,0 +1,613 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "BOMlar"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr "Tedarik Süreleri"
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr "Üretilebilir"
+
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr "Ürün"
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr "Üretilebilir"
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigned"
+
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr "Şirket"
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr "Maliyet"
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr "Yürürlük Tarihi"
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Yürürlük Başlangıç Tarihi"
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr "Girdiler"
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr "Lokasyon"
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr "Sayı"
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr "Çıktılar"
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr "Planlanan Tarih"
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Planlanan Başlangıç Tarihi"
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr "Ürün"
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr "Miktar"
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr "Referans"
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "Durum"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr "Birim Sayı Basamakları"
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr "Ölçü Birimi"
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr "Ölçü Birimi Kategorisi"
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr "Depo"
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr "Girdiler"
+
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "Ad"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr "Çıktı Ürünler"
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr "Çıktılar"
+
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr "Ürün"
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr "Miktar"
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr "Birim Sayı Basamakları"
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr "Ölçü Birimi"
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr "Ölçü Birimi Kategorisi"
+
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr "Ürün"
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr "Miktar"
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr "Birim Sayı Basamakları"
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr "Ölçü Birimi"
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr "Ölçü Birimi Kategorisi"
+
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "Alt Elemanlar"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr "Ürün"
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr "Miktar"
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr "Birim Sayı Basamakları"
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr "Ölçü Birimi"
+
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr "Ürün"
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr "Miktar"
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Birim Sayı Basamakları"
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr "Birim"
+
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "BOM Ağacı"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr "Ürün Sırası"
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr "Şirket"
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr "Ürün Sırası"
+
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Tedarik Süresi"
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr "Ürün"
+
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Ürün"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Ürün Çıktısı"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Ürün"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr "Ürün Girdisi"
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr "Ürün Çıktısı"
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr "Ürün - BOM"
+
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Üretim"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr "BOM"
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr "bOM Girdi"
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr "BOM Çıktı"
+
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "BOM Ağacı"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr "BOM Ağacı Aç"
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr "BOM Ağacı"
+
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Üretim Konfigurasyon"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr "Üretim Konfigurasyon Üretim Sırası"
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr "Üretim Tedarik Sırası"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Productions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Atanmış"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "Vazgeçilmiş"
+
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "Yapılmış"
+
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Taslak"
+
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Talep"
+
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Çalışan"
+
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Bekleyen"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Ürün"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr "Hatlar"
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr "Hatlar"
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr "Diğer Bilgi"
+
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "Vazgeç"
+
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "Tamam"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "Kapat"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr "Değiştir"
diff --git a/modules/production/locale/zh_CN.po b/modules/production/locale/zh_CN.po
new file mode 100644
index 0000000000..b3c636a785
--- /dev/null
+++ b/modules/production/locale/zh_CN.po
@@ -0,0 +1,616 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,boms:"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "field:product.product,lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:product.product,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:product.product-production.bom,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.template,producible:"
+msgid "Producible"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:production,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production,cost:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,done_by:"
+msgid "Done By"
+msgstr "Done"
+
+msgctxt "field:production,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:production,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:production,inputs:"
+msgid "Inputs"
+msgstr ""
+
+msgctxt "field:production,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:production,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:production,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:production,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:production,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:production,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:production,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:production,run_by:"
+msgid "Run By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:production,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "field:production,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.bom,inputs:"
+msgid "Inputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom,name:"
+msgid "Name"
+msgstr "纳木"
+
+msgctxt "field:production.bom,output_products:"
+msgid "Output Products"
+msgstr ""
+
+msgctxt "field:production.bom,outputs:"
+msgid "Outputs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.input,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.input,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.input,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.input,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.input,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.output,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.output,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.output,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.output,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.bom.output,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.tree,childs:"
+msgid "Childs"
+msgstr "子项"
+
+msgctxt "field:production.bom.tree,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.tree,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree,uom:"
+msgid "Uom"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.start,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.bom.tree.open.start,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.bom.tree.open.start,uom:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.bom.tree.open.tree,bom_tree:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "field:production.configuration,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+msgctxt "field:production.configuration.production_sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:production.configuration.production_sequence,production_sequence:"
+msgid "Production Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.lead_time,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:production.lead_time,product:"
+msgid "Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,production_location:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "field:stock.location,production_output_location:"
+msgid "Production Output"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "field:stock.location,production_picking_location:"
+msgid "Production Picking"
+msgstr "Production"
+
+msgctxt "field:stock.move,production_cost_price_updated:"
+msgid "Cost Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,production_input:"
+msgid "Production Input"
+msgstr ""
+
+msgctxt "field:stock.move,production_output:"
+msgid "Production Output"
+msgstr ""
+
+msgctxt "help:stock.location,production_output_location:"
+msgid ""
+"Where the produced goods are stored.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "help:stock.location,production_picking_location:"
+msgid ""
+"Where the production components are picked from.\n"
+"Leave empty to use the warehouse storage location."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_bom_form"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "model:ir.action,name:act_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_product_in_bom"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.action,name:act_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_production_configuration_form"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.action,name:act_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:ir.action,name:wizard_bom_tree_open"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_production_assign"
+msgid "Assign Production"
+msgstr "Assign Production"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_input"
+msgid "As Inputs"
+msgstr "As Inputs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_product_in_bom_output_domain_output"
+msgid "As Outputs"
+msgstr "As Outputs"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_all"
+msgid "All"
+msgstr "全部"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_production_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_product_bom_unique"
+msgid "Products can only appear once on each BOM."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recursive_bom"
+msgid "You cannot create a recursive BOM for product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:production_done_button"
+msgid "Are you sure you want to complete the production?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:production_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:production_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:production_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:production_reset_bom_button"
+msgid "Reset to BOM"
+msgstr "Reset to BOM"
+
+msgctxt "model:ir.model.button,string:production_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:production_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_production_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_bom_list"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.ui.menu,name:menu_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:ir.ui.menu,name:menu_production_calendar"
+msgid "Productions"
+msgstr "Productions"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_production_configuration"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.ui.menu,name:menu_production_list"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:product.product-production.bom,name:"
+msgid "Product - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production,name:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:production.bom,name:"
+msgid "Bill of Material"
+msgstr ""
+
+msgctxt "model:production.bom.input,name:"
+msgid "Bill of Material Input"
+msgstr ""
+
+msgctxt "model:production.bom.output,name:"
+msgid "Bill of Material Output"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.bom.tree,name:"
+msgid "BOM Tree"
+msgstr "BOM Tree"
+
+msgctxt "model:production.bom.tree.open.start,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+msgctxt "model:production.bom.tree.open.tree,name:"
+msgid "Open BOM Tree"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.configuration,name:"
+msgid "Production Configuration"
+msgstr "Production Configuration"
+
+msgctxt "model:production.configuration.production_sequence,name:"
+msgid "Production Configuration Production Sequence"
+msgstr ""
+
+msgctxt "model:production.lead_time,name:"
+msgid "Production Lead Time"
+msgstr ""
+
+msgctxt "model:res.group,name:group_production"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "model:res.group,name:group_production_admin"
+msgid "Production Administration"
+msgstr "Production Administration"
+
+msgctxt "model:stock.location,name:location_production"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Productions"
+msgstr "Assign Production"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Productions"
+msgstr "Productions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Set Cost from Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Cancelled"
+msgstr "取消"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Done"
+msgstr "完成"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "selection:production,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "view:production.bom:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "view:production:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,start,end:"
+msgid "Cancel"
+msgstr "取消"
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,start,tree:"
+msgid "OK"
+msgstr "确定"
+
+#, fuzzy
+msgctxt "wizard_button:production.bom.tree.open,tree,end:"
+msgid "Close"
+msgstr "关闭"
+
+msgctxt "wizard_button:production.bom.tree.open,tree,start:"
+msgid "Change"
+msgstr ""
diff --git a/modules/production/message.xml b/modules/production/message.xml
new file mode 100644
index 0000000000..f97efb1310
--- /dev/null
+++ b/modules/production/message.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ You cannot create a recursive BOM for product "%(product)s".
+
+
+ Products can only appear once on each BOM.
+
+
+
diff --git a/modules/production/product.py b/modules/production/product.py
new file mode 100644
index 0000000000..38f716a987
--- /dev/null
+++ b/modules/production/product.py
@@ -0,0 +1,127 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.i18n import gettext
+from trytond.model import ModelView, ModelSQL, MatchMixin, fields, \
+ sequence_ordered
+from trytond.model.exceptions import RecursionError
+from trytond.pyson import Eval, Get, If, Bool
+from trytond.pool import PoolMeta
+
+
+class Template(metaclass=PoolMeta):
+ __name__ = 'product.template'
+ producible = fields.Boolean("Producible")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.producible.states = {
+ 'invisible': ~Eval('type').in_(cls.get_producible_types()),
+ }
+ cls.producible.depends = ['type']
+
+ @classmethod
+ def get_producible_types(cls):
+ return ['goods', 'assets']
+
+ @classmethod
+ def view_attributes(cls):
+ return super().view_attributes() + [
+ ('//page[@id="production"]', 'states', {
+ 'invisible': ~Eval('producible'),
+ })]
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
+
+ boms = fields.One2Many('product.product-production.bom', 'product',
+ 'BOMs', order=[('sequence', 'ASC'), ('id', 'ASC')],
+ states={
+ 'invisible': ~Eval('producible')
+ },
+ depends=['producible'])
+ lead_times = fields.One2Many('production.lead_time',
+ 'product', 'Lead Times', order=[('sequence', 'ASC'), ('id', 'ASC')],
+ states={
+ 'invisible': ~Eval('producible'),
+ },
+ depends=['producible'])
+
+ @classmethod
+ def validate(cls, products):
+ super(Product, cls).validate(products)
+ for product in products:
+ product.check_bom_recursion()
+
+ def check_bom_recursion(self, product=None):
+ '''
+ Check BOM recursion
+ '''
+ if product is None:
+ product = self
+ for product_bom in self.boms:
+ for input_ in product_bom.bom.inputs:
+ if (input_.product == product
+ or input_.product.check_bom_recursion(
+ product=product)):
+ raise RecursionError(
+ gettext('production.msg_recursive_bom',
+ product=product.rec_name))
+
+ @classmethod
+ def copy(cls, products, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('boms', None)
+ return super(Product, cls).copy(products, default=default)
+
+
+class ProductBom(sequence_ordered(), ModelSQL, ModelView):
+ 'Product - BOM'
+ __name__ = 'product.product-production.bom'
+
+ product = fields.Many2One('product.product', 'Product',
+ ondelete='CASCADE', select=1, required=True,
+ domain=[
+ ('producible', '=', True),
+ ])
+ bom = fields.Many2One('production.bom', 'BOM', ondelete='CASCADE',
+ select=1, required=True, domain=[
+ ('output_products', '=', If(Bool(Eval('product')),
+ Eval('product', 0),
+ Get(Eval('_parent_product', {}), 'id', 0))),
+ ], depends=['product'])
+
+ def get_rec_name(self, name):
+ return self.bom.rec_name
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return [('bom.rec_name',) + tuple(clause[1:])]
+
+
+class ProductionLeadTime(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
+ 'Production Lead Time'
+ __name__ = 'production.lead_time'
+
+ product = fields.Many2One('product.product', 'Product',
+ ondelete='CASCADE', select=True, required=True,
+ domain=[
+ ('producible', '=', True),
+ ])
+ bom = fields.Many2One('production.bom', 'BOM', ondelete='CASCADE',
+ domain=[
+ ('output_products', '=', If(Bool(Eval('product')),
+ Eval('product', -1),
+ Get(Eval('_parent_product', {}), 'id', 0))),
+ ],
+ depends=['product'])
+ lead_time = fields.TimeDelta('Lead Time')
+
+ @classmethod
+ def __setup__(cls):
+ super(ProductionLeadTime, cls).__setup__()
+ cls._order.insert(0, ('product', 'ASC'))
diff --git a/modules/production/product.xml b/modules/production/product.xml
new file mode 100644
index 0000000000..93c6d91c3e
--- /dev/null
+++ b/modules/production/product.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+ product.product-production.bom
+ tree
+ product_bom_list
+
+
+
+ product.product-production.bom
+ tree
+ product_bom_list_sequence
+
+
+
+ product.product-production.bom
+ form
+ product_bom_form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ product.template
+
+ template_form
+
+
+
+ product.template
+
+ template_list
+
+
+
+ product.product
+
+ product_form
+
+
+
+ production.lead_time
+ tree
+ production_lead_time_list
+
+
+
+ production.lead_time
+ tree
+ production_lead_time_list_sequence
+
+
+
+ production.lead_time
+ form
+ production_lead_time_form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/production/production.py b/modules/production/production.py
new file mode 100644
index 0000000000..39fc41d192
--- /dev/null
+++ b/modules/production/production.py
@@ -0,0 +1,811 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from collections import defaultdict
+from datetime import timedelta
+from decimal import Decimal
+from itertools import chain
+
+from sql import Null
+from sql.conditionals import Coalesce
+
+from trytond.model import ModelView, ModelSQL, Workflow, fields, dualmethod
+from trytond.pyson import Eval, Bool, If
+from trytond.pool import Pool
+from trytond.transaction import Transaction
+
+from trytond.modules.company.model import employee_field, set_employee
+from trytond.modules.product import price_digits, round_price
+from trytond.modules.stock.shipment import ShipmentAssignMixin
+
+BOM_CHANGES = ['bom', 'product', 'quantity', 'uom', 'warehouse', 'location',
+ 'company', 'inputs', 'outputs']
+
+
+class Production(ShipmentAssignMixin, Workflow, ModelSQL, ModelView):
+ "Production"
+ __name__ = 'production'
+ _assign_moves_field = 'inputs'
+
+ number = fields.Char('Number', select=True, readonly=True)
+ reference = fields.Char('Reference', select=1,
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ },
+ depends=['state'])
+ planned_date = fields.Date('Planned Date',
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ },
+ depends=['state'])
+ effective_date = fields.Date('Effective Date',
+ states={
+ 'readonly': Eval('state').in_(['cancelled', 'done']),
+ },
+ depends=['state'])
+ planned_start_date = fields.Date('Planned Start Date',
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ 'required': Bool(Eval('planned_date')),
+ },
+ depends=['state', 'planned_date'])
+ effective_start_date = fields.Date('Effective Start Date',
+ states={
+ 'readonly': Eval('state').in_(['cancelled', 'running', 'done']),
+ },
+ depends=['state'])
+ company = fields.Many2One('company.company', 'Company', required=True,
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ },
+ depends=['state'])
+ warehouse = fields.Many2One('stock.location', 'Warehouse', required=True,
+ domain=[
+ ('type', '=', 'warehouse'),
+ ],
+ states={
+ 'readonly': (~Eval('state').in_(['request', 'draft'])
+ | Eval('inputs', [-1]) | Eval('outputs', [-1])),
+ },
+ depends=['state'])
+ location = fields.Many2One('stock.location', 'Location', required=True,
+ domain=[
+ ('type', '=', 'production'),
+ ],
+ states={
+ 'readonly': (~Eval('state').in_(['request', 'draft'])
+ | Eval('inputs', [-1]) | Eval('outputs', [-1])),
+ },
+ depends=['state'])
+ product = fields.Many2One('product.product', 'Product',
+ domain=[
+ ('producible', '=', True),
+ ],
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ },
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends=['company'])
+ bom = fields.Many2One('production.bom', 'BOM',
+ domain=[
+ ('output_products', '=', Eval('product', 0)),
+ ],
+ states={
+ 'readonly': (~Eval('state').in_(['request', 'draft'])
+ | ~Eval('warehouse', 0) | ~Eval('location', 0)),
+ 'invisible': ~Eval('product'),
+ },
+ depends=['product'])
+ uom_category = fields.Function(fields.Many2One(
+ 'product.uom.category', 'Uom Category'),
+ 'on_change_with_uom_category')
+ uom = fields.Many2One('product.uom', 'Uom',
+ domain=[
+ ('category', '=', Eval('uom_category')),
+ ],
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ 'required': Bool(Eval('bom')),
+ 'invisible': ~Eval('product'),
+ },
+ depends=['uom_category'])
+ unit_digits = fields.Function(fields.Integer('Unit Digits'),
+ 'on_change_with_unit_digits')
+ quantity = fields.Float('Quantity',
+ digits=(16, Eval('unit_digits', 2)),
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ 'required': Bool(Eval('bom')),
+ 'invisible': ~Eval('product'),
+ },
+ depends=['unit_digits'])
+ cost = fields.Function(fields.Numeric('Cost', digits=price_digits,
+ readonly=True), 'get_cost')
+ inputs = fields.One2Many('stock.move', 'production_input', 'Inputs',
+ domain=[
+ ('shipment', '=', None),
+ ('from_location', 'child_of', [Eval('warehouse')], 'parent'),
+ ('to_location', '=', Eval('location')),
+ ('company', '=', Eval('company', -1)),
+ ],
+ states={
+ 'readonly': (~Eval('state').in_(['request', 'draft', 'waiting'])
+ | ~Eval('warehouse') | ~Eval('location')),
+ },
+ depends=['warehouse', 'location', 'company'])
+ outputs = fields.One2Many('stock.move', 'production_output', 'Outputs',
+ domain=[
+ ('shipment', '=', None),
+ ('from_location', '=', Eval('location')),
+ ['OR',
+ ('to_location', 'child_of', [Eval('warehouse')], 'parent'),
+ ('to_location.waste_warehouses', '=', Eval('warehouse')),
+ ],
+ ('company', '=', Eval('company', -1)),
+ ],
+ states={
+ 'readonly': (Eval('state').in_(['done', 'cancelled'])
+ | ~Eval('warehouse') | ~Eval('location')),
+ },
+ depends=['warehouse', 'location', 'company'])
+
+ assigned_by = employee_field("Assigned By")
+ run_by = employee_field("Run By")
+ done_by = employee_field("Done By")
+ state = fields.Selection([
+ ('request', 'Request'),
+ ('draft', 'Draft'),
+ ('waiting', 'Waiting'),
+ ('assigned', 'Assigned'),
+ ('running', 'Running'),
+ ('done', 'Done'),
+ ('cancelled', 'Cancelled'),
+ ], 'State', readonly=True)
+ origin = fields.Reference(
+ "Origin", selection='get_origin', select=True,
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ },
+ depends=['state'])
+
+ @classmethod
+ def __setup__(cls):
+ super(Production, cls).__setup__()
+ cls._order = [
+ ('effective_date', 'ASC NULLS LAST'),
+ ('id', 'ASC'),
+ ]
+ cls._transitions |= set((
+ ('request', 'draft'),
+ ('draft', 'waiting'),
+ ('waiting', 'assigned'),
+ ('assigned', 'running'),
+ ('running', 'done'),
+ ('running', 'waiting'),
+ ('assigned', 'waiting'),
+ ('waiting', 'waiting'),
+ ('waiting', 'draft'),
+ ('request', 'cancelled'),
+ ('draft', 'cancelled'),
+ ('waiting', 'cancelled'),
+ ('assigned', 'cancelled'),
+ ('cancelled', 'draft'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': ~Eval('state').in_(['request', 'draft',
+ 'assigned']),
+ 'depends': ['state'],
+ },
+ 'draft': {
+ 'invisible': ~Eval('state').in_(['request', 'waiting',
+ 'cancelled']),
+ 'icon': If(Eval('state') == 'cancelled',
+ 'tryton-clear',
+ If(Eval('state') == 'request',
+ 'tryton-forward',
+ 'tryton-back')),
+ 'depends': ['state'],
+ },
+ 'reset_bom': {
+ 'invisible': (~Eval('bom')
+ | ~Eval('state').in_(['request', 'draft', 'waiting'])),
+ 'depends': ['state', 'bom'],
+ },
+ 'wait': {
+ 'invisible': ~Eval('state').in_(['draft', 'assigned',
+ 'waiting', 'running']),
+ 'icon': If(Eval('state').in_(['assigned', 'running']),
+ 'tryton-back',
+ If(Eval('state') == 'waiting',
+ 'tryton-clear',
+ 'tryton-forward')),
+ 'depends': ['state'],
+ },
+ 'run': {
+ 'invisible': Eval('state') != 'assigned',
+ 'depends': ['state'],
+ },
+ 'done': {
+ 'invisible': Eval('state') != 'running',
+ 'depends': ['state'],
+ },
+ 'assign_wizard': {
+ 'invisible': Eval('state') != 'waiting',
+ 'depends': ['state'],
+ },
+ 'assign_try': {},
+ 'assign_force': {},
+ })
+
+ def get_rec_name(self, name):
+ items = []
+ if self.number:
+ items.append(self.number)
+ if self.reference:
+ items.append('[%s]' % self.reference)
+ if not items:
+ items.append('(%s)' % self.id)
+ return ' '.join(items)
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ if clause[1].startswith('!') or clause[1].startswith('not '):
+ bool_op = 'AND'
+ else:
+ bool_op = 'OR'
+ return [bool_op,
+ ('number',) + tuple(clause[1:]),
+ ('reference',) + tuple(clause[1:]),
+ ]
+
+ @classmethod
+ def __register__(cls, module_name):
+ table_h = cls.__table_handler__(module_name)
+ table = cls.__table__()
+
+ # Migration from 3.8: rename code into number
+ if table_h.column_exist('code'):
+ table_h.column_rename('code', 'number')
+
+ super(Production, cls).__register__(module_name)
+
+ # Migration from 4.0: fill planned_start_date
+ cursor = Transaction().connection.cursor()
+ cursor.execute(*table.update(
+ [table.planned_start_date],
+ [table.planned_date],
+ where=(table.planned_start_date == Null)
+ & (table.planned_date != Null)))
+
+ # Migration from 5.6: rename state cancel to cancelled
+ cursor.execute(*table.update(
+ [table.state], ['cancelled'],
+ where=table.state == 'cancel'))
+
+ @classmethod
+ def order_effective_date(cls, tables):
+ table, _ = tables[None]
+ return [Coalesce(
+ table.effective_start_date, table.effective_date,
+ table.planned_start_date, table.planned_date)]
+
+ @staticmethod
+ def default_state():
+ return 'draft'
+
+ @classmethod
+ def default_warehouse(cls):
+ Location = Pool().get('stock.location')
+ return Location.get_default_warehouse()
+
+ @classmethod
+ def default_location(cls):
+ Location = Pool().get('stock.location')
+ warehouse_id = cls.default_warehouse()
+ if warehouse_id:
+ warehouse = Location(warehouse_id)
+ return warehouse.production_location.id
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @fields.depends('product', 'bom')
+ def compute_lead_time(self, pattern=None):
+ if pattern is None:
+ pattern = {}
+ if self.product:
+ pattern.setdefault('bom', self.bom.id if self.bom else None)
+ for line in self.product.lead_times:
+ if line.match(pattern):
+ return line.lead_time or timedelta()
+ return timedelta()
+
+ @fields.depends('planned_date', methods=['compute_lead_time'])
+ def on_change_with_planned_start_date(self, pattern=None):
+ if self.planned_date and self.product:
+ return self.planned_date - self.compute_lead_time()
+ return self.planned_date
+
+ @fields.depends(
+ 'planned_date', 'planned_start_date', methods=['compute_lead_time'])
+ def on_change_planned_start_date(self, pattern=None):
+ if self.planned_start_date and self.product:
+ planned_date = self.planned_start_date + self.compute_lead_time()
+ if (not self.planned_date
+ or self.planned_date < planned_date):
+ self.planned_date = planned_date
+
+ @classmethod
+ def _get_origin(cls):
+ 'Return list of Model names for origin Reference'
+ return set()
+
+ @classmethod
+ def get_origin(cls):
+ Model = Pool().get('ir.model')
+ get_name = Model.get_name
+ models = cls._get_origin()
+ return [(None, '')] + [(m, get_name(m)) for m in models]
+
+ def _move(self, from_location, to_location, company, product, uom,
+ quantity):
+ Move = Pool().get('stock.move')
+ move = Move(
+ product=product,
+ uom=uom,
+ quantity=quantity,
+ from_location=from_location,
+ to_location=to_location,
+ company=company,
+ currency=company.currency if company else None,
+ state='draft',
+ )
+ return move
+
+ def _explode_move_values(self, from_location, to_location, company,
+ bom_io, quantity):
+ move = self._move(from_location, to_location, company,
+ bom_io.product, bom_io.uom, quantity)
+ move.from_location = from_location.id if from_location else None
+ move.to_location = to_location.id if to_location else None
+ move.unit_price_required = move.on_change_with_unit_price_required()
+ return move
+
+ @fields.depends(*BOM_CHANGES)
+ def explode_bom(self):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ if not (self.bom and self.product and self.uom):
+ return
+
+ factor = self.bom.compute_factor(self.product, self.quantity or 0,
+ self.uom)
+ inputs = []
+ for input_ in self.bom.inputs:
+ quantity = input_.compute_quantity(factor)
+ move = self._explode_move_values(
+ self.picking_location, self.location, self.company,
+ input_, quantity)
+ if move:
+ inputs.append(move)
+ quantity = Uom.compute_qty(input_.uom, quantity,
+ input_.product.default_uom, round=False)
+ self.inputs = inputs
+
+ outputs = []
+ for output in self.bom.outputs:
+ quantity = output.compute_quantity(factor)
+ move = self._explode_move_values(
+ self.location, self.output_location, self.company, output,
+ quantity)
+ if move:
+ move.unit_price = Decimal(0)
+ outputs.append(move)
+ self.outputs = outputs
+
+ @fields.depends('warehouse')
+ def on_change_warehouse(self):
+ self.location = None
+ if self.warehouse:
+ self.location = self.warehouse.production_location
+
+ @fields.depends('product', 'uom', methods=['explode_bom'])
+ def on_change_product(self):
+ if self.product:
+ category = self.product.default_uom.category
+ if not self.uom or self.uom.category != category:
+ self.uom = self.product.default_uom
+ self.unit_digits = self.product.default_uom.digits
+ else:
+ self.bom = None
+ self.uom = None
+ self.unit_digits = 2
+ self.explode_bom()
+
+ @fields.depends('product')
+ def on_change_with_uom_category(self, name=None):
+ if self.product:
+ return self.product.default_uom.category.id
+
+ @fields.depends('uom')
+ def on_change_with_unit_digits(self, name=None):
+ if self.uom:
+ return self.uom.digits
+ return 2
+
+ @fields.depends(methods=['explode_bom'])
+ def on_change_bom(self):
+ self.explode_bom()
+
+ @fields.depends(methods=['explode_bom'])
+ def on_change_uom(self):
+ self.explode_bom()
+
+ @fields.depends(methods=['explode_bom'])
+ def on_change_quantity(self):
+ self.explode_bom()
+
+ @ModelView.button_change(methods=['explode_bom'])
+ def reset_bom(self):
+ self.explode_bom()
+
+ def get_cost(self, name):
+ cost = Decimal(0)
+ for input_ in self.inputs:
+ if input_.cost_price is not None:
+ cost_price = input_.cost_price
+ else:
+ cost_price = input_.product.cost_price
+ cost += (Decimal(str(input_.internal_quantity)) * cost_price)
+ return round_price(cost)
+
+ @fields.depends('inputs')
+ def on_change_with_cost(self):
+ Uom = Pool().get('product.uom')
+
+ cost = Decimal(0)
+ if not self.inputs:
+ return cost
+
+ for input_ in self.inputs:
+ if (input_.product is None
+ or input_.uom is None
+ or input_.quantity is None):
+ continue
+ product = input_.product
+ quantity = Uom.compute_qty(input_.uom, input_.quantity,
+ product.default_uom)
+ cost += Decimal(str(quantity)) * product.cost_price
+ return cost
+
+ @dualmethod
+ def set_moves(cls, productions):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ to_save = []
+ for production in productions:
+ location = production.location
+ company = production.company
+
+ if not production.bom:
+ if production.product:
+ move = production._move(
+ location, production.output_location, company,
+ production.product, production.uom,
+ production.quantity)
+ if move:
+ move.production_output = production
+ move.unit_price = Decimal(0)
+ to_save.append(move)
+ continue
+
+ factor = production.bom.compute_factor(
+ production.product, production.quantity, production.uom)
+ for input_ in production.bom.inputs:
+ quantity = input_.compute_quantity(factor)
+ product = input_.product
+ move = production._move(
+ production.picking_location, location, company, product,
+ input_.uom, quantity)
+ if move:
+ move.production_input = production
+ to_save.append(move)
+
+ for output in production.bom.outputs:
+ quantity = output.compute_quantity(factor)
+ product = output.product
+ move = production._move(location, production.output_location,
+ company, product, output.uom, quantity)
+ if move:
+ move.production_output = production
+ move.unit_price = Decimal(0)
+ to_save.append(move)
+ Move.save(to_save)
+ cls._set_move_planned_date(productions)
+
+ @property
+ def _list_price_context(self):
+ return {
+ 'company': self.company.id,
+ }
+
+ @classmethod
+ def set_cost_from_moves(cls):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ productions = set()
+ moves = Move.search([
+ ('production_cost_price_updated', '=', True),
+ ('production_input', '!=', None),
+ ],
+ order=[('effective_date', 'ASC')])
+ for move in moves:
+ if move.production_input not in productions:
+ cls.__queue__.set_cost([move.production_input])
+ productions.add(move.production_input)
+ Move.write(moves, {'production_cost_price_updated': False})
+
+ @classmethod
+ def set_cost(cls, productions):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Move = pool.get('stock.move')
+
+ moves = []
+ for production in productions:
+ sum_ = Decimal(0)
+ prices = {}
+ cost = production.cost
+
+ input_quantities = defaultdict(Decimal)
+ input_costs = defaultdict(Decimal)
+ for input_ in production.inputs:
+ if input_.cost_price is not None:
+ cost_price = input_.cost_price
+ else:
+ cost_price = input_.product.cost_price
+ input_quantities[input_.product] += (
+ Decimal(str(input_.internal_quantity)))
+ input_costs[input_.product] += (
+ Decimal(str(input_.internal_quantity)) * cost_price)
+ outputs = []
+ for output in production.outputs:
+ if output.to_location.type == 'lost_found':
+ continue
+ product = output.product
+ if input_quantities.get(output.product):
+ cost_price = (
+ input_costs[product] / input_quantities[product])
+ unit_price = round_price(Uom.compute_price(
+ product.default_uom, cost_price, output.uom))
+ if output.unit_price != unit_price:
+ output.unit_price = unit_price
+ moves.append(output)
+ cost -= min(
+ unit_price * Decimal(str(output.quantity)), cost)
+ else:
+ outputs.append(output)
+
+ for output in outputs:
+ product = output.product
+ with Transaction().set_context(production._list_price_context):
+ list_price = product.list_price_used
+ product_price = (Decimal(str(output.quantity))
+ * Uom.compute_price(
+ product.default_uom, list_price, output.uom))
+ prices[output] = product_price
+ sum_ += product_price
+
+ if not sum_ and production.product:
+ prices.clear()
+ for output in outputs:
+ if output.product == production.product:
+ quantity = Uom.compute_qty(
+ output.uom, output.quantity,
+ output.product.default_uom, round=False)
+ quantity = Decimal(str(quantity))
+ prices[output] = quantity
+ sum_ += quantity
+
+ for output in outputs:
+ if sum_:
+ ratio = prices.get(output, 0) / sum_
+ else:
+ ratio = Decimal(1) / len(outputs)
+ if not output.quantity:
+ unit_price = Decimal(0)
+ else:
+ quantity = Decimal(str(output.quantity))
+ unit_price = round_price(cost * ratio / quantity)
+ if output.unit_price != unit_price:
+ output.unit_price = unit_price
+ moves.append(output)
+ Move.save(moves)
+
+ @classmethod
+ def create(cls, vlist):
+ Config = Pool().get('production.configuration')
+
+ vlist = [x.copy() for x in vlist]
+ config = Config(1)
+ default_company = cls.default_company()
+ for values in vlist:
+ if values.get('number') is None:
+ values['number'] = config.get_multivalue(
+ 'production_sequence',
+ company=values.get('company', default_company)).get()
+ productions = super(Production, cls).create(vlist)
+ for production in productions:
+ production._set_move_planned_date()
+ return productions
+
+ @classmethod
+ def write(cls, *args):
+ super(Production, cls).write(*args)
+ for production in sum(args[::2], []):
+ production._set_move_planned_date()
+
+ @classmethod
+ def copy(cls, productions, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('number', None)
+ default.setdefault('assigned_by')
+ default.setdefault('run_by')
+ default.setdefault('done_by')
+ return super(Production, cls).copy(productions, default=default)
+
+ def _get_move_planned_date(self):
+ "Return the planned dates for input and output moves"
+ return self.planned_start_date, self.planned_date
+
+ @dualmethod
+ def _set_move_planned_date(cls, productions):
+ "Set planned date of moves for the shipments"
+ pool = Pool()
+ Move = pool.get('stock.move')
+ to_write = []
+ for production in productions:
+ dates = production._get_move_planned_date()
+ input_date, output_date = dates
+ inputs = [m for m in production.inputs
+ if m.state not in ('assigned', 'done', 'cancelled')]
+ if inputs:
+ to_write.append(inputs)
+ to_write.append({
+ 'planned_date': input_date,
+ })
+ outputs = [m for m in production.outputs
+ if m.state not in ('assigned', 'done', 'cancelled')]
+ if outputs:
+ to_write.append(outputs)
+ to_write.append({
+ 'planned_date': output_date,
+ })
+ if to_write:
+ Move.write(*to_write)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, productions):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Move.cancel([m for p in productions
+ for m in p.inputs + p.outputs])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, productions):
+ pool = Pool()
+ Move = pool.get('stock.move')
+
+ to_draft, to_delete = [], []
+ for production in productions:
+ for move in chain(production.inputs, production.outputs):
+ if move.state != 'cancelled':
+ to_draft.append(move)
+ else:
+ to_delete.append(move)
+ Move.draft(to_draft)
+ Move.delete(to_delete)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('waiting')
+ def wait(cls, productions):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Move.draft([m for p in productions
+ for m in p.inputs + p.outputs])
+
+ @classmethod
+ @Workflow.transition('assigned')
+ @set_employee('assigned_by')
+ def assign(cls, productions):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Move.assign([m for p in productions for m in p.assign_moves])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('running')
+ @set_employee('run_by')
+ def run(cls, productions):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ Move.do([m for p in productions for m in p.inputs])
+ cls.write([p for p in productions if not p.effective_start_date], {
+ 'effective_start_date': Date.today(),
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @set_employee('done_by')
+ def done(cls, productions):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ cls.set_cost(productions)
+ Move.do([m for p in productions for m in p.outputs])
+ cls.write([p for p in productions if not p.effective_date], {
+ 'effective_date': Date.today(),
+ })
+
+ @classmethod
+ @ModelView.button_action('production.wizard_production_assign')
+ def assign_wizard(cls, productions):
+ pass
+
+ @dualmethod
+ @ModelView.button
+ def assign_try(cls, productions):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ if Move.assign_try(
+ [m for p in productions for m in p.assign_moves]):
+ cls.assign(productions)
+ return True
+ else:
+ return False
+
+ @classmethod
+ def _get_reschedule_domain(cls, date):
+ context = Transaction().context
+ return [
+ ('company', '=', context.get('company')),
+ ('state', '=', 'waiting'),
+ ('planned_start_date', '<', date),
+ ]
+
+ @classmethod
+ def reschedule(cls, date=None):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ if date is None:
+ date = Date.today()
+ productions = cls.search(cls._get_reschedule_domain(date))
+ for production in productions:
+ production.planned_start_date = date
+ production.on_change_planned_start_date()
+ cls.save(productions)
+
+ @property
+ def picking_location(self):
+ if self.warehouse:
+ return (self.warehouse.production_picking_location
+ or self.warehouse.storage_location)
+
+ @property
+ def output_location(self):
+ if self.warehouse:
+ return (self.warehouse.production_output_location
+ or self.warehouse.storage_location)
diff --git a/modules/production/production.xml b/modules/production/production.xml
new file mode 100644
index 0000000000..dafaa0affb
--- /dev/null
+++ b/modules/production/production.xml
@@ -0,0 +1,331 @@
+
+
+
+
+
+ Production
+
+
+
+
+
+
+
+ Production Administration
+
+
+
+
+
+
+
+
+ tryton-production
+ icons/tryton-production.svg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ production
+ tree
+ production_list
+
+
+
+ production
+ calendar
+ production_calendar
+
+
+
+ production
+ form
+ production_form
+
+
+
+ Productions
+ production
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Requests
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+
+ Waiting
+
+
+
+
+
+
+ Partially Assigned
+
+
+
+
+
+
+ Assigned
+
+
+
+
+
+
+ Running
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+ Productions
+ production
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Production
+
+
+
+
+
+
+
+
+
+
+
+ Production
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+
+
+
+
+
+
+
+
+ draft
+ Draft
+
+
+
+
+
+
+
+
+ wait
+ Wait
+
+
+
+
+
+
+
+
+ run
+ Run
+
+
+
+
+
+
+
+
+ done
+ Done
+ Are you sure you want to complete the production?
+
+
+
+
+
+
+
+
+ assign_try
+
+
+
+
+
+
+
+
+ assign_force
+
+
+
+
+
+
+
+
+ assign_wizard
+ Assign
+
+
+
+
+
+
+
+ reset_bom
+ Reset to BOM
+
+
+
+
+ Assign Production
+ stock.shipment.assign
+ production
+
+
+
+ production|set_cost_from_moves
+
+ days
+
+
+
diff --git a/modules/production/setup.py b/modules/production/setup.py
new file mode 100755
index 0000000000..160d1a6fd1
--- /dev/null
+++ b/modules/production/setup.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_production'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = ['python-sql >= 0.4']
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [get_require_version('proteus')]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module for production',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/production',
+ },
+ keywords='tryton production',
+ package_dir={'trytond.modules.production': '.'},
+ packages=(
+ ['trytond.modules.production']
+ + ['trytond.modules.production.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.production': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'tests/*.rst',
+ 'icons/*.svg']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ production = trytond.modules.production
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/production/stock.py b/modules/production/stock.py
new file mode 100644
index 0000000000..a7baefca3a
--- /dev/null
+++ b/modules/production/stock.py
@@ -0,0 +1,98 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import fields
+from trytond.pyson import Eval
+from trytond.pool import PoolMeta
+
+
+class Location(metaclass=PoolMeta):
+ __name__ = 'stock.location'
+ production_location = fields.Many2One('stock.location', 'Production',
+ states={
+ 'invisible': Eval('type') != 'warehouse',
+ 'required': Eval('type') == 'warehouse',
+ },
+ domain=[
+ ('type', '=', 'production'),
+ ],
+ depends=['type'])
+ production_picking_location = fields.Many2One(
+ 'stock.location', "Production Picking",
+ states={
+ 'invisible': Eval('type') != 'warehouse',
+ },
+ domain=[
+ ('type', '=', 'storage'),
+ ('parent', 'child_of', [Eval('id')]),
+ ],
+ depends=['type', 'id'],
+ help="Where the production components are picked from.\n"
+ "Leave empty to use the warehouse storage location.")
+ production_output_location = fields.Many2One(
+ 'stock.location', "Production Output",
+ states={
+ 'invisible': Eval('type') != 'warehouse',
+ },
+ domain=[
+ ('type', '=', 'storage'),
+ ('parent', 'child_of', [Eval('id')]),
+ ],
+ depends=['type', 'id'],
+ help="Where the produced goods are stored.\n"
+ "Leave empty to use the warehouse storage location.")
+
+
+class Move(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+ production_input = fields.Many2One('production', 'Production Input',
+ readonly=True, select=True, ondelete='CASCADE',
+ domain=[('company', '=', Eval('company'))],
+ depends=['company'])
+ production_output = fields.Many2One('production', 'Production Output',
+ readonly=True, select=True, ondelete='CASCADE',
+ domain=[('company', '=', Eval('company'))],
+ depends=['company'])
+ production_cost_price_updated = fields.Boolean(
+ "Cost Price Updated", readonly=True,
+ states={
+ 'invisible': ~Eval('production_input') & (Eval('state') == 'done'),
+ },
+ depends=['production_input', 'state'])
+
+ def set_effective_date(self):
+ if not self.effective_date and self.production_input:
+ self.effective_date = self.production_input.effective_start_date
+ if not self.effective_date and self.production_output:
+ self.effective_date = self.production_output.effective_date
+ super(Move, self).set_effective_date()
+
+ @classmethod
+ def write(cls, *args):
+ super().write(*args)
+ cost_price_update = []
+ actions = iter(args)
+ for moves, values in zip(actions, actions):
+ for move in moves:
+ if (move.state == 'done'
+ and move.production_input
+ and 'cost_price' in values):
+ cost_price_update.append(move)
+ if cost_price_update:
+ cls.write(
+ cost_price_update, {'production_cost_price_updated': True})
+
+
+class ProductQuantitiesByWarehouseMove(metaclass=PoolMeta):
+ __name__ = 'stock.product_quantities_warehouse.move'
+
+ @classmethod
+ def _get_document_models(cls):
+ return super()._get_document_models() + ['production']
+
+ def get_document(self, name):
+ document = super().get_document(name)
+ if self.move.production_input:
+ document = str(self.move.production_input)
+ if self.move.production_output:
+ document = str(self.move.production_output)
+ return document
diff --git a/modules/production/stock.xml b/modules/production/stock.xml
new file mode 100644
index 0000000000..0ea1ea2932
--- /dev/null
+++ b/modules/production/stock.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+ stock.location
+
+ location_form
+
+
+
+
+
+
+
+
+
+
+
+
+ form_relate
+ production,-1
+
+
+
+
+
+
+
+
+ Production
+ PROD
+ production
+
+
+
+
+
+
+
+
diff --git a/modules/production/tests/__init__.py b/modules/production/tests/__init__.py
new file mode 100644
index 0000000000..604d348dc9
--- /dev/null
+++ b/modules/production/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.production.tests.test_production import suite
+except ImportError:
+ from .test_production import suite
+
+__all__ = ['suite']
diff --git a/modules/production/tests/scenario_production.rst b/modules/production/tests/scenario_production.rst
new file mode 100644
index 0000000000..16c1093959
--- /dev/null
+++ b/modules/production/tests/scenario_production.rst
@@ -0,0 +1,233 @@
+===================
+Production Scenario
+===================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> from trytond.modules.production.production import BOM_CHANGES
+ >>> today = datetime.date.today()
+ >>> yesterday = today - relativedelta(days=1)
+ >>> before_yesterday = yesterday - relativedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('production')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Product = Model.get('product.product')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.producible = True
+ >>> template.list_price = Decimal(30)
+ >>> product, = template.products
+ >>> product.cost_price = Decimal(20)
+ >>> template.save()
+ >>> product, = template.products
+
+Create Components::
+
+ >>> template1 = ProductTemplate()
+ >>> template1.name = 'component 1'
+ >>> template1.default_uom = unit
+ >>> template1.type = 'goods'
+ >>> template1.list_price = Decimal(5)
+ >>> component1, = template1.products
+ >>> component1.cost_price = Decimal(1)
+ >>> template1.save()
+ >>> component1, = template1.products
+
+ >>> meter, = ProductUom.find([('name', '=', 'Meter')])
+ >>> centimeter, = ProductUom.find([('name', '=', 'centimeter')])
+
+ >>> template2 = ProductTemplate()
+ >>> template2.name = 'component 2'
+ >>> template2.default_uom = meter
+ >>> template2.type = 'goods'
+ >>> template2.list_price = Decimal(7)
+ >>> component2, = template2.products
+ >>> component2.cost_price = Decimal(5)
+ >>> template2.save()
+ >>> component2, = template2.products
+
+Create Bill of Material::
+
+ >>> BOM = Model.get('production.bom')
+ >>> BOMInput = Model.get('production.bom.input')
+ >>> BOMOutput = Model.get('production.bom.output')
+ >>> bom = BOM(name='product')
+ >>> input1 = BOMInput()
+ >>> bom.inputs.append(input1)
+ >>> input1.product = component1
+ >>> input1.quantity = 5
+ >>> input2 = BOMInput()
+ >>> bom.inputs.append(input2)
+ >>> input2.product = component2
+ >>> input2.quantity = 150
+ >>> input2.uom = centimeter
+ >>> output = BOMOutput()
+ >>> bom.outputs.append(output)
+ >>> output.product = product
+ >>> output.quantity = 1
+ >>> bom.save()
+
+ >>> ProductBom = Model.get('product.product-production.bom')
+ >>> product.boms.append(ProductBom(bom=bom))
+ >>> product.save()
+
+ >>> ProductionLeadTime = Model.get('production.lead_time')
+ >>> production_lead_time = ProductionLeadTime()
+ >>> production_lead_time.product = product
+ >>> production_lead_time.bom = bom
+ >>> production_lead_time.lead_time = datetime.timedelta(1)
+ >>> production_lead_time.save()
+
+Create an Inventory::
+
+ >>> Inventory = Model.get('stock.inventory')
+ >>> InventoryLine = Model.get('stock.inventory.line')
+ >>> Location = Model.get('stock.location')
+ >>> storage, = Location.find([
+ ... ('code', '=', 'STO'),
+ ... ])
+ >>> inventory = Inventory()
+ >>> inventory.location = storage
+ >>> inventory_line1 = InventoryLine()
+ >>> inventory.lines.append(inventory_line1)
+ >>> inventory_line1.product = component1
+ >>> inventory_line1.quantity = 20
+ >>> inventory_line2 = InventoryLine()
+ >>> inventory.lines.append(inventory_line2)
+ >>> inventory_line2.product = component2
+ >>> inventory_line2.quantity = 6
+ >>> inventory.click('confirm')
+ >>> inventory.state
+ 'done'
+
+Make a production::
+
+ >>> Production = Model.get('production')
+ >>> production = Production()
+ >>> production.planned_date = today
+ >>> production.product = product
+ >>> production.bom = bom
+ >>> production.quantity = 2
+ >>> production.planned_start_date == yesterday
+ True
+ >>> sorted([i.quantity for i in production.inputs]) == [10, 300]
+ True
+ >>> output, = production.outputs
+ >>> output.quantity == 2
+ True
+ >>> production.save()
+ >>> production.cost
+ Decimal('25.0000')
+ >>> production.click('wait')
+ >>> production.state
+ 'waiting'
+
+Test reset bom button::
+
+ >>> for input in production.inputs:
+ ... input.quantity += 1
+ >>> production.click('reset_bom', change=BOM_CHANGES)
+ >>> sorted([i.quantity for i in production.inputs]) == [10, 300]
+ True
+ >>> output, = production.outputs
+ >>> output.quantity == 2
+ True
+
+Do the production::
+
+ >>> production.click('assign_try')
+ True
+ >>> all(i.state == 'assigned' for i in production.inputs)
+ True
+ >>> production.click('run')
+ >>> all(i.state == 'done' for i in production.inputs)
+ True
+ >>> len(set(i.effective_date == today for i in production.inputs))
+ 1
+ >>> production.click('done')
+ >>> output, = production.outputs
+ >>> output.state
+ 'done'
+ >>> output.effective_date == production.effective_date
+ True
+ >>> output.unit_price
+ Decimal('12.5000')
+ >>> with config.set_context(locations=[storage.id]):
+ ... Product(product.id).quantity == 2
+ True
+
+Make a production with effective date yesterday and running the day before::
+
+ >>> Production = Model.get('production')
+ >>> production = Production()
+ >>> production.effective_date = yesterday
+ >>> production.effective_start_date = before_yesterday
+ >>> production.product = product
+ >>> production.bom = bom
+ >>> production.quantity = 2
+ >>> production.click('wait')
+ >>> production.click('assign_try')
+ True
+ >>> production.click('run')
+ >>> production.reload()
+ >>> all(i.effective_date == before_yesterday for i in production.inputs)
+ True
+ >>> production.click('done')
+ >>> production.reload()
+ >>> output, = production.outputs
+ >>> output.effective_date == yesterday
+ True
+
+
+Make a production with a bom of zero quantity::
+
+ >>> zero_bom, = BOM.duplicate([bom])
+ >>> for input_ in bom.inputs:
+ ... input_.quantity = 0.0
+ >>> bom_output, = bom.outputs
+ >>> bom_output.quantity = 0.0
+ >>> bom.save()
+ >>> production = Production()
+ >>> production.product = product
+ >>> production.bom = bom
+ >>> production.planned_start_date = yesterday
+ >>> production.quantity = 2
+ >>> [i.quantity for i in production.inputs]
+ [0.0, 0.0]
+ >>> output, = production.outputs
+ >>> output.quantity
+ 0.0
+
+Reschedule productions::
+
+ >>> production.click('wait')
+ >>> Cron = Model.get('ir.cron')
+ >>> cron = Cron(method='production|reschedule')
+ >>> cron.interval_number = 1
+ >>> cron.interval_type = 'months'
+ >>> cron.click('run_once')
+ >>> production.reload()
+ >>> production.planned_start_date == today
+ True
diff --git a/modules/production/tests/scenario_production_by_product.rst b/modules/production/tests/scenario_production_by_product.rst
new file mode 100644
index 0000000000..8c9d83a39f
--- /dev/null
+++ b/modules/production/tests/scenario_production_by_product.rst
@@ -0,0 +1,99 @@
+==========================
+Production with By-product
+==========================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+
+Activate modules::
+
+ >>> config = activate_modules('production')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create main product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.producible = True
+ >>> template.list_price = Decimal(30)
+ >>> template.save()
+ >>> product, = template.products
+
+Create by-products 1 marketable and 1 waste::
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal(10)
+ >>> template.save()
+ >>> marketable, = template.products
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal(0)
+ >>> template.save()
+ >>> waste, = template.products
+
+Create component::
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'component'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.save()
+ >>> component, = template.products
+ >>> component.cost_price = Decimal(5)
+ >>> component.save()
+
+Create Bill of Material::
+
+ >>> BOM = Model.get('production.bom')
+ >>> bom = BOM(name='product')
+ >>> input = bom.inputs.new()
+ >>> input.product = component
+ >>> input.quantity = 4
+ >>> output = bom.outputs.new()
+ >>> output.product = product
+ >>> output.quantity = 1
+ >>> output = bom.outputs.new()
+ >>> output.product = marketable
+ >>> output.quantity = 1
+ >>> output = bom.outputs.new()
+ >>> output.product = waste
+ >>> output.quantity = 2
+ >>> bom.save()
+
+Make a production::
+
+ >>> Production = Model.get('production')
+ >>> production = Production()
+ >>> production.product = product
+ >>> production.bom = bom
+ >>> production.quantity = 4
+ >>> production.click('wait')
+ >>> production.click('assign_force')
+ >>> production.click('run')
+ >>> production.click('done')
+
+Check output price::
+
+ >>> sorted([o.unit_price for o in production.outputs])
+ [Decimal('0'), Decimal('5.0000'), Decimal('15.0000')]
diff --git a/modules/production/tests/scenario_production_no_list_price.rst b/modules/production/tests/scenario_production_no_list_price.rst
new file mode 100644
index 0000000000..698655f4c6
--- /dev/null
+++ b/modules/production/tests/scenario_production_no_list_price.rst
@@ -0,0 +1,81 @@
+=============================
+Production without list price
+=============================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+
+Activate modules::
+
+ >>> config = activate_modules('production')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create main product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.producible = True
+ >>> template.list_price = Decimal(0)
+ >>> template.save()
+ >>> product, = template.products
+
+Create component::
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'component'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.save()
+ >>> component, = template.products
+ >>> component.cost_price = Decimal(5)
+ >>> component.save()
+
+Create Bill of Material::
+
+ >>> BOM = Model.get('production.bom')
+ >>> bom = BOM(name='product')
+ >>> input = bom.inputs.new()
+ >>> input.product = component
+ >>> input.quantity = 4
+ >>> output = bom.outputs.new()
+ >>> output.product = product
+ >>> output.quantity = 2
+ >>> bom.save()
+
+Make a production::
+
+ >>> Production = Model.get('production')
+ >>> production = Production()
+ >>> production.product = product
+ >>> production.bom = bom
+ >>> production.quantity = 4
+ >>> production.click('wait')
+ >>> production.click('assign_force')
+ >>> production.click('run')
+ >>> output, = production.outputs
+ >>> output.quantity = 2
+ >>> output.save()
+ >>> _ = output.duplicate()
+ >>> production.click('done')
+
+Check output price::
+
+ >>> production.cost
+ Decimal('40.0000')
+ >>> sorted([o.unit_price for o in production.outputs])
+ [Decimal('10.0000'), Decimal('10.0000')]
diff --git a/modules/production/tests/scenario_production_rounding.rst b/modules/production/tests/scenario_production_rounding.rst
new file mode 100644
index 0000000000..3e5113d0c6
--- /dev/null
+++ b/modules/production/tests/scenario_production_rounding.rst
@@ -0,0 +1,96 @@
+============================
+Production Rounding Scenario
+============================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+
+Activate modules::
+
+ >>> config = activate_modules('production')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.producible = True
+ >>> template.list_price = Decimal(30)
+ >>> template.save()
+ >>> product, = template.products
+
+Create component::
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'component'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal(5)
+ >>> template.save()
+ >>> component, = template.products
+
+Create residual::
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'residual'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal(0)
+ >>> template.save()
+ >>> residual, = template.products
+
+Create Bill of Material with rational ratio::
+
+ >>> BOM = Model.get('production.bom')
+ >>> bom = BOM(name='product')
+ >>> input = bom.inputs.new()
+ >>> input.product = component
+ >>> input.quantity = 4
+ >>> output = bom.outputs.new()
+ >>> output.product = product
+ >>> output.quantity = 9
+ >>> output = bom.outputs.new()
+ >>> output.product = residual
+ >>> output.quantity = 8
+ >>> bom.save()
+
+Make a production with rounding::
+
+ >>> Production = Model.get('production')
+ >>> production = Production()
+ >>> production.product = product
+ >>> production.bom = bom
+ >>> production.quantity = 3
+
+Check component is ceiled::
+
+ >>> input, = production.inputs
+ >>> input.quantity
+ 2.0
+
+Check product quantity::
+
+ >>> output, = [o for o in production.outputs if o.product == product]
+ >>> output.quantity
+ 3.0
+
+Check residual is floored::
+
+ >>> output, = [o for o in production.outputs if o.product == residual]
+ >>> output.quantity
+ 2.0
diff --git a/modules/production/tests/scenario_production_set_cost.rst b/modules/production/tests/scenario_production_set_cost.rst
new file mode 100644
index 0000000000..cc61dcaf4b
--- /dev/null
+++ b/modules/production/tests/scenario_production_set_cost.rst
@@ -0,0 +1,110 @@
+===================
+Production Set Cost
+===================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+
+Activate modules::
+
+ >>> config = activate_modules('production')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create main product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.producible = True
+ >>> template.list_price = Decimal(20)
+ >>> template.save()
+ >>> product, = template.products
+
+Create component::
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'component'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.save()
+ >>> component, = template.products
+ >>> component.cost_price = Decimal(5)
+ >>> component.save()
+
+Create Bill of Material::
+
+ >>> BOM = Model.get('production.bom')
+ >>> bom = BOM(name='product')
+ >>> input = bom.inputs.new()
+ >>> input.product = component
+ >>> input.quantity = 3
+ >>> output = bom.outputs.new()
+ >>> output.product = product
+ >>> output.quantity = 1
+ >>> bom.save()
+
+Make a production with 2 unused component::
+
+ >>> Production = Model.get('production')
+ >>> production = Production()
+ >>> production.product = product
+ >>> production.bom = bom
+ >>> production.quantity = 2
+ >>> production.click('wait')
+ >>> production.click('assign_force')
+ >>> production.click('run')
+ >>> output = production.outputs.new()
+ >>> output.product = component
+ >>> output.quantity = 2
+ >>> output.unit_price = Decimal(0)
+ >>> output.from_location = production.location
+ >>> output.to_location = production.warehouse.storage_location
+ >>> production.click('done')
+
+Check output price::
+
+ >>> production.cost
+ Decimal('30.0000')
+ >>> sorted([o.unit_price for o in production.outputs])
+ [Decimal('5.0000'), Decimal('10.0000')]
+
+
+Change cost of input::
+
+ >>> Move = Model.get('stock.move')
+ >>> input, = production.inputs
+ >>> Move.write([input], {'cost_price': Decimal(6)}, config.context)
+ >>> input.reload()
+ >>> bool(input.production_cost_price_updated)
+ True
+
+Launch cron task::
+
+ >>> Cron = Model.get('ir.cron')
+ >>> Company = Model.get('company.company')
+ >>> cron_set_cost, = Cron.find([
+ ... ('method', '=', 'production|set_cost_from_moves'),
+ ... ])
+ >>> cron_set_cost.companies.append(Company(company.id))
+ >>> cron_set_cost.click('run_once')
+
+ >>> production.reload()
+ >>> sorted([o.unit_price for o in production.outputs])
+ [Decimal('6.0000'), Decimal('12.0000')]
+ >>> input, = production.inputs
+ >>> bool(input.production_cost_price_updated)
+ False
diff --git a/modules/production/tests/scenario_production_waste.rst b/modules/production/tests/scenario_production_waste.rst
new file mode 100644
index 0000000000..6973e559f2
--- /dev/null
+++ b/modules/production/tests/scenario_production_waste.rst
@@ -0,0 +1,92 @@
+=========================
+Production Waste Scenario
+=========================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import (
+ ... create_company, get_company)
+
+Activate modules::
+
+ >>> config = activate_modules('production')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create main product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.producible = True
+ >>> template.list_price = Decimal(20)
+ >>> template.save()
+ >>> product, = template.products
+
+Create Component::
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'component 1'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal(50)
+ >>> component, = template.products
+ >>> component.cost_price = Decimal(1)
+ >>> template.save()
+ >>> component, = template.products
+
+Configure locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> lost_found_loc, = Location.find([('type', '=', 'lost_found')])
+ >>> warehouse_loc, = Location.find([('type', '=', 'warehouse')])
+ >>> warehouse_loc.waste_locations.append(lost_found_loc)
+ >>> warehouse_loc.save()
+
+Run the production::
+
+ >>> Production = Model.get('production')
+ >>> production = Production()
+ >>> input = production.inputs.new()
+ >>> input.quantity = 20.0
+ >>> input.product = component
+ >>> input.from_location = warehouse_loc.storage_location
+ >>> input.to_location = production.location
+ >>> production.click('wait')
+ >>> production.click('assign_force')
+ >>> production.click('run')
+
+Create outputs including waste products::
+
+ >>> output = production.outputs.new()
+ >>> output.quantity = 1.0
+ >>> output.product = product
+ >>> output.from_location = production.location
+ >>> output.to_location = warehouse_loc.storage_location
+ >>> output.unit_price = Decimal('0')
+ >>> waste_output = production.outputs.new()
+ >>> waste_output.quantity = 1.0
+ >>> waste_output.product = product
+ >>> waste_output.from_location = production.location
+ >>> waste_output.to_location = lost_found_loc
+ >>> production.click('done')
+ >>> production.cost
+ Decimal('20.0000')
+ >>> output, = [o for o in production.outputs
+ ... if o.to_location.type != 'lost_found']
+ >>> output.unit_price
+ Decimal('20.0000')
+ >>> waste_output, = [o for o in production.outputs
+ ... if o.to_location.type == 'lost_found']
+ >>> waste_output.unit_price
diff --git a/modules/production/tests/test_production.py b/modules/production/tests/test_production.py
new file mode 100644
index 0000000000..627c0c8041
--- /dev/null
+++ b/modules/production/tests/test_production.py
@@ -0,0 +1,76 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import unittest
+import doctest
+import datetime
+
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.tests.test_tryton import doctest_teardown
+from trytond.tests.test_tryton import doctest_checker
+from trytond.pool import Pool
+
+from trytond.modules.company.tests import CompanyTestMixin
+
+
+class ProductionTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test Production module'
+ module = 'production'
+
+ @with_transaction()
+ def test_on_change_with_planned_start_date(self):
+ "Test on_change_with_planned_start_date"
+ pool = Pool()
+ Production = pool.get('production')
+ Product = pool.get('product.product')
+ LeadTime = pool.get('production.lead_time')
+
+ date = datetime.date(2016, 11, 26)
+ product = Product()
+ product.lead_times = []
+ production = Production()
+ production.planned_date = date
+ production.product = product
+
+ self.assertEqual(production.on_change_with_planned_start_date(), date)
+
+ lead_time = LeadTime(bom=None, lead_time=None)
+ product.lead_times = [lead_time]
+ self.assertEqual(production.on_change_with_planned_start_date(), date)
+
+ lead_time.lead_time = datetime.timedelta(1)
+ self.assertEqual(
+ production.on_change_with_planned_start_date(),
+ datetime.date(2016, 11, 25))
+
+
+def suite():
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductionTestCase))
+ suite.addTests(doctest.DocFileSuite('scenario_production.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite('scenario_production_rounding.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite('scenario_production_by_product.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(
+ doctest.DocFileSuite('scenario_production_no_list_price.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite('scenario_production_set_cost.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite('scenario_production_waste.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ return suite
diff --git a/modules/production/tox.ini b/modules/production/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/production/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/production/tryton.cfg b/modules/production/tryton.cfg
new file mode 100644
index 0000000000..8540d3a343
--- /dev/null
+++ b/modules/production/tryton.cfg
@@ -0,0 +1,15 @@
+[tryton]
+version=6.0.5
+depends:
+ company
+ ir
+ product
+ res
+ stock
+xml:
+ production.xml
+ configuration.xml
+ bom.xml
+ product.xml
+ stock.xml
+ message.xml
diff --git a/modules/production/view/assign_failed_form.xml b/modules/production/view/assign_failed_form.xml
new file mode 100644
index 0000000000..dd5543bd50
--- /dev/null
+++ b/modules/production/view/assign_failed_form.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/modules/production/view/bom_form.xml b/modules/production/view/bom_form.xml
new file mode 100644
index 0000000000..c05992e1f8
--- /dev/null
+++ b/modules/production/view/bom_form.xml
@@ -0,0 +1,15 @@
+
+
+
diff --git a/modules/production/view/bom_input_form.xml b/modules/production/view/bom_input_form.xml
new file mode 100644
index 0000000000..a68bc129fe
--- /dev/null
+++ b/modules/production/view/bom_input_form.xml
@@ -0,0 +1,15 @@
+
+
+
diff --git a/modules/production/view/bom_input_list.xml b/modules/production/view/bom_input_list.xml
new file mode 100644
index 0000000000..6531df465d
--- /dev/null
+++ b/modules/production/view/bom_input_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production/view/bom_list.xml b/modules/production/view/bom_list.xml
new file mode 100644
index 0000000000..b4d89538b1
--- /dev/null
+++ b/modules/production/view/bom_list.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/modules/production/view/bom_output_form.xml b/modules/production/view/bom_output_form.xml
new file mode 100644
index 0000000000..a68bc129fe
--- /dev/null
+++ b/modules/production/view/bom_output_form.xml
@@ -0,0 +1,15 @@
+
+
+
diff --git a/modules/production/view/bom_output_list.xml b/modules/production/view/bom_output_list.xml
new file mode 100644
index 0000000000..6531df465d
--- /dev/null
+++ b/modules/production/view/bom_output_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production/view/bom_tree_open_start_form.xml b/modules/production/view/bom_tree_open_start_form.xml
new file mode 100644
index 0000000000..82b2088976
--- /dev/null
+++ b/modules/production/view/bom_tree_open_start_form.xml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/modules/production/view/bom_tree_open_tree_form.xml b/modules/production/view/bom_tree_open_tree_form.xml
new file mode 100644
index 0000000000..e91df470f3
--- /dev/null
+++ b/modules/production/view/bom_tree_open_tree_form.xml
@@ -0,0 +1,6 @@
+
+
+
diff --git a/modules/production/view/bom_tree_tree.xml b/modules/production/view/bom_tree_tree.xml
new file mode 100644
index 0000000000..fee67116e3
--- /dev/null
+++ b/modules/production/view/bom_tree_tree.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production/view/configuration_form.xml b/modules/production/view/configuration_form.xml
new file mode 100644
index 0000000000..ddce3482d6
--- /dev/null
+++ b/modules/production/view/configuration_form.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/modules/production/view/location_form.xml b/modules/production/view/location_form.xml
new file mode 100644
index 0000000000..f2520332e2
--- /dev/null
+++ b/modules/production/view/location_form.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/production/view/product_bom_form.xml b/modules/production/view/product_bom_form.xml
new file mode 100644
index 0000000000..812492c72a
--- /dev/null
+++ b/modules/production/view/product_bom_form.xml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/modules/production/view/product_bom_list.xml b/modules/production/view/product_bom_list.xml
new file mode 100644
index 0000000000..3f368c7c61
--- /dev/null
+++ b/modules/production/view/product_bom_list.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/modules/production/view/product_bom_list_sequence.xml b/modules/production/view/product_bom_list_sequence.xml
new file mode 100644
index 0000000000..75fc008de3
--- /dev/null
+++ b/modules/production/view/product_bom_list_sequence.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/modules/production/view/product_form.xml b/modules/production/view/product_form.xml
new file mode 100644
index 0000000000..88cbdec510
--- /dev/null
+++ b/modules/production/view/product_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/production/view/production_calendar.xml b/modules/production/view/production_calendar.xml
new file mode 100644
index 0000000000..79e2c278f9
--- /dev/null
+++ b/modules/production/view/production_calendar.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/modules/production/view/production_form.xml b/modules/production/view/production_form.xml
new file mode 100644
index 0000000000..d80e910a76
--- /dev/null
+++ b/modules/production/view/production_form.xml
@@ -0,0 +1,61 @@
+
+
+
diff --git a/modules/production/view/production_lead_time_form.xml b/modules/production/view/production_lead_time_form.xml
new file mode 100644
index 0000000000..973d3a6394
--- /dev/null
+++ b/modules/production/view/production_lead_time_form.xml
@@ -0,0 +1,15 @@
+
+
+
diff --git a/modules/production/view/production_lead_time_list.xml b/modules/production/view/production_lead_time_list.xml
new file mode 100644
index 0000000000..704668cc3d
--- /dev/null
+++ b/modules/production/view/production_lead_time_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production/view/production_lead_time_list_sequence.xml b/modules/production/view/production_lead_time_list_sequence.xml
new file mode 100644
index 0000000000..861aba3d9f
--- /dev/null
+++ b/modules/production/view/production_lead_time_list_sequence.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/modules/production/view/production_list.xml b/modules/production/view/production_list.xml
new file mode 100644
index 0000000000..18a612fd91
--- /dev/null
+++ b/modules/production/view/production_list.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/production/view/template_form.xml b/modules/production/view/template_form.xml
new file mode 100644
index 0000000000..22263bd39f
--- /dev/null
+++ b/modules/production/view/template_form.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/production/view/template_list.xml b/modules/production/view/template_list.xml
new file mode 100644
index 0000000000..df1af08cc5
--- /dev/null
+++ b/modules/production/view/template_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_outsourcing/.drone.yml b/modules/production_outsourcing/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/production_outsourcing/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/production_outsourcing/.flake8 b/modules/production_outsourcing/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/production_outsourcing/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/production_outsourcing/CHANGELOG b/modules/production_outsourcing/CHANGELOG
new file mode 100644
index 0000000000..65a0133a2e
--- /dev/null
+++ b/modules/production_outsourcing/CHANGELOG
@@ -0,0 +1,18 @@
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Initial release
diff --git a/modules/production_outsourcing/COPYRIGHT b/modules/production_outsourcing/COPYRIGHT
new file mode 100644
index 0000000000..00997137e8
--- /dev/null
+++ b/modules/production_outsourcing/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2018-2021 Cédric Krier
+Copyright (C) 2018-2021 B2CK
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/production_outsourcing/LICENSE b/modules/production_outsourcing/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/production_outsourcing/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/production_outsourcing/MANIFEST.in b/modules/production_outsourcing/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/production_outsourcing/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/production_outsourcing/README.rst b/modules/production_outsourcing/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/production_outsourcing/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/production_outsourcing/__init__.py b/modules/production_outsourcing/__init__.py
new file mode 100644
index 0000000000..deb5753f77
--- /dev/null
+++ b/modules/production_outsourcing/__init__.py
@@ -0,0 +1,20 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import production
+from . import purchase
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ production.Routing,
+ production.Production,
+ purchase.Line,
+ module='production_outsourcing', type_='model')
+ Pool.register(
+ module='production_outsourcing', type_='wizard')
+ Pool.register(
+ module='production_outsourcing', type_='report')
diff --git a/modules/production_outsourcing/doc/index.rst b/modules/production_outsourcing/doc/index.rst
new file mode 100644
index 0000000000..45c41afd17
--- /dev/null
+++ b/modules/production_outsourcing/doc/index.rst
@@ -0,0 +1,11 @@
+Production Outsourcing Module
+#############################
+
+The production outsourcing module allows to outsource production order per
+routing. When such outsourced production is set to waiting, a purchase order is
+created and its cost is added to the production.
+
+To define an outsourced production, the routing must have a *Supplier*, a
+*Service* and its *Quantity* defined. Those values will be used to create the
+purchase order. The bought quantity is computed by multiplying the *Quantity*
+by the factor between the bill of material and the production quantity.
diff --git a/modules/production_outsourcing/exceptions.py b/modules/production_outsourcing/exceptions.py
new file mode 100644
index 0000000000..f5c83d762d
--- /dev/null
+++ b/modules/production_outsourcing/exceptions.py
@@ -0,0 +1,8 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.exceptions import UserWarning
+
+
+class PurchaseWarning(UserWarning):
+ pass
diff --git a/modules/production_outsourcing/locale/bg.po b/modules/production_outsourcing/locale/bg.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/bg.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/ca.po b/modules/production_outsourcing/locale/ca.po
new file mode 100644
index 0000000000..d68e4dc228
--- /dev/null
+++ b/modules/production_outsourcing/locale/ca.po
@@ -0,0 +1,67 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Línies de compra"
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr "Servei"
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr "Servei del proveïdor"
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr "Les línies a afegir al cost de la producció."
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr "El proveïdor a qui externalitzar la producció."
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr "La quantitat a comprar per produir una quantitat de la LdM."
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr "El servei a comprar al proveïdor per la producció."
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr "El servei del proveïdor a comprar per la producció."
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr "Afegeix al cost de la producció."
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+"Els produccions \"%(productions)s\" no es poden processar perquè tenen "
+"compres pendents."
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr "Producció"
diff --git a/modules/production_outsourcing/locale/cs.po b/modules/production_outsourcing/locale/cs.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/cs.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/de.po b/modules/production_outsourcing/locale/de.po
new file mode 100644
index 0000000000..6cf4ee7121
--- /dev/null
+++ b/modules/production_outsourcing/locale/de.po
@@ -0,0 +1,67 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Einkaufspositionen"
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr "Dienstleistung"
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr "Lieferantendienstleistung"
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr "Positionen die zu den Produktionskosten addiert werden."
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr "Der Lieferant zu dem die Produktion ausgelagert wird."
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr "Die zu beschaffende Menge, um die Stückliste einmal zu produzieren."
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr "Die vom Lieferanten zu beziehende Dienstleistung für die Produktion."
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr "Die vom Lieferanten zu beziehende Dienstleistung für die Produktion."
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr "Zu den Produktionskosten hinzufügen."
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+"Die Produktionsaufträge \"%(productions)s\" können nicht ausgeführt werden, "
+"weil zugehörige Einkäufe noch nicht erledigt sind."
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr "Produktion"
diff --git a/modules/production_outsourcing/locale/es.po b/modules/production_outsourcing/locale/es.po
new file mode 100644
index 0000000000..837ebfea32
--- /dev/null
+++ b/modules/production_outsourcing/locale/es.po
@@ -0,0 +1,67 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Líneas de compra"
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr "Servicio"
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr "Servicio del proveedor"
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr "Las líneas a añadir al coste de la producción."
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr "El proveedor al que subcontratar la producción."
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr "La cantidad a comprar par producir la cantidad de la LdM."
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr "El servicio a comprar al proveedor para la producción."
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr "El servicio del proveedor a comprar para la producción."
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr "Añade coste a la producción."
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+"Las producciones \"%(productions)s\" no se pueden procesar porqué tienen "
+"compras pendientes."
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr "Producción"
diff --git a/modules/production_outsourcing/locale/es_419.po b/modules/production_outsourcing/locale/es_419.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/es_419.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/et.po b/modules/production_outsourcing/locale/et.po
new file mode 100644
index 0000000000..ce03a1eac0
--- /dev/null
+++ b/modules/production_outsourcing/locale/et.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Ostu read"
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr "Teenus"
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr "Hankija teenus"
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr "Tootmine"
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr "Read, mida lisada tootmise kulusse."
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr "Välise tootmise hankija."
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr "Lisa tootmise kulusse."
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr "Tootmisi \"%(productions)s\" ei saa alustada, kuna neil on ootel hankeid."
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr "Tootmine"
diff --git a/modules/production_outsourcing/locale/fa.po b/modules/production_outsourcing/locale/fa.po
new file mode 100644
index 0000000000..9bc4df97f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/fa.po
@@ -0,0 +1,67 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "سطرهای خرید"
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr "تأمین کننده"
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr "مقدار"
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr "خدمت"
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr "خدمات تإمین کننده ها"
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr "تولید"
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr "خطوط برای اضافه کردن به هزینه تولید."
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr "تأمین کننده به محصول تولید خارجی."
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr "مقدار خرید یک بار برای تولید محصول نمونه."
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr "خدمات برای خرید به تامین کننده برای تولید."
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr "خرید عرضه کننده خدمات جهت تولید."
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr "افزودن به هزينه توليد."
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+"تولیدات : \"%(productions)s\" را نمی توان پردازش کرد زیرا آنها در انتظار "
+"خرید هستند."
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr "تأمین کننده"
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr "تولید"
diff --git a/modules/production_outsourcing/locale/fi.po b/modules/production_outsourcing/locale/fi.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/fi.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/fr.po b/modules/production_outsourcing/locale/fr.po
new file mode 100644
index 0000000000..b2e250dee8
--- /dev/null
+++ b/modules/production_outsourcing/locale/fr.po
@@ -0,0 +1,67 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Lignes d'achat"
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr "Service"
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr "Service du fournisseur"
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr "Les lignes à ajouter au coût de production."
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr "Le fournisseur à qui sous-traiter la production."
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr "La quantité à acheter pour produire une fois la nomenclature."
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr "Le service à acheter au fournisseur pour la production."
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr "Le service du fournisseur à acheter pour la production."
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr "Ajouter au coût de production."
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+"Les productions « %(productions)s » ne peuvent pas être traitées car elles "
+"ont des achats en attentes."
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr "Production"
diff --git a/modules/production_outsourcing/locale/hu.po b/modules/production_outsourcing/locale/hu.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/hu.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/id.po b/modules/production_outsourcing/locale/id.po
new file mode 100644
index 0000000000..32cd29eea2
--- /dev/null
+++ b/modules/production_outsourcing/locale/id.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr "Jasa"
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr "Produksi"
diff --git a/modules/production_outsourcing/locale/it.po b/modules/production_outsourcing/locale/it.po
new file mode 100644
index 0000000000..6befef4dba
--- /dev/null
+++ b/modules/production_outsourcing/locale/it.po
@@ -0,0 +1,68 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Linee di acquisto"
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr "Servizio"
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr "Servizio del fornitore"
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr "Produzione"
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr "Le righe da aggiungere al costo di produzione."
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr "Il fornitore dove esternalizzare la produzione."
+
+#, fuzzy
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr "La quantità da acquistare per produrre una volta la distinta base."
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr "Il servizio del fornitore da acquistare per la produzione."
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr "Il servizio del fornitore da acquistare per la produzione."
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr "Aggiungere al costo della produzione."
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+"Le produzioni \"%(productions)s\" non possono essere elaborate in attesa di "
+"acquisti."
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr "Produzione"
diff --git a/modules/production_outsourcing/locale/lo.po b/modules/production_outsourcing/locale/lo.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/lo.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/lt.po b/modules/production_outsourcing/locale/lt.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/lt.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/nl.po b/modules/production_outsourcing/locale/nl.po
new file mode 100644
index 0000000000..833526706e
--- /dev/null
+++ b/modules/production_outsourcing/locale/nl.po
@@ -0,0 +1,69 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "aankooplijnen"
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr "Dienst"
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr "Service van de leverancier"
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr "De lijnen om toe te voegen aan de productiekosten."
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr "De leverancier om de productie aan uit te besteden."
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+"De hoeveelheid die moet worden gekocht om de stuklijst één keer te "
+"produceren."
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr "De te kopen service van de leverancier voor de productie."
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr "De service te kopen van de leverancier voor de productie."
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr "Voeg toe aan de kosten van de productie."
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+"De productie \"%(productions)s\"kan niet verwerkt worden om dat er nog "
+"aankopen hangende zijn."
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr "Productie"
diff --git a/modules/production_outsourcing/locale/pl.po b/modules/production_outsourcing/locale/pl.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/pl.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/pt.po b/modules/production_outsourcing/locale/pt.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/pt.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/ro.po b/modules/production_outsourcing/locale/ro.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/ro.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/ru.po b/modules/production_outsourcing/locale/ru.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/ru.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/sl.po b/modules/production_outsourcing/locale/sl.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/sl.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/tr.po b/modules/production_outsourcing/locale/tr.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/tr.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/locale/zh_CN.po b/modules/production_outsourcing/locale/zh_CN.po
new file mode 100644
index 0000000000..27faee68f6
--- /dev/null
+++ b/modules/production_outsourcing/locale/zh_CN.po
@@ -0,0 +1,65 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:production.routing,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:production.routing,supplier_service_supplier:"
+msgid "Supplier's Service"
+msgstr ""
+
+msgctxt "field:purchase.line,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "help:production,purchase_lines:"
+msgid "The lines to add to the production cost."
+msgstr ""
+
+msgctxt "help:production.routing,supplier:"
+msgid "The supplier to outsource the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_quantity:"
+msgid "The quantity to buy to produce one time the BOM."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service:"
+msgid "The service to buy to the supplier for the production."
+msgstr ""
+
+msgctxt "help:production.routing,supplier_service_supplier:"
+msgid "The supplier's service to buy for the production."
+msgstr ""
+
+msgctxt "help:purchase.line,production:"
+msgid "Add to the cost of the production."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_pending_purchase_done"
+msgid ""
+"The productions \"%(productions)s\" cannot be processed as they have pending"
+" purchases."
+msgstr ""
+
+msgctxt "view:production.routing:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Production"
+msgstr ""
diff --git a/modules/production_outsourcing/message.xml b/modules/production_outsourcing/message.xml
new file mode 100644
index 0000000000..964db10ac0
--- /dev/null
+++ b/modules/production_outsourcing/message.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ The productions "%(productions)s" cannot be processed as they have pending purchases.
+
+
+
diff --git a/modules/production_outsourcing/production.py b/modules/production_outsourcing/production.py
new file mode 100644
index 0000000000..1d5d42a00a
--- /dev/null
+++ b/modules/production_outsourcing/production.py
@@ -0,0 +1,244 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import hashlib
+from itertools import groupby
+
+from trytond.i18n import gettext
+from trytond.model import ModelView, Workflow, fields
+from trytond.pool import PoolMeta, Pool
+from trytond.pyson import Eval, Bool, If
+
+from trytond.modules.product import round_price
+
+from .exceptions import PurchaseWarning
+
+
+class Routing(metaclass=PoolMeta):
+ __name__ = 'production.routing'
+
+ supplier = fields.Many2One(
+ 'party.party', "Supplier",
+ help="The supplier to outsource the production.")
+ supplier_service = fields.Many2One(
+ 'product.product', "Service",
+ ondelete='RESTRICT',
+ domain=[
+ ('purchasable', '=', True),
+ ('template.type', '=', 'service'),
+ ],
+ states={
+ 'required': Bool(Eval('supplier')),
+ 'invisible': ~Eval('supplier'),
+ },
+ depends=['supplier', 'supplier_service_supplier'],
+ help="The service to buy to the supplier for the production.")
+ supplier_service_supplier = fields.Many2One(
+ 'purchase.product_supplier', "Supplier's Service",
+ ondelete='RESTRICT',
+ domain=[
+ ('template.type', '=', 'service'),
+ If(Bool('supplier_service'),
+ ['OR',
+ [
+ ('template.products', '=', Eval('supplier_service')),
+ ('product', '=', None),
+ ],
+ ('product', '=', Eval('supplier_service')),
+ ],
+ []),
+ ('party', '=', Eval('supplier', -1)),
+ ],
+ states={
+ 'invisible': ~Eval('supplier'),
+ },
+ depends=['supplier_service', 'supplier'],
+ help="The supplier's service to buy for the production.")
+ supplier_quantity = fields.Float("Quantity",
+ states={
+ 'invisible': ~Eval('supplier_service'),
+ 'required': Bool(Eval('supplier_service')),
+ },
+ depends=['supplier_service'],
+ help="The quantity to buy to produce one time the BOM.")
+
+ @classmethod
+ def default_supplier_quantity(cls):
+ return 1
+
+ @fields.depends('supplier')
+ def _get_product_supplier_pattern(self):
+ return {
+ 'party': self.supplier.id if self.supplier else -1,
+ }
+
+ @fields.depends('supplier', 'supplier_service',
+ 'supplier_service_supplier')
+ def on_change_supplier_service(self):
+ if self.supplier_service:
+ product_suppliers = list(
+ self.supplier_service.product_suppliers_used(
+ **self._get_product_supplier_pattern()))
+ if len(product_suppliers) == 1:
+ self.supplier_service_supplier, = product_suppliers
+ elif (self.supplier_service_supplier
+ and (self.supplier_service_supplier
+ not in product_suppliers)):
+ self.supplier_service = None
+
+ @fields.depends('supplier_service', 'supplier_service_supplier')
+ def on_change_supplier_service_supplier(self):
+ if self.supplier_service_supplier:
+ if self.supplier_service_supplier.product:
+ self.supplier_service = self.supplier_service_supplier.product
+ elif not self.supplier_service:
+ products = self.supplier_service_supplier.template.products
+ if len(products) == 1:
+ self.supplier_service, = products
+
+ @classmethod
+ def view_attributes(cls):
+ return super(Routing, cls).view_attributes() + [
+ ('//page[@id="supplier"]', 'states', {
+ 'invisible': ~Eval('supplier'),
+ }),
+ ]
+
+
+class Production(metaclass=PoolMeta):
+ __name__ = 'production'
+
+ purchase_lines = fields.One2Many(
+ 'purchase.line', 'production', "Purchase Lines",
+ domain=[
+ ('purchase.company', '=', Eval('company', -1)),
+ ],
+ depends=['company'],
+ help="The lines to add to the production cost.")
+
+ def get_cost(self, name):
+ pool = Pool()
+ Currency = pool.get('currency.currency')
+ cost = super(Production, self).get_cost(name)
+ for line in self.purchase_lines:
+ if line.purchase.state != 'cancelled':
+ cost += Currency.compute(
+ line.purchase.currency, line.amount,
+ self.company.currency, round=False)
+ return round_price(cost)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, productions):
+ pool = Pool()
+ PurchaseLine = pool.get('purchase.line')
+ super(Production, cls).draft(productions)
+ PurchaseLine.delete([l for p in productions for l in p.purchase_lines
+ if l.purchase_state in {'draft', 'cancelled'}])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, productions):
+ pool = Pool()
+ PurchaseLine = pool.get('purchase.line')
+ super(Production, cls).cancel(productions)
+ PurchaseLine.delete([l for p in productions for l in p.purchase_lines
+ if l.purchase_state in {'draft', 'cancelled'}])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('waiting')
+ def wait(cls, productions):
+ pool = Pool()
+ Purchase = pool.get('purchase.purchase')
+ PurchaseLine = pool.get('purchase.line')
+ Date = pool.get('ir.date')
+
+ draft_productions = [p for p in productions if p.state == 'draft']
+
+ super(Production, cls).wait(productions)
+
+ today = Date.today()
+ purchases = []
+ lines = []
+
+ def has_supplier(production):
+ return production.routing and production.routing.supplier
+ productions = cls.browse(sorted(
+ filter(has_supplier, draft_productions),
+ key=cls._group_purchase_key))
+ for key, grouped in groupby(productions, key=cls._group_purchase_key):
+ productions = list(grouped)
+ try:
+ purchase_date = min(p.planned_start_date or p.planned_date
+ for p in productions if p.planned_date)
+ except ValueError:
+ purchase_date = today
+ if purchase_date < today:
+ purchase_date = today
+ purchase = Purchase(purchase_date=purchase_date)
+ for f, v in key:
+ setattr(purchase, f, v)
+ purchases.append(purchase)
+ for production in productions:
+ line = production._get_purchase_line(purchase)
+ line.purchase = purchase
+ line.production = production
+ lines.append(line)
+ Purchase.save(purchases)
+ PurchaseLine.save(lines)
+
+ def _group_purchase_key(self):
+ supplier = self.routing.supplier
+ if self.routing.supplier_service_supplier:
+ currency = self.routing.supplier_service_supplier.currency
+ else:
+ currency = self.company.currency
+ return (
+ ('company', self.company),
+ ('party', supplier),
+ ('payment_term', supplier.supplier_payment_term),
+ ('warehouse', self.warehouse),
+ ('currency', currency),
+ ('invoice_address', supplier.address_get(type='invoice')),
+ )
+
+ def _get_purchase_line(self, purchase):
+ pool = Pool()
+ Line = pool.get('purchase.line')
+ line = Line()
+ line.product = self.routing.supplier_service
+ line.product_supplier = self.routing.supplier_service_supplier
+ line.unit = self.routing.supplier_service.purchase_uom
+ factor = self.bom.compute_factor(
+ self.product, self.quantity or 0, self.uom)
+ line.quantity = line.unit.round(
+ factor * self.routing.supplier_quantity)
+ line.purchase = purchase
+ line.on_change_product()
+ return line
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def done(cls, productions):
+ pool = Pool()
+ Warning = pool.get('res.user.warning')
+
+ def pending_purchase(production):
+ return any(l.purchase_state in {'draft', 'quotation'}
+ for l in production.purchase_lines)
+ pendings = list(filter(pending_purchase, productions))
+ if pendings:
+ names = ', '.join(p.rec_name for p in productions[:5])
+ if len(pendings) > 5:
+ names += '...'
+ warning_name = '%s.pending_purchase.done' % hashlib.md5(
+ str(pendings).encode('utf-8')).hexdigest()
+ if Warning.check(warning_name):
+ raise PurchaseWarning(
+ warning_name,
+ gettext('production_outsourcing.msg_pending_purchase_done',
+ productions=names))
+ super(Production, cls).done(productions)
diff --git a/modules/production_outsourcing/production.xml b/modules/production_outsourcing/production.xml
new file mode 100644
index 0000000000..6302111978
--- /dev/null
+++ b/modules/production_outsourcing/production.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+ production.routing
+
+ routing_list
+
+
+
+ production.routing
+
+ routing_form
+
+
+
+ production
+
+ production_form
+
+
+
diff --git a/modules/production_outsourcing/purchase.py b/modules/production_outsourcing/purchase.py
new file mode 100644
index 0000000000..c1e39c7f7a
--- /dev/null
+++ b/modules/production_outsourcing/purchase.py
@@ -0,0 +1,20 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import PoolMeta
+from trytond.model import fields
+from trytond.pyson import Eval
+
+
+class Line(metaclass=PoolMeta):
+ __name__ = 'purchase.line'
+
+ production = fields.Many2One(
+ 'production', "Production", select=True, ondelete='RESTRICT',
+ domain=[
+ ('company', '=', Eval('_parent_purchase', {}).get('company', -1)),
+ ],
+ states={
+ 'invisible': Eval('type') != 'line',
+ },
+ depends=['type'],
+ help="Add to the cost of the production.")
diff --git a/modules/production_outsourcing/purchase.xml b/modules/production_outsourcing/purchase.xml
new file mode 100644
index 0000000000..fb6612fb46
--- /dev/null
+++ b/modules/production_outsourcing/purchase.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ purchase.line
+
+ purchase_line_form
+
+
+
diff --git a/modules/production_outsourcing/setup.py b/modules/production_outsourcing/setup.py
new file mode 100755
index 0000000000..6f186fcefa
--- /dev/null
+++ b/modules/production_outsourcing/setup.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_production_outsourcing'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = []
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [get_require_version('proteus')]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module to outsource production',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/production_outsourcing',
+ },
+ keywords='tryton production outsourcing',
+ package_dir={'trytond.modules.production_outsourcing': '.'},
+ packages=(
+ ['trytond.modules.production_outsourcing']
+ + ['trytond.modules.production_outsourcing.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.production_outsourcing': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.fodt',
+ 'icons/*.svg', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ production_outsourcing = trytond.modules.production_outsourcing
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/production_outsourcing/tests/__init__.py b/modules/production_outsourcing/tests/__init__.py
new file mode 100644
index 0000000000..989baf7859
--- /dev/null
+++ b/modules/production_outsourcing/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.production_outsourcing.tests.test_production_outsourcing import suite # noqa: E501
+except ImportError:
+ from .test_production_outsourcing import suite
+
+__all__ = ['suite']
diff --git a/modules/production_outsourcing/tests/scenario_production_outsourcing.rst b/modules/production_outsourcing/tests/scenario_production_outsourcing.rst
new file mode 100644
index 0000000000..2d79cffa3c
--- /dev/null
+++ b/modules/production_outsourcing/tests/scenario_production_outsourcing.rst
@@ -0,0 +1,167 @@
+===============================
+Production Outsourcing Scenario
+===============================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> from trytond.modules.account.tests.tools import create_chart, \
+ ... get_accounts
+
+Activate modules::
+
+ >>> config = activate_modules('production_outsourcing')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+ >>> expense = accounts['expense']
+
+Create supplier::
+
+ >>> Party = Model.get('party.party')
+ >>> supplier = Party(name="Supplier")
+ >>> supplier.save()
+
+Create account categories::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_expense = expense
+ >>> account_category.save()
+
+Create Product::
+
+ >>> Uom = Model.get('product.uom')
+ >>> unit, = Uom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Product = Model.get('product.product')
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Product"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.producible = True
+ >>> template.list_price = Decimal(30)
+ >>> product, = template.products
+ >>> product.cost_price = Decimal(20)
+ >>> template.save()
+ >>> product, = template.products
+
+Create Component::
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Component"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal(5)
+ >>> component, = template.products
+ >>> component.cost_price = Decimal(1)
+ >>> template.save()
+ >>> component, = template.products
+
+Create Supplier Service::
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Production Service"
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.purchasable = True
+ >>> template.list_price = Decimal(20)
+ >>> template.account_category = account_category
+ >>> service, = template.products
+ >>> service.cost_price = Decimal(20)
+ >>> service_supplier = template.product_suppliers.new()
+ >>> service_supplier.party = supplier
+ >>> template.save()
+ >>> service, = template.products
+ >>> service_supplier, = template.product_suppliers
+
+Create Bill of Material::
+
+ >>> BOM = Model.get('production.bom')
+ >>> bom = BOM(name="Product")
+ >>> input = bom.inputs.new()
+ >>> input.product = component
+ >>> input.quantity = 1
+ >>> output = bom.outputs.new()
+ >>> output.product = product
+ >>> output.quantity = 1
+ >>> bom.save()
+
+Create Routing::
+
+ >>> Routing = Model.get('production.routing')
+ >>> routing = Routing(name="Supplier")
+ >>> routing.supplier = supplier
+ >>> routing.supplier_service = service
+ >>> routing.supplier_service_supplier == service_supplier
+ True
+ >>> routing.supplier_quantity = 2
+ >>> routing.boms.append(bom)
+ >>> routing.save()
+
+Set Bill of Material and Routing to the Product::
+
+ >>> ProductBOM = Model.get('product.product-production.bom')
+ >>> product.boms.append(ProductBOM(bom=bom, routing=routing))
+ >>> product.save()
+
+Make a production::
+
+ >>> Production = Model.get('production')
+ >>> production = Production()
+ >>> production.product = product
+ >>> production.bom = bom
+ >>> production.routing = routing
+ >>> production.quantity = 10
+ >>> production.click('wait')
+ >>> production.state
+ 'waiting'
+ >>> purchase_line, = production.purchase_lines
+ >>> purchase_line.product == service
+ True
+ >>> purchase_line.product_supplier == service_supplier
+ True
+ >>> purchase_line.quantity
+ 20.0
+ >>> production.cost
+ Decimal('410.0000')
+
+Reset to draft::
+
+ >>> production.click('draft')
+ >>> production.purchase_lines
+ []
+
+Try to do the production with pending purchase::
+
+ >>> production.click('wait')
+ >>> production.click('assign_force')
+ >>> production.click('run')
+ >>> production.click('done') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ PurchaseWarning: ...
+
+Validate the purchase::
+
+ >>> purchase_line, = production.purchase_lines
+ >>> purchase = purchase_line.purchase
+ >>> purchase.click('quote')
+ >>> purchase.click('confirm')
+
+Do the production::
+
+ >>> production.click('done')
diff --git a/modules/production_outsourcing/tests/test_production_outsourcing.py b/modules/production_outsourcing/tests/test_production_outsourcing.py
new file mode 100644
index 0000000000..3b093a2c14
--- /dev/null
+++ b/modules/production_outsourcing/tests/test_production_outsourcing.py
@@ -0,0 +1,28 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import unittest
+
+import doctest
+
+from trytond.tests.test_tryton import ModuleTestCase
+from trytond.tests.test_tryton import suite as test_suite
+from trytond.tests.test_tryton import doctest_teardown
+from trytond.tests.test_tryton import doctest_checker
+
+
+class ProductionOutsourcingTestCase(ModuleTestCase):
+ 'Test Production Outsourcing module'
+ module = 'production_outsourcing'
+
+
+def suite():
+ suite = test_suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductionOutsourcingTestCase))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_production_outsourcing.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ return suite
diff --git a/modules/production_outsourcing/tox.ini b/modules/production_outsourcing/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/production_outsourcing/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/production_outsourcing/tryton.cfg b/modules/production_outsourcing/tryton.cfg
new file mode 100644
index 0000000000..6ea2d1baaa
--- /dev/null
+++ b/modules/production_outsourcing/tryton.cfg
@@ -0,0 +1,12 @@
+[tryton]
+version=6.0.1
+depends:
+ ir
+ product
+ production
+ production_routing
+ purchase
+xml:
+ production.xml
+ purchase.xml
+ message.xml
diff --git a/modules/production_outsourcing/view/production_form.xml b/modules/production_outsourcing/view/production_form.xml
new file mode 100644
index 0000000000..8edf7d4c26
--- /dev/null
+++ b/modules/production_outsourcing/view/production_form.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_outsourcing/view/purchase_line_form.xml b/modules/production_outsourcing/view/purchase_line_form.xml
new file mode 100644
index 0000000000..d494c3316b
--- /dev/null
+++ b/modules/production_outsourcing/view/purchase_line_form.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/production_outsourcing/view/routing_form.xml b/modules/production_outsourcing/view/routing_form.xml
new file mode 100644
index 0000000000..5aa17ebc66
--- /dev/null
+++ b/modules/production_outsourcing/view/routing_form.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/production_outsourcing/view/routing_list.xml b/modules/production_outsourcing/view/routing_list.xml
new file mode 100644
index 0000000000..730340b161
--- /dev/null
+++ b/modules/production_outsourcing/view/routing_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_routing/.drone.yml b/modules/production_routing/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/production_routing/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/production_routing/.flake8 b/modules/production_routing/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/production_routing/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/production_routing/CHANGELOG b/modules/production_routing/CHANGELOG
new file mode 100644
index 0000000000..cc4138da58
--- /dev/null
+++ b/modules/production_routing/CHANGELOG
@@ -0,0 +1,35 @@
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+* Add routing as Lead Time parameter
+
+Version 4.0.0 - 2016-05-02
+* Initial release
diff --git a/modules/production_routing/COPYRIGHT b/modules/production_routing/COPYRIGHT
new file mode 100644
index 0000000000..adc01a3b85
--- /dev/null
+++ b/modules/production_routing/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2015-2021 Cédric Krier.
+Copyright (C) 2015-2021 B2CK SPRL.
+Copyright (C) 2013-2015 NaN·tic.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/production_routing/LICENSE b/modules/production_routing/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/production_routing/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/production_routing/MANIFEST.in b/modules/production_routing/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/production_routing/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/production_routing/README.rst b/modules/production_routing/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/production_routing/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/production_routing/__init__.py b/modules/production_routing/__init__.py
new file mode 100644
index 0000000000..a8d7347269
--- /dev/null
+++ b/modules/production_routing/__init__.py
@@ -0,0 +1,19 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import routing
+from . import production
+from . import product
+
+
+def register():
+ Pool.register(
+ routing.Routing,
+ routing.RoutingOperation,
+ routing.RoutingStep,
+ routing.Routing_BOM,
+ production.Production,
+ product.ProductBom,
+ product.ProductionLeadTime,
+ module='production_routing', type_='model')
diff --git a/modules/production_routing/doc/index.rst b/modules/production_routing/doc/index.rst
new file mode 100644
index 0000000000..dbd88f03e1
--- /dev/null
+++ b/modules/production_routing/doc/index.rst
@@ -0,0 +1,21 @@
+Production Routing Module
+#########################
+
+The production routing module defines the routings for production: Routing,
+Step and Operation.
+
+Routing
+*******
+
+Routings are a list of steps to follow with one of the BOMs to produce a
+product.
+
+Step
+****
+
+Steps define the operation to perform at a specific point of the routing.
+
+Operation
+*********
+
+An operation is a generic action.
diff --git a/modules/production_routing/locale/bg.po b/modules/production_routing/locale/bg.po
new file mode 100644
index 0000000000..e8cad5a666
--- /dev/null
+++ b/modules/production_routing/locale/bg.po
@@ -0,0 +1,91 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "Спецификации"
+
+#, fuzzy
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Условие за плащане"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/ca.po b/modules/production_routing/locale/ca.po
new file mode 100644
index 0000000000..5e2f30055c
--- /dev/null
+++ b/modules/production_routing/locale/ca.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "LdMs"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "Etapes"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "LdM"
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operació"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operació"
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operacions"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Rutes"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operacions"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Rutes"
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr "Ruta - LdM"
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operació"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr "Ruta"
diff --git a/modules/production_routing/locale/cs.po b/modules/production_routing/locale/cs.po
new file mode 100644
index 0000000000..23829dc921
--- /dev/null
+++ b/modules/production_routing/locale/cs.po
@@ -0,0 +1,89 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/de.po b/modules/production_routing/locale/de.po
new file mode 100644
index 0000000000..4ed24adb7f
--- /dev/null
+++ b/modules/production_routing/locale/de.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Fertigungsplan"
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Fertigungsplan"
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Fertigungsplan"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "Stücklisten"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "Fertigungsschritte"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "Stückliste"
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Fertigungsplan"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Arbeitsvorgang"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Arbeitsvorgang"
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Fertigungsplan"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Arbeitsvorgänge"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Fertigungspläne"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Arbeitsvorgänge"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Fertigungspläne"
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Fertigungsplan"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr "Fertigungsplan - Stückliste"
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Arbeitsvorgang"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr "Fertigungsplan"
diff --git a/modules/production_routing/locale/es.po b/modules/production_routing/locale/es.po
new file mode 100644
index 0000000000..6905f63ef2
--- /dev/null
+++ b/modules/production_routing/locale/es.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "LdMs"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "Etapas"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "LdM"
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operación"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operación"
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operaciones"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Rutas"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operaciones"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Rutas"
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Ruta"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr "Ruta - LdM"
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operación"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr "Ruta"
diff --git a/modules/production_routing/locale/es_419.po b/modules/production_routing/locale/es_419.po
new file mode 100644
index 0000000000..74bc132078
--- /dev/null
+++ b/modules/production_routing/locale/es_419.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr ""
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/et.po b/modules/production_routing/locale/et.po
new file mode 100644
index 0000000000..b394d2ef45
--- /dev/null
+++ b/modules/production_routing/locale/et.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Suunamine"
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Suunamine"
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Suunamine"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "Retseptid"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Nimetus"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "Sammud"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "Retsept"
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Suunamine"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operatsioon"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operatsioon"
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Suunamine"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operatsioonid"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Suunamised"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operatsioonid"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Suunamised"
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Suunamine"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr "Suunamine - Retsept"
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operatsioon"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr "Marsruut"
diff --git a/modules/production_routing/locale/fa.po b/modules/production_routing/locale/fa.po
new file mode 100644
index 0000000000..d3a96f4d36
--- /dev/null
+++ b/modules/production_routing/locale/fa.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "مسیر یابی"
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "مسیر یابی"
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "مسیر یابی"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "BOMs"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "مراحل"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "مسیر یابی"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "عملگر"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "عملگر"
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "مسیر یابی"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "عملیات"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "مسیرها"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "عملیات"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "مسیرها"
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "مسیر یابی"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr "مسیر یابی - BOM"
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "عملگر"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr "مسیر"
diff --git a/modules/production_routing/locale/fi.po b/modules/production_routing/locale/fi.po
new file mode 100644
index 0000000000..847dce3d6e
--- /dev/null
+++ b/modules/production_routing/locale/fi.po
@@ -0,0 +1,88 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/fr.po b/modules/production_routing/locale/fr.po
new file mode 100644
index 0000000000..0f695b1b17
--- /dev/null
+++ b/modules/production_routing/locale/fr.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Gamme"
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Gamme"
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Gamme"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "Nomenclatures"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "Étapes"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "Nomenclature"
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Gamme"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Opération"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Opération"
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Gamme"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Opérations"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Gammes"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Opérations"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Gammes"
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Gamme"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr "Gamme - Nomenclature"
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Opération"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr "Étape"
diff --git a/modules/production_routing/locale/hu.po b/modules/production_routing/locale/hu.po
new file mode 100644
index 0000000000..23fcc3c685
--- /dev/null
+++ b/modules/production_routing/locale/hu.po
@@ -0,0 +1,89 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/id.po b/modules/production_routing/locale/id.po
new file mode 100644
index 0000000000..c016a524d8
--- /dev/null
+++ b/modules/production_routing/locale/id.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr ""
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/it.po b/modules/production_routing/locale/it.po
new file mode 100644
index 0000000000..c8dd5f4dd0
--- /dev/null
+++ b/modules/production_routing/locale/it.po
@@ -0,0 +1,90 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operazione"
+
+#, fuzzy
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operazione"
+
+#, fuzzy
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operazione"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operazione"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operazione"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/lo.po b/modules/production_routing/locale/lo.po
new file mode 100644
index 0000000000..c2c3403a95
--- /dev/null
+++ b/modules/production_routing/locale/lo.po
@@ -0,0 +1,91 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "ການດຳເນີນການ"
+
+#, fuzzy
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "ການດຳເນີນການ"
+
+#, fuzzy
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "ການດຳເນີນການ"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "ການດຳເນີນການ"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "ການດຳເນີນການ"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/lt.po b/modules/production_routing/locale/lt.po
new file mode 100644
index 0000000000..23829dc921
--- /dev/null
+++ b/modules/production_routing/locale/lt.po
@@ -0,0 +1,89 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/nl.po b/modules/production_routing/locale/nl.po
new file mode 100644
index 0000000000..35987092fc
--- /dev/null
+++ b/modules/production_routing/locale/nl.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Productie schema"
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Productie schema"
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Productie schema"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "stuklijsten"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "Stappen"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "stuklijsten"
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Productie schema"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Proces"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Proces"
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Productie schema"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operaties"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Productieplannen"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operaties"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Productieplannen"
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Productie schema"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr "stuklijsten - Productie schema"
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Proces"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr "productie Schema"
diff --git a/modules/production_routing/locale/pl.po b/modules/production_routing/locale/pl.po
new file mode 100644
index 0000000000..31c5651d38
--- /dev/null
+++ b/modules/production_routing/locale/pl.po
@@ -0,0 +1,88 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "BOMy"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "Kroki"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operacja"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operacja"
+
+#, fuzzy
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operacja"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/pt.po b/modules/production_routing/locale/pt.po
new file mode 100644
index 0000000000..be32a39d41
--- /dev/null
+++ b/modules/production_routing/locale/pt.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Roteamento"
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Roteamento"
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Roteamento"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "Listas de Materiais"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "Etapas"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "Lista de Materiais"
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Roteamento"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operação"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operação"
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Roteamento"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Roteamento"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr "Roteamento - Lista de Materiais"
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operação"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr "Rota"
diff --git a/modules/production_routing/locale/ro.po b/modules/production_routing/locale/ro.po
new file mode 100644
index 0000000000..74bc132078
--- /dev/null
+++ b/modules/production_routing/locale/ro.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr ""
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr ""
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr ""
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/ru.po b/modules/production_routing/locale/ru.po
new file mode 100644
index 0000000000..4212243b3a
--- /dev/null
+++ b/modules/production_routing/locale/ru.po
@@ -0,0 +1,91 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "Спецификации"
+
+#, fuzzy
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Правило оплаты"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "Спецификация"
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/locale/sl.po b/modules/production_routing/locale/sl.po
new file mode 100644
index 0000000000..bc36570649
--- /dev/null
+++ b/modules/production_routing/locale/sl.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Linija"
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Linija"
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Linija"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "Kosovnice"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "Koraki"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "Kosovnica"
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Linija"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operacija"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operacija"
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Linija"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Linija"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr "Linija - Kosovnica"
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operacija"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr "Korak"
diff --git a/modules/production_routing/locale/tr.po b/modules/production_routing/locale/tr.po
new file mode 100644
index 0000000000..1e3d48833d
--- /dev/null
+++ b/modules/production_routing/locale/tr.po
@@ -0,0 +1,83 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Rotalama"
+
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Rotalama"
+
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Rotalama"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr "BOMlar"
+
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "Ad"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr "Adımlar"
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr "BOM"
+
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Rotalama"
+
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operasyon"
+
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operasyon"
+
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Rotalama"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Rotalama"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr "Rotalama - BOM"
+
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operasyon"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr "Rota"
diff --git a/modules/production_routing/locale/zh_CN.po b/modules/production_routing/locale/zh_CN.po
new file mode 100644
index 0000000000..613d5da9d6
--- /dev/null
+++ b/modules/production_routing/locale/zh_CN.po
@@ -0,0 +1,89 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.lead_time,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "field:production.routing,boms:"
+msgid "BOMs"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing,name:"
+msgid "Name"
+msgstr "纳木"
+
+msgctxt "field:production.routing,steps:"
+msgid "Steps"
+msgstr ""
+
+msgctxt "field:production.routing-production.bom,bom:"
+msgid "BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.routing-production.bom,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,operation:"
+msgid "Operation"
+msgstr "Operations"
+
+#, fuzzy
+msgctxt "field:production.routing.step,routing:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:ir.action,name:act_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.action,name:act_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+msgctxt "model:ir.ui.menu,name:menu_operation_list"
+msgid "Operations"
+msgstr "Operations"
+
+msgctxt "model:ir.ui.menu,name:menu_routing_list"
+msgid "Routings"
+msgstr "Routings"
+
+#, fuzzy
+msgctxt "model:production.routing,name:"
+msgid "Routing"
+msgstr "Routings"
+
+msgctxt "model:production.routing-production.bom,name:"
+msgid "Routing - BOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.routing.operation,name:"
+msgid "Operation"
+msgstr "Operations"
+
+msgctxt "model:production.routing.step,name:"
+msgid "Route"
+msgstr ""
diff --git a/modules/production_routing/product.py b/modules/production_routing/product.py
new file mode 100644
index 0000000000..885a75b10a
--- /dev/null
+++ b/modules/production_routing/product.py
@@ -0,0 +1,25 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import PoolMeta
+from trytond.model import fields
+from trytond.pyson import Eval
+
+
+class ProductBom(metaclass=PoolMeta):
+ __name__ = 'product.product-production.bom'
+ routing = fields.Many2One('production.routing', 'Routing',
+ ondelete='CASCADE', select=True,
+ domain=[
+ ('boms', '=', Eval('bom', 0)),
+ ],
+ depends=['bom'])
+
+
+class ProductionLeadTime(metaclass=PoolMeta):
+ __name__ = 'production.lead_time'
+ routing = fields.Many2One('production.routing', 'Routing',
+ ondelete='CASCADE',
+ domain=[
+ ('boms', '=', Eval('bom', 0)),
+ ],
+ depends=['bom'])
diff --git a/modules/production_routing/product.xml b/modules/production_routing/product.xml
new file mode 100644
index 0000000000..ebdaada52b
--- /dev/null
+++ b/modules/production_routing/product.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+ product.product-production.bom
+
+ product_bom_list
+
+
+
+ product.product-production.bom
+
+ product_bom_list
+
+
+
+ product.product-production.bom
+
+ product_bom_form
+
+
+
+ production.lead_time
+
+ production_lead_time_list
+
+
+
+ production.lead_time
+
+ production_lead_time_list_sequence
+
+
+
+ production.lead_time
+
+ production_lead_time_form
+
+
+
+
diff --git a/modules/production_routing/production.py b/modules/production_routing/production.py
new file mode 100644
index 0000000000..b3210ea6d3
--- /dev/null
+++ b/modules/production_routing/production.py
@@ -0,0 +1,47 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import PoolMeta
+from trytond.model import fields
+from trytond.pyson import Eval
+
+
+class Production(metaclass=PoolMeta):
+ __name__ = 'production'
+ routing = fields.Many2One('production.routing', 'Routing',
+ domain=[
+ ('boms', '=', Eval('bom', 0)),
+ ],
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ 'invisible': ~Eval('bom'),
+ },
+ depends=['bom', 'state'])
+
+ @fields.depends('bom', 'routing')
+ def on_change_bom(self):
+ super(Production, self).on_change_bom()
+ if self.bom:
+ if self.routing:
+ if self.bom not in self.routing.boms:
+ self.routing = None
+ else:
+ self.routing = None
+
+ @fields.depends('routing')
+ def on_change_with_planned_start_date(self, pattern=None):
+ if pattern is None:
+ pattern = {}
+ pattern.setdefault(
+ 'routing', self.routing.id if self.routing else None)
+ return super(Production, self).on_change_with_planned_start_date(
+ pattern=pattern)
+
+ @classmethod
+ def compute_request(
+ cls, product, warehouse, quantity, date, company,
+ order_point=None):
+ production = super(Production, cls).compute_request(
+ product, warehouse, quantity, date, company,
+ order_point=order_point)
+ production.routing = product.boms[0].routing if product.boms else None
+ return production
diff --git a/modules/production_routing/production.xml b/modules/production_routing/production.xml
new file mode 100644
index 0000000000..39edcb5116
--- /dev/null
+++ b/modules/production_routing/production.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ production
+
+ production_form
+
+
+
diff --git a/modules/production_routing/routing.py b/modules/production_routing/routing.py
new file mode 100644
index 0000000000..24db2541ef
--- /dev/null
+++ b/modules/production_routing/routing.py
@@ -0,0 +1,48 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import (
+ ModelSQL, ModelView, DeactivableMixin, fields, sequence_ordered)
+
+
+class Routing(DeactivableMixin, ModelSQL, ModelView):
+ 'Routing'
+ __name__ = 'production.routing'
+ name = fields.Char('Name', required=True, translate=True)
+ steps = fields.One2Many('production.routing.step', 'routing', 'Steps')
+ boms = fields.Many2Many(
+ 'production.routing-production.bom', 'routing', 'bom', 'BOMs')
+
+
+class RoutingOperation(DeactivableMixin, ModelSQL, ModelView):
+ 'Operation'
+ __name__ = 'production.routing.operation'
+ name = fields.Char('Operation', required=True, translate=True)
+
+
+class RoutingStep(sequence_ordered(), ModelSQL, ModelView):
+ 'Route'
+ __name__ = 'production.routing.step'
+ operation = fields.Many2One('production.routing.operation', 'Operation',
+ required=True)
+ routing = fields.Many2One('production.routing', 'Routing', required=True,
+ ondelete='CASCADE')
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.__access__.add('routing')
+
+ def get_rec_name(self, name):
+ return self.operation.rec_name
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return [('operation.rec_name',) + tuple(clause[1:])]
+
+
+class Routing_BOM(ModelSQL):
+ 'Routing - BOM'
+ __name__ = 'production.routing-production.bom'
+ routing = fields.Many2One('production.routing', 'Routing', required=True,
+ select=True)
+ bom = fields.Many2One('production.bom', 'BOM', required=True, select=True)
diff --git a/modules/production_routing/routing.xml b/modules/production_routing/routing.xml
new file mode 100644
index 0000000000..4a6af38a64
--- /dev/null
+++ b/modules/production_routing/routing.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+ production.routing
+ tree
+ routing_list
+
+
+
+ production.routing
+ form
+ routing_form
+
+
+
+ Routings
+ production.routing
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ production.routing.operation
+ tree
+ operation_list
+
+
+
+ production.routing.operation
+ form
+ operation_form
+
+
+
+ Operations
+ production.routing.operation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ production.routing.step
+ tree
+
+ routing_step_list
+
+
+
+ production.routing.step
+ tree
+
+ routing_step_list_sequence
+
+
+
+ production.routing.step
+ form
+ routing_step_form
+
+
+
diff --git a/modules/production_routing/setup.py b/modules/production_routing/setup.py
new file mode 100755
index 0000000000..1669890ee8
--- /dev/null
+++ b/modules/production_routing/setup.py
@@ -0,0 +1,153 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_production_routing'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = ['python-sql >= 0.4']
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [
+ get_require_version('proteus'),
+ get_require_version('trytond_stock_supply_production'),
+ ]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module for production routing',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/production_routing',
+ },
+ keywords='tryton production routing',
+ package_dir={'trytond.modules.production_routing': '.'},
+ packages=(
+ ['trytond.modules.production_routing']
+ + ['trytond.modules.production_routing.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.production_routing': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ production_routing = trytond.modules.production_routing
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/production_routing/tests/__init__.py b/modules/production_routing/tests/__init__.py
new file mode 100644
index 0000000000..cd628e7672
--- /dev/null
+++ b/modules/production_routing/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.production_routing.tests.test_production import suite
+except ImportError:
+ from .test_production_routing import suite
+
+__all__ = ['suite']
diff --git a/modules/production_routing/tests/scenario_stock_supply_production.rst b/modules/production_routing/tests/scenario_stock_supply_production.rst
new file mode 100644
index 0000000000..d4d30fadb4
--- /dev/null
+++ b/modules/production_routing/tests/scenario_stock_supply_production.rst
@@ -0,0 +1,79 @@
+===========================
+Production Request Scenario
+===========================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import (
+ ... create_company, get_company)
+
+Activate modules::
+
+ >>> config = activate_modules(
+ ... ['stock_supply_production', 'production_routing'])
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.producible = True
+ >>> template.list_price = Decimal(30)
+ >>> template.save()
+ >>> product, = template.products
+
+Create a Bill of Material with routing::
+
+ >>> BoM = Model.get('production.bom')
+ >>> bom = BoM(name="product")
+ >>> _ = bom.outputs.new(product=product, quantity=1)
+ >>> bom.save()
+ >>> Routing = Model.get('production.routing')
+ >>> routing = Routing(name="product")
+ >>> routing.boms.append(BoM(bom.id))
+ >>> routing.save()
+ >>> product_bom = product.boms.new(bom=bom, routing=routing)
+ >>> product.save()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> lost_loc, = Location.find([('type', '=', 'lost_found')])
+
+Create a need for product::
+
+ >>> Move = Model.get('stock.move')
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.from_location = storage_loc
+ >>> move.to_location = lost_loc
+ >>> move.click('do')
+ >>> move.state
+ 'done'
+
+Create production request::
+
+ >>> create_pr = Wizard('stock.supply')
+ >>> create_pr.execute('create_')
+
+There is now a production request with the routing::
+
+ >>> Production = Model.get('production')
+ >>> production, = Production.find([])
+ >>> production.routing == routing
+ True
diff --git a/modules/production_routing/tests/test_production_routing.py b/modules/production_routing/tests/test_production_routing.py
new file mode 100644
index 0000000000..21a2b6813c
--- /dev/null
+++ b/modules/production_routing/tests/test_production_routing.py
@@ -0,0 +1,24 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import doctest
+import unittest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import ModuleTestCase
+from trytond.tests.test_tryton import doctest_teardown
+from trytond.tests.test_tryton import doctest_checker
+
+
+class ProductionRoutingTestCase(ModuleTestCase):
+ 'Test Production Routing module'
+ module = 'production_routing'
+
+
+def suite():
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductionRoutingTestCase))
+ suite.addTests(doctest.DocFileSuite('scenario_stock_supply_production.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ return suite
diff --git a/modules/production_routing/tox.ini b/modules/production_routing/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/production_routing/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/production_routing/tryton.cfg b/modules/production_routing/tryton.cfg
new file mode 100644
index 0000000000..3744187704
--- /dev/null
+++ b/modules/production_routing/tryton.cfg
@@ -0,0 +1,11 @@
+[tryton]
+version=6.0.1
+depends:
+ ir
+ production
+extras_depend:
+ stock_supply_production
+xml:
+ routing.xml
+ production.xml
+ product.xml
diff --git a/modules/production_routing/view/operation_form.xml b/modules/production_routing/view/operation_form.xml
new file mode 100644
index 0000000000..3e61cab53d
--- /dev/null
+++ b/modules/production_routing/view/operation_form.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/modules/production_routing/view/operation_list.xml b/modules/production_routing/view/operation_list.xml
new file mode 100644
index 0000000000..2e8e05081d
--- /dev/null
+++ b/modules/production_routing/view/operation_list.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/modules/production_routing/view/product_bom_form.xml b/modules/production_routing/view/product_bom_form.xml
new file mode 100644
index 0000000000..dfb5428cc4
--- /dev/null
+++ b/modules/production_routing/view/product_bom_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/production_routing/view/product_bom_list.xml b/modules/production_routing/view/product_bom_list.xml
new file mode 100644
index 0000000000..14bfc8a49f
--- /dev/null
+++ b/modules/production_routing/view/product_bom_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_routing/view/production_form.xml b/modules/production_routing/view/production_form.xml
new file mode 100644
index 0000000000..e04fd17ee2
--- /dev/null
+++ b/modules/production_routing/view/production_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/production_routing/view/production_lead_time_form.xml b/modules/production_routing/view/production_lead_time_form.xml
new file mode 100644
index 0000000000..dfb5428cc4
--- /dev/null
+++ b/modules/production_routing/view/production_lead_time_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/production_routing/view/production_lead_time_list.xml b/modules/production_routing/view/production_lead_time_list.xml
new file mode 100644
index 0000000000..14bfc8a49f
--- /dev/null
+++ b/modules/production_routing/view/production_lead_time_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_routing/view/production_lead_time_list_sequence.xml b/modules/production_routing/view/production_lead_time_list_sequence.xml
new file mode 100644
index 0000000000..15b54f0cf6
--- /dev/null
+++ b/modules/production_routing/view/production_lead_time_list_sequence.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_routing/view/routing_form.xml b/modules/production_routing/view/routing_form.xml
new file mode 100644
index 0000000000..9c5cf03d9b
--- /dev/null
+++ b/modules/production_routing/view/routing_form.xml
@@ -0,0 +1,18 @@
+
+
+
diff --git a/modules/production_routing/view/routing_list.xml b/modules/production_routing/view/routing_list.xml
new file mode 100644
index 0000000000..b4d89538b1
--- /dev/null
+++ b/modules/production_routing/view/routing_list.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/modules/production_routing/view/routing_step_form.xml b/modules/production_routing/view/routing_step_form.xml
new file mode 100644
index 0000000000..d89bee80a1
--- /dev/null
+++ b/modules/production_routing/view/routing_step_form.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/modules/production_routing/view/routing_step_list.xml b/modules/production_routing/view/routing_step_list.xml
new file mode 100644
index 0000000000..91830c63db
--- /dev/null
+++ b/modules/production_routing/view/routing_step_list.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/modules/production_routing/view/routing_step_list_sequence.xml b/modules/production_routing/view/routing_step_list_sequence.xml
new file mode 100644
index 0000000000..ad620283be
--- /dev/null
+++ b/modules/production_routing/view/routing_step_list_sequence.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/modules/production_split/.drone.yml b/modules/production_split/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/production_split/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/production_split/.flake8 b/modules/production_split/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/production_split/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/production_split/CHANGELOG b/modules/production_split/CHANGELOG
new file mode 100644
index 0000000000..919755dc73
--- /dev/null
+++ b/modules/production_split/CHANGELOG
@@ -0,0 +1,31 @@
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+
+Version 4.2.0 - 2016-11-28
+* Initial release
diff --git a/modules/production_split/COPYRIGHT b/modules/production_split/COPYRIGHT
new file mode 100644
index 0000000000..d6ecdd08e5
--- /dev/null
+++ b/modules/production_split/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2016-2021 Cédric Krier
+Copyright (C) 2016-2021 B2CK
+Copyright (C) 2014 NaN·tic
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/production_split/LICENSE b/modules/production_split/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/production_split/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/production_split/MANIFEST.in b/modules/production_split/MANIFEST.in
new file mode 100644
index 0000000000..94499680c6
--- /dev/null
+++ b/modules/production_split/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
+include icons/LICENSE
diff --git a/modules/production_split/README.rst b/modules/production_split/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/production_split/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/production_split/__init__.py b/modules/production_split/__init__.py
new file mode 100644
index 0000000000..5c7f014ef7
--- /dev/null
+++ b/modules/production_split/__init__.py
@@ -0,0 +1,16 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+
+from . import production
+
+
+def register():
+ Pool.register(
+ production.Production,
+ production.SplitProductionStart,
+ module='production_split', type_='model')
+ Pool.register(
+ production.SplitProduction,
+ module='production_split', type_='wizard')
diff --git a/modules/production_split/doc/index.rst b/modules/production_split/doc/index.rst
new file mode 100644
index 0000000000..0ffef43725
--- /dev/null
+++ b/modules/production_split/doc/index.rst
@@ -0,0 +1,8 @@
+Production Split Module
+#######################
+
+The Production Split module adds on the production a wizard that allows to
+split it.
+The production is split into productions of *Quantity*. If *Count* is set, it
+will be split only this number of times. On occasion there can be a production
+with the remaining quantity.
diff --git a/modules/production_split/icons/LICENSE b/modules/production_split/icons/LICENSE
new file mode 100644
index 0000000000..7a4a3ea242
--- /dev/null
+++ b/modules/production_split/icons/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/modules/production_split/icons/tryton-production-split.svg b/modules/production_split/icons/tryton-production-split.svg
new file mode 100644
index 0000000000..d64516e11e
--- /dev/null
+++ b/modules/production_split/icons/tryton-production-split.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/modules/production_split/locale/bg.po b/modules/production_split/locale/bg.po
new file mode 100644
index 0000000000..d8de0b43e7
--- /dev/null
+++ b/modules/production_split/locale/bg.po
@@ -0,0 +1,54 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+#, fuzzy
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Десетични единици"
+
+#, fuzzy
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "Мерни единици"
+
+#, fuzzy
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Категория мер. ед."
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+#, fuzzy
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Split Production"
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Отказване"
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Split"
diff --git a/modules/production_split/locale/ca.po b/modules/production_split/locale/ca.po
new file mode 100644
index 0000000000..587925d2b8
--- /dev/null
+++ b/modules/production_split/locale/ca.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "Comptador"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria de la UdM"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "El nombre de produccions límit"
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Divideix producció"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Divideix"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Divideix producció"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Divideix"
diff --git a/modules/production_split/locale/cs.po b/modules/production_split/locale/cs.po
new file mode 100644
index 0000000000..34d6e7d88c
--- /dev/null
+++ b/modules/production_split/locale/cs.po
@@ -0,0 +1,49 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+#, fuzzy
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Split"
diff --git a/modules/production_split/locale/de.po b/modules/production_split/locale/de.po
new file mode 100644
index 0000000000..d0c35b06b8
--- /dev/null
+++ b/modules/production_split/locale/de.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "Anzahl"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Nachkommastellen"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "Maßeinheit"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Maßeinheitenkategorie"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "Die maximale Zahl der Produktionsaufträge"
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Produktionsauftrag aufteilen"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Aufteilen"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Produktionsauftrag aufteilen"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Aufteilen"
diff --git a/modules/production_split/locale/es.po b/modules/production_split/locale/es.po
new file mode 100644
index 0000000000..49c97a6340
--- /dev/null
+++ b/modules/production_split/locale/es.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "Contador"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Categoría de UdM"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "El número de producciones límite"
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Dividir producción"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Dividir"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Dividir producción"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Dividir"
diff --git a/modules/production_split/locale/es_419.po b/modules/production_split/locale/es_419.po
new file mode 100644
index 0000000000..52d0d061e3
--- /dev/null
+++ b/modules/production_split/locale/es_419.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "El número límite de producciones"
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr ""
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr ""
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr ""
diff --git a/modules/production_split/locale/et.po b/modules/production_split/locale/et.po
new file mode 100644
index 0000000000..56246ba650
--- /dev/null
+++ b/modules/production_split/locale/et.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "Loend"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Ühiku numbriline arv"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "Mõõtühik"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Mõõtühiku kategooria"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "Tootmiste piirnumber"
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Tootmise poolitamine"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Poolitamine"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Tootmise poolitamine"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Poolitamine"
diff --git a/modules/production_split/locale/fa.po b/modules/production_split/locale/fa.po
new file mode 100644
index 0000000000..1f73b7520b
--- /dev/null
+++ b/modules/production_split/locale/fa.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "شمارش"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "ارقام واحد"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "واحد اندازی گیری"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "دسته بندی واحد اندازه گیری"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "تعداد محدود تولیدات"
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "تقسیم تولید"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "تقسیم تولید"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "انصراف"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "تقسیم"
diff --git a/modules/production_split/locale/fi.po b/modules/production_split/locale/fi.po
new file mode 100644
index 0000000000..34d6e7d88c
--- /dev/null
+++ b/modules/production_split/locale/fi.po
@@ -0,0 +1,49 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+#, fuzzy
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Split"
diff --git a/modules/production_split/locale/fr.po b/modules/production_split/locale/fr.po
new file mode 100644
index 0000000000..964024f11f
--- /dev/null
+++ b/modules/production_split/locale/fr.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "Décompte"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "Unité de mesure"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "Le nombre limite de productions"
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Diviser la production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Diviser"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Diviser la production"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Diviser"
diff --git a/modules/production_split/locale/hu.po b/modules/production_split/locale/hu.po
new file mode 100644
index 0000000000..4b8c9a81f7
--- /dev/null
+++ b/modules/production_split/locale/hu.po
@@ -0,0 +1,54 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+#, fuzzy
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Tizedes vessző utáni számjegy"
+
+#, fuzzy
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "Egység"
+
+#, fuzzy
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Egység kategória"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+#, fuzzy
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Split Production"
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Mégse"
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Beosztás"
diff --git a/modules/production_split/locale/id.po b/modules/production_split/locale/id.po
new file mode 100644
index 0000000000..ad55c5ab83
--- /dev/null
+++ b/modules/production_split/locale/id.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr ""
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr ""
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr ""
diff --git a/modules/production_split/locale/it.po b/modules/production_split/locale/it.po
new file mode 100644
index 0000000000..21148b7ddb
--- /dev/null
+++ b/modules/production_split/locale/it.po
@@ -0,0 +1,50 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+#, fuzzy
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Posizioni Unità"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+#, fuzzy
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Split"
diff --git a/modules/production_split/locale/lo.po b/modules/production_split/locale/lo.po
new file mode 100644
index 0000000000..38d744e0af
--- /dev/null
+++ b/modules/production_split/locale/lo.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "ນັບ"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "ຫົວໜ່ວຍເສດ"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "ຫົວໜ່ວຍ"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "ໝວດຫົວໜ່ວຍ"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "ຈຳນວນຈຳກັດຂອງການຜະລິດ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "ແຍກການຜະລິດ"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "ຍົກເລີກ"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "ແຍກ"
diff --git a/modules/production_split/locale/lt.po b/modules/production_split/locale/lt.po
new file mode 100644
index 0000000000..34d6e7d88c
--- /dev/null
+++ b/modules/production_split/locale/lt.po
@@ -0,0 +1,49 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+#, fuzzy
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Split"
diff --git a/modules/production_split/locale/nl.po b/modules/production_split/locale/nl.po
new file mode 100644
index 0000000000..31a05cd9dd
--- /dev/null
+++ b/modules/production_split/locale/nl.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "aantal"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalen eenheid"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "maateenheid"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "maateenheid categorie"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "Het limiet aantal producties"
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Productie opsplitsen"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "opsplitsen"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Productie opsplitsen"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Geannuleerd"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "opsplitsen"
diff --git a/modules/production_split/locale/pl.po b/modules/production_split/locale/pl.po
new file mode 100644
index 0000000000..1aec5e3cce
--- /dev/null
+++ b/modules/production_split/locale/pl.po
@@ -0,0 +1,50 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "Jm"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Kategoria jednostki miary"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+#, fuzzy
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Anuluj"
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Split"
diff --git a/modules/production_split/locale/pt.po b/modules/production_split/locale/pt.po
new file mode 100644
index 0000000000..0497c2bf9c
--- /dev/null
+++ b/modules/production_split/locale/pt.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "Contagem"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos decimais da unidade"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "Udm"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Categoria da UDM"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "Limite para o número de produções"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Dividir Produção"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Dividir"
diff --git a/modules/production_split/locale/ro.po b/modules/production_split/locale/ro.po
new file mode 100644
index 0000000000..88876f27a3
--- /dev/null
+++ b/modules/production_split/locale/ro.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr ""
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr ""
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr ""
diff --git a/modules/production_split/locale/ru.po b/modules/production_split/locale/ru.po
new file mode 100644
index 0000000000..a3d8db4c4c
--- /dev/null
+++ b/modules/production_split/locale/ru.po
@@ -0,0 +1,55 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Кол-во цифр после запятой"
+
+#, fuzzy
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "Ед.изм."
+
+#, fuzzy
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Категория ед. измерения"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+#, fuzzy
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Split Production"
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Отменить"
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Split"
diff --git a/modules/production_split/locale/sl.po b/modules/production_split/locale/sl.po
new file mode 100644
index 0000000000..fb539cc141
--- /dev/null
+++ b/modules/production_split/locale/sl.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "Zgornja meja"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalke"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "ME"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Kategorija ME"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "Zgornja meja delitve proizvodnje"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Razdelitev proizvodnje"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Prekliči"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Razdeli"
diff --git a/modules/production_split/locale/tr.po b/modules/production_split/locale/tr.po
new file mode 100644
index 0000000000..087648f277
--- /dev/null
+++ b/modules/production_split/locale/tr.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr "Adet"
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr "Miktar"
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr "Birim Basamakları"
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr "Ölçü Birimi"
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr "Ölçü Birimi Kategorisi"
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr "Üretimler sayısı limiti"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Üretim Bölme"
+
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "Vazgeç"
+
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Bölme"
diff --git a/modules/production_split/locale/zh_CN.po b/modules/production_split/locale/zh_CN.po
new file mode 100644
index 0000000000..c97dff5395
--- /dev/null
+++ b/modules/production_split/locale/zh_CN.po
@@ -0,0 +1,50 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.split.start,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:production.split.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:production.split.start,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:production.split.start,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:production.split.start,uom_category:"
+msgid "Uom Category"
+msgstr ""
+
+msgctxt "help:production.split.start,count:"
+msgid "The limit number of productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_split_production"
+msgid "Split Production"
+msgstr "Split Production"
+
+msgctxt "model:ir.model.button,string:production_split_wizard_button"
+msgid "Split"
+msgstr "Split"
+
+#, fuzzy
+msgctxt "model:production.split.start,name:"
+msgid "Split Production"
+msgstr "Split Production"
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,end:"
+msgid "Cancel"
+msgstr "取消"
+
+#, fuzzy
+msgctxt "wizard_button:production.split,start,split:"
+msgid "Split"
+msgstr "Split"
diff --git a/modules/production_split/production.py b/modules/production_split/production.py
new file mode 100644
index 0000000000..0aec1d29d4
--- /dev/null
+++ b/modules/production_split/production.py
@@ -0,0 +1,115 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, fields
+from trytond.pool import PoolMeta, Pool
+from trytond.pyson import Eval
+from trytond.wizard import Wizard, StateView, StateTransition, Button
+
+
+class Production(metaclass=PoolMeta):
+ __name__ = 'production'
+
+ @classmethod
+ def __setup__(cls):
+ super(Production, cls).__setup__()
+ cls._buttons.update({
+ 'split_wizard': {
+ 'invisible': (~Eval('state').in_(['request', 'draft'])
+ | ~Eval('bom') | ~Eval('quantity', 0)),
+ 'depends': ['state', 'bom', 'quantity'],
+ },
+ })
+
+ @classmethod
+ @ModelView.button_action('production_split.wizard_split_production')
+ def split_wizard(cls, productions):
+ pass
+
+ def split(self, quantity, uom, count=None):
+ """
+ Split production into productions of quantity.
+ If count is not defined, the production will be split until remainder
+ is less than quantity.
+ Return the split productions
+ """
+ pool = Pool()
+ Uom = pool.get('product.uom')
+
+ productions = [self]
+ remainder = Uom.compute_qty(self.uom, self.quantity, uom)
+ if remainder <= quantity:
+ return productions
+ self.quantity = quantity
+ self.uom = uom
+ self.save()
+ remainder -= quantity
+ if count:
+ count -= 1
+ while (remainder > quantity
+ and (count or count is None)):
+ productions.extend(self.copy([self], {
+ 'quantity': quantity,
+ 'uom': uom.id,
+ 'inputs': None,
+ 'outputs': None,
+ }))
+ remainder -= quantity
+ remainder = uom.round(remainder)
+ if count:
+ count -= 1
+ assert remainder >= 0
+ if remainder:
+ productions.extend(self.copy([self], {
+ 'quantity': remainder,
+ 'uom': uom.id,
+ }))
+ for production in productions:
+ production.explode_bom()
+ self.__class__.save(productions)
+ return productions
+
+
+class SplitProduction(Wizard):
+ 'Split Production'
+ __name__ = 'production.split'
+ start = StateView('production.split.start',
+ 'production_split.split_start_view_form', [
+ Button('Cancel', 'end', 'tryton-cancel'),
+ Button('Split', 'split', 'tryton-ok', default=True),
+ ])
+ split = StateTransition()
+
+ def default_start(self, fields):
+ return {
+ 'uom': self.record.uom.id,
+ 'unit_digits': self.record.unit_digits,
+ 'uom_category': self.record.uom.category.id,
+ }
+
+ def transition_split(self):
+ self.record.split(
+ self.start.quantity, self.start.uom, count=self.start.count)
+ return 'end'
+
+
+class SplitProductionStart(ModelView):
+ 'Split Production'
+ __name__ = 'production.split.start'
+ count = fields.Integer('Count', help='The limit number of productions')
+ quantity = fields.Float('Quantity', required=True,
+ digits=(16, Eval('unit_digits', 2)),
+ depends=['unit_digits'])
+ uom = fields.Many2One('product.uom', 'Uom', required=True,
+ domain=[
+ ('category', '=', Eval('uom_category')),
+ ],
+ depends=['uom_category'])
+ unit_digits = fields.Integer('Unit Digits', readonly=True)
+ uom_category = fields.Many2One('product.uom.category', 'Uom Category',
+ readonly=True)
+
+ @fields.depends('uom')
+ def on_change_with_unit_digits(self):
+ if self.uom:
+ return self.uom.digits
+ return 2
diff --git a/modules/production_split/production.xml b/modules/production_split/production.xml
new file mode 100644
index 0000000000..318753a178
--- /dev/null
+++ b/modules/production_split/production.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+ tryton-production-split
+ icons/tryton-production-split.svg
+
+
+
+ Split Production
+ production.split
+ production
+
+
+
+ production
+
+ production_form
+
+
+
+ production.split.start
+ form
+ split_start_form
+
+
+ split_wizard
+ Split
+
+
+
+
diff --git a/modules/production_split/setup.py b/modules/production_split/setup.py
new file mode 100755
index 0000000000..c2af0eb856
--- /dev/null
+++ b/modules/production_split/setup.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_production_split'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = []
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = []
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module to split production',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/production_split',
+ },
+ keywords='tryton production split',
+ package_dir={'trytond.modules.production_split': '.'},
+ packages=(
+ ['trytond.modules.production_split']
+ + ['trytond.modules.production_split.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.production_split': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.fodt',
+ 'icons/*.svg', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ production_split = trytond.modules.production_split
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/production_split/tests/__init__.py b/modules/production_split/tests/__init__.py
new file mode 100644
index 0000000000..66f3aaa8d1
--- /dev/null
+++ b/modules/production_split/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.production_split.tests.test_production_split import suite # noqa: E501
+except ImportError:
+ from .test_production_split import suite
+
+__all__ = ['suite']
diff --git a/modules/production_split/tests/test_production_split.py b/modules/production_split/tests/test_production_split.py
new file mode 100644
index 0000000000..977f3eab8d
--- /dev/null
+++ b/modules/production_split/tests/test_production_split.py
@@ -0,0 +1,52 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import unittest
+
+from unittest.mock import patch
+
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.tests.test_tryton import suite as test_suite
+from trytond.pool import Pool
+
+
+class ProductionSplitTestCase(ModuleTestCase):
+ 'Test Production Split module'
+ module = 'production_split'
+
+ @with_transaction()
+ def test_split(self):
+ 'Test split'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Production = pool.get('production')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+
+ with patch.object(Production, 'save'), \
+ patch.object(Production, 'explode_bom'), \
+ patch.object(Production, 'copy') as copy:
+ copy.side_effect = lambda l, values: [
+ Production(**values) for r in l]
+ for quantity, quantity_split, count, quantities in [
+ (10, 5, None, [5, 5]),
+ (13, 5, None, [5, 5, 3]),
+ (7, 8, None, [7]),
+ (20, 5, 2, [5, 5, 10]),
+ (20, 5, 4, [5, 5, 5, 5]),
+ ]:
+ production = Production()
+ production.quantity = quantity
+ production.uom = unit
+
+ productions = production.split(
+ quantity_split, unit, count=count)
+ self.assertEqual(
+ [p.quantity for p in productions], quantities)
+
+
+def suite():
+ suite = test_suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductionSplitTestCase))
+ return suite
diff --git a/modules/production_split/tox.ini b/modules/production_split/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/production_split/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/production_split/tryton.cfg b/modules/production_split/tryton.cfg
new file mode 100644
index 0000000000..8e63b677d8
--- /dev/null
+++ b/modules/production_split/tryton.cfg
@@ -0,0 +1,7 @@
+[tryton]
+version=6.0.1
+depends:
+ ir
+ production
+xml:
+ production.xml
diff --git a/modules/production_split/view/production_form.xml b/modules/production_split/view/production_form.xml
new file mode 100644
index 0000000000..7e3446437c
--- /dev/null
+++ b/modules/production_split/view/production_form.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_split/view/split_start_form.xml b/modules/production_split/view/split_start_form.xml
new file mode 100644
index 0000000000..df7c25c065
--- /dev/null
+++ b/modules/production_split/view/split_start_form.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/modules/production_work/.drone.yml b/modules/production_work/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/production_work/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/production_work/.flake8 b/modules/production_work/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/production_work/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/production_work/CHANGELOG b/modules/production_work/CHANGELOG
new file mode 100644
index 0000000000..50b3a93cb3
--- /dev/null
+++ b/modules/production_work/CHANGELOG
@@ -0,0 +1,36 @@
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+* Add start and stop buttons on works
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+* Make work center not required on request and draft states
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+
+Version 4.0.0 - 2016-05-02
+* Initial release
diff --git a/modules/production_work/COPYRIGHT b/modules/production_work/COPYRIGHT
new file mode 100644
index 0000000000..adc01a3b85
--- /dev/null
+++ b/modules/production_work/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2015-2021 Cédric Krier.
+Copyright (C) 2015-2021 B2CK SPRL.
+Copyright (C) 2013-2015 NaN·tic.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/production_work/LICENSE b/modules/production_work/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/production_work/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/production_work/MANIFEST.in b/modules/production_work/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/production_work/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/production_work/README.rst b/modules/production_work/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/production_work/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/production_work/__init__.py b/modules/production_work/__init__.py
new file mode 100644
index 0000000000..8accc56477
--- /dev/null
+++ b/modules/production_work/__init__.py
@@ -0,0 +1,19 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import work
+from . import routing
+from . import production
+
+
+def register():
+ Pool.register(
+ work.WorkCenterCategory,
+ work.WorkCenter,
+ work.Work,
+ work.WorkCycle,
+ routing.Operation,
+ routing.RoutingStep,
+ production.Production,
+ module='production_work', type_='model')
diff --git a/modules/production_work/doc/index.rst b/modules/production_work/doc/index.rst
new file mode 100644
index 0000000000..6748aa6f31
--- /dev/null
+++ b/modules/production_work/doc/index.rst
@@ -0,0 +1,64 @@
+Production Work Module
+######################
+
+The production work module allows to manage work order for each production.
+It also adds in the production cost for the work cost.
+
+Work Center
+***********
+
+Work center are places in the warehouse where production operations are
+performed. They can be organized in a tree structure and each center can be
+linked to a category. A cost can be defined on the work center with two
+methods: `Per Cycle` or `Per Hour`.
+
+Work
+****
+
+Works define for a production which operation to do at which work center.
+They also contains the number of cycles consumed to perform the operation.
+
+The work can be in one of these states:
+
+* Request
+
+ The linked production is still waiting.
+
+* Draft
+
+ The production has started but no cycle was already consumed.
+
+* Waiting
+
+ There are some draft cycles planned.
+
+* Running
+
+ There is at least one running cycle.
+
+* Finished
+
+ All the cycles are done (or cancelled).
+
+* Done
+
+ The production is done.
+
+The works are created on the waiting production using the linked routing. For
+each step of the routing, a work is created with the operation. The work center
+is set if the operation has a work center category, by choosing a children work
+center of this category. Or if the operation has no category, it is the
+production work center that is used.
+
+Cycle
+*****
+
+Cycles are used to count the consumption and the duration of the work. It also
+records the effective cost from the work center.
+
+The cycle can be in one of this states:
+
+* Draft
+* Running
+* Done
+* Cancelled
diff --git a/modules/production_work/exceptions.py b/modules/production_work/exceptions.py
new file mode 100644
index 0000000000..02315e8fa1
--- /dev/null
+++ b/modules/production_work/exceptions.py
@@ -0,0 +1,8 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.exceptions import UserError
+
+
+class PickerError(UserError):
+ pass
diff --git a/modules/production_work/locale/bg.po b/modules/production_work/locale/bg.po
new file mode 100644
index 0000000000..c15ea3583a
--- /dev/null
+++ b/modules/production_work/locale/bg.po
@@ -0,0 +1,305 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Зачади"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Активен"
+
+#, fuzzy
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Управление на производство"
+
+#, fuzzy
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Щат"
+
+#, fuzzy
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+#, fuzzy
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Категория мер. ед."
+
+#, fuzzy
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Наследници"
+
+#, fuzzy
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Начин на остойностяване"
+
+#, fuzzy
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Фабрична цена"
+
+#, fuzzy
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Условие за плащане"
+
+#, fuzzy
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Родител"
+
+#, fuzzy
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+#, fuzzy
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Условие за плащане"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Цена"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Продължителност"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Щат"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Задача"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Зачади"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Заявка"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "В изпълнение"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Очакване"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Зачади"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Приключено"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Заявка"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "В изпълнение"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Очакване"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Приключено"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "В изпълнение"
diff --git a/modules/production_work/locale/ca.po b/modules/production_work/locale/ca.po
new file mode 100644
index 0000000000..6f4db747ca
--- /dev/null
+++ b/modules/production_work/locale/ca.po
@@ -0,0 +1,271 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Centre de treball"
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Treballs"
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Categoria centre de treball"
+
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Cicles actius"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "Cicles"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Operació"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Centre de treball"
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Categoria centre de treball"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Fills"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Mètode de cost"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Preu de cost"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Durada"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Treball"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Categories de centre de treball"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Centres de treball"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Centres de treball"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Treballs"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Sol·licitud"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "En execució"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+"Per eliminar el treball \"%(work)s\" ha d'estar en estat \"sol·licitud\" o "
+"\"borrador\"."
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+"Per poder finalitzar la producció \"%(production)s\", el treball "
+"\"%(work)s\" ha d'estar finalitzat."
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+"No s'ha pogut trobar un centre de treball de la categoría \"%(category)s\" "
+"dins de \"%(parent)s\"."
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Finalitza"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Executa"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr "Inicia"
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr "Atura"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Categories de centre de treball"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Centres de treball"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Centres de treball"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Treballs"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr "Treball de producció"
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Centre de treball"
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Categoria centre de treball"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr "Cicle de treball"
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr "Acabat"
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Sol·licitud"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "En execució"
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr "Per cicle"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr "Per hora"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "En execució"
diff --git a/modules/production_work/locale/cs.po b/modules/production_work/locale/cs.po
new file mode 100644
index 0000000000..793155e18a
--- /dev/null
+++ b/modules/production_work/locale/cs.po
@@ -0,0 +1,281 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr ""
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Works"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Request"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Running"
diff --git a/modules/production_work/locale/de.po b/modules/production_work/locale/de.po
new file mode 100644
index 0000000000..79216120bc
--- /dev/null
+++ b/modules/production_work/locale/de.po
@@ -0,0 +1,271 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Arbeitsplatz"
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Arbeitsaufträge"
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Arbeitsplatzkategorie"
+
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Aktive Zyklen"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "Zyklen"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Arbeitsvorgang"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Produktionsauftrag"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Warenlager"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Arbeitsplatz"
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Arbeitsplatzkategorie"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Untergeordnet (Arbeitsplätze)"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Kostenmethode"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Einstandspreis"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Übergeordnet (Arbeitsplatz)"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Warenlager"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Dauer"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Arbeitsauftrag"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Arbeitsplatzkategorien"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Arbeitsplätze"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Arbeitsplätze"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Arbeitsaufträge"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Angefordert"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "In Ausführung"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+"Damit der Arbeitsauftrag \"%(work)s\" gelöscht werden kann, muss er im "
+"Status \"Angefordert\" oder \"Entwurf\" sein."
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+"Damit der Produktionsauftrag \"%(production)s\" abgeschlossen werden kann, "
+"muss zunächst der Arbeitsauftrag \"%(work)s\" beendet werden."
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+"Es konnte kein Arbeitplatz der Kategorie \"%(category)s\" unter "
+"\"%(parent)s\" gefunden werden."
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Durchführen"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Ausführen"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr "Start"
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr "Stop"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Arbeitsplatzkategorien"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Arbeitsplätze"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Arbeitsplätze"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Arbeitsaufträge"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr "Arbeitsgang"
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Arbeitsplatz"
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Arbeitsplatzkategorie"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr "Arbeitszyklus"
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr "Beendet"
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Angefordert"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "In Ausführung"
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr "Pro Zyklus"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr "Pro Stunde"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "In Ausführung"
diff --git a/modules/production_work/locale/es.po b/modules/production_work/locale/es.po
new file mode 100644
index 0000000000..dd2fed9ed0
--- /dev/null
+++ b/modules/production_work/locale/es.po
@@ -0,0 +1,271 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Centro de trabajo"
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Trabajos"
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Categoría centro de trabajo"
+
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Ciclos activos"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "Ciclos"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Operación"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Centro de trabajo"
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Categoría centro de trabajo"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Hijos"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Método de coste"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Precio de coste"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Coste"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Duración"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Trabajo"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Categorías de centro de trabajo"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Centros de trabajo"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Centros de trabajo"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Trabajos"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "En ejecución"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+"Para eliminar el trabajo \"%(work)s\" tiene que estar en estado "
+"\"solicitud\" o \"borrador\"."
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+"Para finalizar la producción \"%(production)s\", el trabajo \"%(work)s\" "
+"debe estar finalizado."
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+"No se ha podido encontrar un centro de trabajo de la categoría "
+"\"%(category)s\" dentro de \"%(parent)s\"."
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Finalizar"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Ejecutar"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr "Iniciar"
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr "Parar"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Categorías de centro de trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Centros de trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Centros de trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Trabajos"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr "Trabajo de producción"
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Centro de trabajo"
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Categoría centro de trabajo"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr "Ciclo de trabajo"
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr "Terminado"
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "En ejecución"
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr "Por ciclo"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr "Por hora"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "En ejecución"
diff --git a/modules/production_work/locale/es_419.po b/modules/production_work/locale/es_419.po
new file mode 100644
index 0000000000..b373eb36bc
--- /dev/null
+++ b/modules/production_work/locale/es_419.po
@@ -0,0 +1,268 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr ""
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr ""
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Categoría de centro de trabajo"
+
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr ""
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr ""
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Categoría de centro de trabajo"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Método de costo"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Precio de costo"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Costo"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Categoría de centro de trabajo"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Realizar"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Categoría de centro de trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr ""
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr ""
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Categoría de centro de trabajo"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr ""
diff --git a/modules/production_work/locale/et.po b/modules/production_work/locale/et.po
new file mode 100644
index 0000000000..3f0f9064c4
--- /dev/null
+++ b/modules/production_work/locale/et.po
@@ -0,0 +1,269 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Töökoht"
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Tööd"
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Töökoha kategooria"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Tsüklis"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "Tsükkel"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Operatsioon"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Tootmine"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Töökoht"
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Töökoha kategooria"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Kategooria"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Alamjaotus"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Kulumeetod"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Ostuhind"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Nimi"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Ülem"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Nimetus"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Kulu"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Kestvus"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Töö"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Töökoha kategooria"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Töökohad"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Töökohad"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Tööd"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Päringud"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Töös"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Teha"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Käivita"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Töökoha kategooriad"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Töökohad"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Töökohad"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Tööd"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr "Tootmise töö"
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Töökoht"
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Töökoha kategooria"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr "Töötsükkel"
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr "Lõpetatud"
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Päring"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Jooksev"
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr "Tsüklis"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr "Tunnis"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Jooksev"
diff --git a/modules/production_work/locale/fa.po b/modules/production_work/locale/fa.po
new file mode 100644
index 0000000000..fbee0977d5
--- /dev/null
+++ b/modules/production_work/locale/fa.po
@@ -0,0 +1,266 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "مرکز کار"
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "کارها"
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "دسته بندی مرکز کار"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "در هر چرخه"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "چرخه"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "عملگر"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "تهیه کننده"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "مرکز کار"
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "دسته بندی مرکز کار"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "دستهبندی"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "زیر مجموعه"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "روش هزینه"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "ارزش بها"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "منبع"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "هزینه"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "مدت زمان"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "کار"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "دسته بندی مرکز کار"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "مراکز کار"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "مراکز کار"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "کارها"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "درخواست"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "در حال اجرا"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "در انتظار"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "دسته بندی مرکز کار"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "مراکز کار"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "مراکز کار"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "کارها"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr "کار تولید"
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "مرکز کار"
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "دسته بندی مرکز کار"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr "چرخه کاری"
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr "پایان یافته"
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "درخواست"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "در حال اجرا"
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "در انتظار"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr "در هر چرخه"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr "در هر ساعت"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "در حال اجرا"
diff --git a/modules/production_work/locale/fi.po b/modules/production_work/locale/fi.po
new file mode 100644
index 0000000000..8658194889
--- /dev/null
+++ b/modules/production_work/locale/fi.po
@@ -0,0 +1,279 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr ""
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Works"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Request"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Running"
diff --git a/modules/production_work/locale/fr.po b/modules/production_work/locale/fr.po
new file mode 100644
index 0000000000..21c36477e9
--- /dev/null
+++ b/modules/production_work/locale/fr.po
@@ -0,0 +1,271 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Poste de charge"
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Travaux"
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Catégorie de Poste de charge"
+
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Cycles actifs"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "Cycles"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Opération"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Poste de charge"
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Catégorie de Poste de charge"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Enfants"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Méthode de coût"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Prix de revient"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Coût"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Durée"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Travail"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Catégories de poste de charge"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Postes de charge"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Postes de charge"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Travaux"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "Tous"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Demandes"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "En cours"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "En attentes"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+"Pour supprimer le travail « %(work)s », il doit être dans l'état « requête »"
+" ou « brouillon »."
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+"Pour terminer la production « %(production)s », le travail « %(travail)s » "
+"doit être terminé."
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+"Impossible de trouver un poste de travail de la catégorie « %(category)s » "
+"dans « %(parent)s »."
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Effectuer"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Lancer"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr "Démarrer"
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr "Arrêter"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Catégories de poste de charge"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Postes de charge"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Postes de charge"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Travaux"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr "Travail de production"
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Poste de charge"
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Catégorie de Poste de charge"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr "Cycle de travail"
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Terminé"
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr "Fini"
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Demande"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "En cours"
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr "Par Cycle"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr "Par Heure"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Terminé"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "En cours"
diff --git a/modules/production_work/locale/hu.po b/modules/production_work/locale/hu.po
new file mode 100644
index 0000000000..4cee2a540d
--- /dev/null
+++ b/modules/production_work/locale/hu.po
@@ -0,0 +1,301 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Tevékenység"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Aktív"
+
+#, fuzzy
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Társaság"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Termelés"
+
+#, fuzzy
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Állapot"
+
+#, fuzzy
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+#, fuzzy
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Kategória"
+
+#, fuzzy
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Gyermek (csomag)"
+
+#, fuzzy
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Társaság"
+
+#, fuzzy
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Költségmódszer"
+
+#, fuzzy
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Költség"
+
+#, fuzzy
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Név"
+
+#, fuzzy
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Szülő (csomag)"
+
+#, fuzzy
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+#, fuzzy
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Név"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Költség"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Időtartam"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Állapot"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Tevékenység"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Tevékenység"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "Összes"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Request"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Tevékenység"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Kész"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Kész"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Running"
diff --git a/modules/production_work/locale/id.po b/modules/production_work/locale/id.po
new file mode 100644
index 0000000000..48b8d736a1
--- /dev/null
+++ b/modules/production_work/locale/id.po
@@ -0,0 +1,269 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr ""
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr ""
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Aktif"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr ""
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr ""
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Cabang"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Induk"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr ""
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr ""
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr ""
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr ""
diff --git a/modules/production_work/locale/it.po b/modules/production_work/locale/it.po
new file mode 100644
index 0000000000..9d7c671fd7
--- /dev/null
+++ b/modules/production_work/locale/it.po
@@ -0,0 +1,289 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Attivo"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Operazione"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Categoria"
+
+#, fuzzy
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Figlio"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Durata"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Lavoro"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Richiesta"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "In funzione"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "In attesa"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Richiesta"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "In funzione"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "In attesa"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "In funzione"
diff --git a/modules/production_work/locale/lo.po b/modules/production_work/locale/lo.po
new file mode 100644
index 0000000000..e0126383d6
--- /dev/null
+++ b/modules/production_work/locale/lo.po
@@ -0,0 +1,301 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "ເຮັດວຽກ"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "ໃຊ້ຢູ່"
+
+#, fuzzy
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "ການດຳເນີນການ"
+
+#, fuzzy
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "ໝວດ"
+
+#, fuzzy
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "ໝວດຍ່ອຍ"
+
+#, fuzzy
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "ວິທີຄິດໄລ່"
+
+#, fuzzy
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "ລາຄາຄິດໄລ່"
+
+#, fuzzy
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+#, fuzzy
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "ຮ່ວງ"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "ກຳນົດເວລາ"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "ເຮັດວຽກ"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "ເຮັດວຽກ"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "ກຳລັງດຳເນີນງານ"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "ເຮັດວຽກ"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "ກຳລັງດຳເນີນງານ"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "ກຳລັງດຳເນີນງານ"
diff --git a/modules/production_work/locale/lt.po b/modules/production_work/locale/lt.po
new file mode 100644
index 0000000000..04e24373f4
--- /dev/null
+++ b/modules/production_work/locale/lt.po
@@ -0,0 +1,281 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr ""
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Works"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Request"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Running"
diff --git a/modules/production_work/locale/nl.po b/modules/production_work/locale/nl.po
new file mode 100644
index 0000000000..eb2d7379e2
--- /dev/null
+++ b/modules/production_work/locale/nl.po
@@ -0,0 +1,274 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Werkplaats"
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Werken"
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Werkplaatscategorie"
+
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Actieve cycli"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "cyclisch"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Proces"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Werkplaats"
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Werkplaatscategorie"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Onderliggende niveaus"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Kostprijsmethode"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Kostprijs"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Looptijd"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Werk"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Werkplekcategorieën"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Wertkplaats"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Wertkplaats"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Werken"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Verzoek"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "in uitvoering"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+"Als u het werk \"%(work)s\" wilt verwijderen, moet dit de status \"verzoek\""
+" of \"concept\" hebben."
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+"Om de productie \"%(production)s\" te voltooien, moet het werk \"%(work)s\" "
+"voltooid zijn."
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+"Kan geen werkstation vinden uit de categorie \"%(category)s\" in "
+"\"%(parent)s\"."
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "uitvoeren"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr "Begin"
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr "stop"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Werkplekcategorieën"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Wertkplaats"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Wertkplaats"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Werken"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr "Productiewerk"
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Werkplaats"
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Werkplaatscategorie"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr "Werk cyclus"
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr "Afgewerkt"
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Verzoek"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "in uitvoering"
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr "Per cyclus"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr "Per uur"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "in uitvoering"
diff --git a/modules/production_work/locale/pl.po b/modules/production_work/locale/pl.po
new file mode 100644
index 0000000000..b4386e153b
--- /dev/null
+++ b/modules/production_work/locale/pl.po
@@ -0,0 +1,291 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Cykle"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "Cykle"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Operacja"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Produkcja"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+#, fuzzy
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Kategoria"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Cena kosztu"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Koszt"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Czas trwania"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Stan"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Request"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Uruchomione"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Uruchomione"
diff --git a/modules/production_work/locale/pt.po b/modules/production_work/locale/pt.po
new file mode 100644
index 0000000000..a0ca965c37
--- /dev/null
+++ b/modules/production_work/locale/pt.po
@@ -0,0 +1,279 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Centro de Trabalho"
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Trabalhos"
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Categoria de Centro de Trabalho"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Por Ciclo"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "Ciclos"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Operação"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Produção"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Centro de Trabalho"
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Categoria de Centro de Trabalho"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Filhos"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Método de Custo"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Preço de Custo"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Pai"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Custo"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Duração"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Trabalho"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr "Trabalho de Produção"
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Centro de Trabalho"
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Categoria de Centro de Trabalho"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr "Ciclo de Trabalho"
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr "Concluído"
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Solicitar"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Em execução"
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Esperando"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr "Por Ciclo"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr "Por Hora"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Em execução"
diff --git a/modules/production_work/locale/ro.po b/modules/production_work/locale/ro.po
new file mode 100644
index 0000000000..220e141f3f
--- /dev/null
+++ b/modules/production_work/locale/ro.po
@@ -0,0 +1,265 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr ""
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr ""
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr ""
+
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr ""
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr ""
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr ""
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr ""
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Copii"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Cost"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Părinte"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Durata"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Stare"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr ""
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr ""
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr ""
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr ""
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr ""
diff --git a/modules/production_work/locale/ru.po b/modules/production_work/locale/ru.po
new file mode 100644
index 0000000000..802015341a
--- /dev/null
+++ b/modules/production_work/locale/ru.po
@@ -0,0 +1,306 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Работы"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Действующий"
+
+#, fuzzy
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Учет.орг."
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Производство"
+
+#, fuzzy
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Штат"
+
+#, fuzzy
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+#, fuzzy
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Категория ед. измерения"
+
+#, fuzzy
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Подчиненый"
+
+#, fuzzy
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Учет.орг."
+
+#, fuzzy
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Учет стоимости"
+
+#, fuzzy
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Цена за единицу"
+
+#, fuzzy
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Правило оплаты"
+
+#, fuzzy
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Предок"
+
+#, fuzzy
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+#, fuzzy
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Правило оплаты"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Стоимость"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Продолжительность"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Штат"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Работа"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Работы"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "Все"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Черновик"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Сообщение"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Выполняется"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Ожидание"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Работы"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Сообщение"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Выполняется"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Ожидание"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Отмененно"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Выполняется"
diff --git a/modules/production_work/locale/sl.po b/modules/production_work/locale/sl.po
new file mode 100644
index 0000000000..f4e2778256
--- /dev/null
+++ b/modules/production_work/locale/sl.po
@@ -0,0 +1,279 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Delovni center"
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Naloge"
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Kategorija delovnega centra"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Po ciklu"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "Cikli"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Operacija"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Proizvodnja"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Delovni center"
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Kategorija delovnega centra"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Kategorija"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Podcentri"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Obračun"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Strošek"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "Nadcenter"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Strošek"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Trajanje"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Naloga"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr "Naloga"
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Delovni center"
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Kategorija delovnega centra"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr "Delovni cikel"
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr "Končano"
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Zahtevek"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Tekoče"
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Čakajoče"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr "Po ciklu"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr "Po uri"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Tekoče"
diff --git a/modules/production_work/locale/tr.po b/modules/production_work/locale/tr.po
new file mode 100644
index 0000000000..6fdedcb51e
--- /dev/null
+++ b/modules/production_work/locale/tr.po
@@ -0,0 +1,279 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "İş İstasyonu"
+
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "İşler"
+
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "İş İstasyonu Kategorisi"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "Bir Çevrimde"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr "Çevrimler"
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr "Operasyon"
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr "Üretim"
+
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "Durum"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr "Depo"
+
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "İş İstasyonu"
+
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "İş İstasyonu Kategorisi"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr "Kategori"
+
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "Alt Seviye"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr "Maliyet Metodu"
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr "Maliyet Fiyatı"
+
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "Ad"
+
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "En Üst Seviye"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr "Depo"
+
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "Ad"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr "Maliyet"
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr "Süre"
+
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "Durum"
+
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "İş"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "Works"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr "Üretim İş"
+
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "İş İstasyonu"
+
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "İş İstasyonu Kategorisi"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr "İş Çevrimi"
+
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "Yapılmış"
+
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Taslak"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr "Bitmiş"
+
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "İstek"
+
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Çalışan"
+
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Bekleyen"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr "Bir Çevrimde"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr "Bir Saatte"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr "Vazgeçilmiş"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "Yapılmış"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Taslak"
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Çalışan"
diff --git a/modules/production_work/locale/zh_CN.po b/modules/production_work/locale/zh_CN.po
new file mode 100644
index 0000000000..3e1a321f9c
--- /dev/null
+++ b/modules/production_work/locale/zh_CN.po
@@ -0,0 +1,292 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production,works:"
+msgid "Works"
+msgstr "Works"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+#, fuzzy
+msgctxt "field:production.work,active_cycles:"
+msgid "Active Cycles"
+msgstr "启用"
+
+msgctxt "field:production.work,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production.work,cycles:"
+msgid "Cycles"
+msgstr ""
+
+msgctxt "field:production.work,operation:"
+msgid "Operation"
+msgstr ""
+
+msgctxt "field:production.work,production:"
+msgid "Production"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:production.work,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,work_center:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "field:production.work,work_center_category:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "field:production.work.center,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.center,children:"
+msgid "Children"
+msgstr "子项"
+
+msgctxt "field:production.work.center,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_method:"
+msgid "Cost Method"
+msgstr ""
+
+msgctxt "field:production.work.center,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.center,name:"
+msgid "Name"
+msgstr "纳木"
+
+#, fuzzy
+msgctxt "field:production.work.center,parent:"
+msgid "Parent"
+msgstr "上级"
+
+msgctxt "field:production.work.center,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.center.category,name:"
+msgid "Name"
+msgstr "纳木"
+
+msgctxt "field:production.work.cycle,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:production.work.cycle,duration:"
+msgid "Duration"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work.cycle,state:"
+msgid "State"
+msgstr "状态"
+
+#, fuzzy
+msgctxt "field:production.work.cycle,work:"
+msgid "Work"
+msgstr "Works"
+
+msgctxt "model:ir.action,name:act_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.action,name:act_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works"
+msgstr "工作"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_all"
+msgid "All"
+msgstr "全部"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_request"
+msgid "Request"
+msgstr "Request"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.action.act_window.domain,name:act_work_list_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "model:ir.message,text:msg_delete_request"
+msgid "To delete work \"%(work)s\" it must be in the \"request\" or \"draft\" state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_do_finished_work"
+msgid "To complete production \"%(production)s\", work \"%(work)s\" must be finished."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_work_center"
+msgid ""
+"Could not find a work center of category \"%(category)s\" under "
+"\"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_cycle_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:work_cycle_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:work_cycle_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.model.button,string:work_start_button"
+msgid "Start"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_stop_button"
+msgid "Stop"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_center_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_work_cycle_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_category_list"
+msgid "Work Center Categories"
+msgstr "Work Center Categories"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_list"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_center_tree"
+msgid "Work Centers"
+msgstr "Work Centers"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works"
+msgstr "工作"
+
+msgctxt "model:production.work,name:"
+msgid "Production Work"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:production.work.center,name:"
+msgid "Work Center"
+msgstr "Work Centers"
+
+#, fuzzy
+msgctxt "model:production.work.center.category,name:"
+msgid "Work Center Category"
+msgstr "Work Center Categories"
+
+msgctxt "model:production.work.cycle,name:"
+msgid "Work Cycle"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Done"
+msgstr "完成"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:production.work,state:"
+msgid "Finished"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Request"
+msgstr "Request"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Running"
+msgstr "Running"
+
+#, fuzzy
+msgctxt "selection:production.work,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Cycle"
+msgstr ""
+
+msgctxt "selection:production.work.center,cost_method:"
+msgid "Per Hour"
+msgstr ""
+
+msgctxt "selection:production.work.cycle,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Done"
+msgstr "完成"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:production.work.cycle,state:"
+msgid "Running"
+msgstr "Running"
diff --git a/modules/production_work/message.xml b/modules/production_work/message.xml
new file mode 100644
index 0000000000..6b2c018451
--- /dev/null
+++ b/modules/production_work/message.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Could not find a work center of category "%(category)s" under "%(parent)s".
+
+
+ To delete work "%(work)s" it must be in the "request" or "draft" state.
+
+
+ To complete production "%(production)s", work "%(work)s" must be finished.
+
+
+
diff --git a/modules/production_work/production.py b/modules/production_work/production.py
new file mode 100644
index 0000000000..5aa68639db
--- /dev/null
+++ b/modules/production_work/production.py
@@ -0,0 +1,146 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from decimal import Decimal
+
+from sql.aggregate import Sum
+
+from trytond.i18n import gettext
+from trytond.pool import PoolMeta, Pool
+from trytond.model import ModelView, Workflow, fields
+from trytond.model.exceptions import AccessError
+from trytond.pyson import Eval, Bool
+from trytond.transaction import Transaction
+
+from trytond.modules.product import round_price
+
+
+class Production(metaclass=PoolMeta):
+ __name__ = 'production'
+ work_center = fields.Many2One('production.work.center', 'Work Center',
+ states={
+ 'required': (Bool(Eval('routing'))
+ & (Eval('state') != 'request')),
+ 'invisible': ~Eval('routing'),
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ },
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ('warehouse', '=', Eval('warehouse', -1)),
+ ],
+ depends=['routing', 'company', 'warehouse', 'state'])
+ works = fields.One2Many('production.work', 'production', 'Works',
+ states={
+ 'readonly': Eval('state').in_(
+ ['request', 'draft', 'done', 'cancelled']),
+ },
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ],
+ depends=['state', 'company'])
+
+ def get_cost(self, name):
+ pool = Pool()
+ Work = pool.get('production.work')
+ Cycle = pool.get('production.work.cycle')
+ table = self.__table__()
+ work = Work.__table__()
+ cycle = Cycle.__table__()
+ cursor = Transaction().connection.cursor()
+
+ cost = super(Production, self).get_cost(name)
+
+ cursor.execute(*table.join(work, 'LEFT',
+ condition=work.production == table.id
+ ).join(cycle, 'LEFT', condition=cycle.work == work.id
+ ).select(Sum(cycle.cost),
+ where=(cycle.state == 'done')
+ & (table.id == self.id)))
+ cycle_cost, = cursor.fetchone()
+ if cycle_cost is not None:
+ # SQLite uses float for SUM
+ if not isinstance(cycle_cost, Decimal):
+ cycle_cost = Decimal(cycle_cost)
+ cost += cycle_cost
+
+ return round_price(cost)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, productions):
+ pool = Pool()
+ Work = pool.get('production.work')
+ super(Production, cls).draft(productions)
+ Work.delete([w for p in productions for w in p.works
+ if w.state in ['request', 'draft']])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, productions):
+ pool = Pool()
+ Work = pool.get('production.work')
+ super(Production, cls).cancel(productions)
+ Work.delete([w for p in productions for w in p.works
+ if w.state in ['request', 'draft']])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('waiting')
+ def wait(cls, productions):
+ pool = Pool()
+ Work = pool.get('production.work')
+ WorkCenter = pool.get('production.work.center')
+
+ draft_productions = [p for p in productions if p.state == 'draft']
+
+ super(Production, cls).wait(productions)
+
+ work_center_picker = WorkCenter.get_picker()
+ works = []
+ for production in draft_productions:
+ works.extend(production.get_works(work_center_picker))
+ Work.save(works)
+ Work.set_state([w for p in productions for w in p.works])
+
+ def get_works(self, work_center_picker):
+ if not self.routing:
+ return []
+ return [step.get_work(self, work_center_picker)
+ for step in self.routing.steps]
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('running')
+ def run(cls, productions):
+ pool = Pool()
+ Work = pool.get('production.work')
+
+ super(Production, cls).run(productions)
+
+ Work.set_state([w for p in productions for w in p.works])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def done(cls, productions):
+ pool = Pool()
+ Work = pool.get('production.work')
+ for production in productions:
+ for work in production.works:
+ if work.state != 'finished':
+ raise AccessError(
+ gettext('production_work.msg_do_finished_work',
+ production=production.rec_name,
+ work=work.rec_name))
+ super(Production, cls).done(productions)
+ Work.set_state([w for p in productions for w in p.works])
+
+ @classmethod
+ def copy(cls, productions, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('works')
+ return super().copy(productions, default=default)
diff --git a/modules/production_work/production.xml b/modules/production_work/production.xml
new file mode 100644
index 0000000000..2c11713a6d
--- /dev/null
+++ b/modules/production_work/production.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ production
+
+ production_list
+
+
+
+ production
+
+ production_form
+
+
+
diff --git a/modules/production_work/routing.py b/modules/production_work/routing.py
new file mode 100644
index 0000000000..e66754e967
--- /dev/null
+++ b/modules/production_work/routing.py
@@ -0,0 +1,31 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import PoolMeta, Pool
+from trytond.model import fields
+
+
+class Operation(metaclass=PoolMeta):
+ __name__ = 'production.routing.operation'
+ work_center_category = fields.Many2One('production.work.center.category',
+ 'Work Center Category')
+
+
+class RoutingStep(metaclass=PoolMeta):
+ __name__ = 'production.routing.step'
+
+ def get_work(self, production, work_center_picker):
+ "Return work instance for the production using the work center picker"
+ pool = Pool()
+ Work = pool.get('production.work')
+
+ work = Work()
+ work.sequence = self.sequence
+ work.operation = self.operation
+ work.production = production
+ work.company = production.company
+ if self.operation.work_center_category:
+ work.work_center = work_center_picker(
+ production.work_center, self.operation.work_center_category)
+ else:
+ work.work_center = production.work_center
+ return work
diff --git a/modules/production_work/routing.xml b/modules/production_work/routing.xml
new file mode 100644
index 0000000000..53fa9f9048
--- /dev/null
+++ b/modules/production_work/routing.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ production.routing.operation
+
+ operation_list
+
+
+ production.routing.operation
+
+ operation_form
+
+
+
diff --git a/modules/production_work/setup.py b/modules/production_work/setup.py
new file mode 100755
index 0000000000..330974cc40
--- /dev/null
+++ b/modules/production_work/setup.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_production_work'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = ['python-sql >= 0.4']
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [get_require_version('proteus')]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module for production work',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/production_work',
+ },
+ keywords='tryton production work',
+ package_dir={'trytond.modules.production_work': '.'},
+ packages=(
+ ['trytond.modules.production_work']
+ + ['trytond.modules.production_work.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.production_work': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ production_work = trytond.modules.production_work
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/production_work/tests/__init__.py b/modules/production_work/tests/__init__.py
new file mode 100644
index 0000000000..b957db350b
--- /dev/null
+++ b/modules/production_work/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.production_work.tests.test_production_work import suite # noqa: E501
+except ImportError:
+ from .test_production_work import suite
+
+__all__ = ['suite']
diff --git a/modules/production_work/tests/scenario_production_work.rst b/modules/production_work/tests/scenario_production_work.rst
new file mode 100644
index 0000000000..6d188aa376
--- /dev/null
+++ b/modules/production_work/tests/scenario_production_work.rst
@@ -0,0 +1,259 @@
+========================
+Production Work Scenario
+========================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> today = datetime.date.today()
+
+Activate modules::
+
+ >>> config = activate_modules('production_work')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Product = Model.get('product.product')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.producible = True
+ >>> template.list_price = Decimal(30)
+ >>> product, = template.products
+ >>> product.cost_price = Decimal(20)
+ >>> template.save()
+ >>> product, = template.products
+
+Create Components::
+
+ >>> template1 = ProductTemplate()
+ >>> template1.name = 'component 1'
+ >>> template1.default_uom = unit
+ >>> template1.type = 'goods'
+ >>> template1.list_price = Decimal(5)
+ >>> component1, = template1.products
+ >>> component1.cost_price = Decimal(1)
+ >>> template1.save()
+ >>> component1, = template1.products
+
+ >>> template2 = ProductTemplate()
+ >>> template2.name = 'component 2'
+ >>> template2.default_uom = unit
+ >>> template2.type = 'goods'
+ >>> template2.list_price = Decimal(5)
+ >>> component2, = template2.products
+ >>> component2.cost_price = Decimal(1)
+ >>> template2.save()
+ >>> component2, = template2.products
+
+Create work centers::
+
+ >>> WorkCenter = Model.get('production.work.center')
+ >>> WorkCenterCategory = Model.get('production.work.center.category')
+ >>> category1 = WorkCenterCategory(name='Category 1')
+ >>> category1.save()
+ >>> category2 = WorkCenterCategory(name='Category 2')
+ >>> category2.save()
+ >>> center_root = WorkCenter(name='Root')
+ >>> center_root.save()
+ >>> center1 = WorkCenter(name='Center 1')
+ >>> center1.parent = center_root
+ >>> center1.category = category1
+ >>> center1.cost_price = Decimal('10')
+ >>> center1.cost_method = 'cycle'
+ >>> center1.save()
+ >>> center2 = WorkCenter(name='Center 2')
+ >>> center2.parent = center_root
+ >>> center2.category = category2
+ >>> center2.cost_price = Decimal('5')
+ >>> center2.cost_method = 'hour'
+ >>> center2.save()
+
+Create Bill of Material and Routing::
+
+ >>> BOM = Model.get('production.bom')
+ >>> BOMInput = Model.get('production.bom.input')
+ >>> BOMOutput = Model.get('production.bom.output')
+ >>> bom = BOM(name='product')
+ >>> input1 = BOMInput()
+ >>> bom.inputs.append(input1)
+ >>> input1.product = component1
+ >>> input1.quantity = 1
+ >>> input2 = BOMInput()
+ >>> bom.inputs.append(input2)
+ >>> input2.product = component2
+ >>> input2.quantity = 1
+ >>> output = BOMOutput()
+ >>> bom.outputs.append(output)
+ >>> output.product = product
+ >>> output.quantity = 1
+ >>> bom.save()
+
+ >>> Routing = Model.get('production.routing')
+ >>> Operation = Model.get('production.routing.operation')
+ >>> operation1 = Operation(name='Operation 1')
+ >>> operation1.work_center_category = category1
+ >>> operation1.save()
+ >>> operation2 = Operation(name='Operation 2')
+ >>> operation2.work_center_category = category2
+ >>> operation2.save()
+ >>> routing = Routing(name='product')
+ >>> routing.boms.append(bom)
+ >>> step1 = routing.steps.new(operation=operation1)
+ >>> step2 = routing.steps.new(operation=operation2)
+ >>> routing.save()
+
+ >>> ProductBom = Model.get('product.product-production.bom')
+ >>> product.boms.append(ProductBom(bom=bom, routing=routing))
+ >>> product.save()
+
+Create an Inventory::
+
+ >>> Inventory = Model.get('stock.inventory')
+ >>> InventoryLine = Model.get('stock.inventory.line')
+ >>> Location = Model.get('stock.location')
+ >>> storage, = Location.find([
+ ... ('code', '=', 'STO'),
+ ... ])
+ >>> inventory = Inventory()
+ >>> inventory.location = storage
+ >>> inventory_line1 = InventoryLine()
+ >>> inventory.lines.append(inventory_line1)
+ >>> inventory_line1.product = component1
+ >>> inventory_line1.quantity = 10
+ >>> inventory_line2 = InventoryLine()
+ >>> inventory.lines.append(inventory_line2)
+ >>> inventory_line2.product = component2
+ >>> inventory_line2.quantity = 10
+ >>> inventory.click('confirm')
+ >>> inventory.state
+ 'done'
+
+Make a production::
+
+ >>> Production = Model.get('production')
+ >>> production = Production()
+ >>> production.product = product
+ >>> production.bom = bom
+ >>> production.routing = routing
+ >>> production.work_center = center_root
+ >>> production.quantity = 1
+ >>> production.click('wait')
+ >>> production.state
+ 'waiting'
+ >>> production.cost
+ Decimal('2.0000')
+
+Test works::
+
+ >>> work1, work2 = production.works
+ >>> work1.operation == operation1
+ True
+ >>> work1.work_center == center1
+ True
+ >>> work1.state
+ 'request'
+ >>> work2.operation == operation2
+ True
+ >>> work2.work_center == center2
+ True
+ >>> work2.state
+ 'request'
+
+Run the production::
+
+ >>> production.click('assign_try')
+ True
+ >>> production.click('run')
+ >>> production.state
+ 'running'
+
+Test works::
+
+ >>> work1, work2 = production.works
+ >>> work1.state
+ 'draft'
+ >>> work2.state
+ 'draft'
+
+Run works::
+
+ >>> cycle1 = work1.cycles.new()
+ >>> cycle1.click('run')
+ >>> cycle1.state
+ 'running'
+ >>> work1.reload()
+ >>> work1.state
+ 'running'
+ >>> cycle1.click('do')
+ >>> cycle1.state
+ 'done'
+ >>> work1.reload()
+ >>> work1.state
+ 'finished'
+ >>> cycle2 = work2.cycles.new()
+ >>> cycle2.click('cancel')
+ >>> cycle2.state
+ 'cancelled'
+ >>> work2.reload()
+ >>> work2.state
+ 'draft'
+ >>> work2.click('start')
+ >>> cycle2, = [c for c in work2.active_cycles]
+ >>> cycle2.duration = datetime.timedelta(hours=1)
+ >>> cycle2.save()
+ >>> work2.click('stop')
+ >>> work2.state
+ 'finished'
+ >>> cycle2.reload()
+ >>> cycle2.state
+ 'done'
+
+Add an extra work::
+
+ >>> work2b = production.works.new()
+ >>> work2b.operation = operation2
+ >>> work2b.work_center = center2
+ >>> production.save()
+ >>> work2b = production.works[-1]
+
+ >>> work2b.state
+ 'draft'
+
+And delete the extra work::
+
+ >>> work2b.delete()
+
+Check production cost::
+
+ >>> production.reload()
+ >>> production.cost
+ Decimal('17.0000')
+
+Do the production::
+
+ >>> production.click('done')
+ >>> production.state
+ 'done'
+
+Work is now done::
+
+ >>> work2.reload()
+ >>> work2.state
+ 'done'
diff --git a/modules/production_work/tests/test_production_work.py b/modules/production_work/tests/test_production_work.py
new file mode 100644
index 0000000000..d42c31f46a
--- /dev/null
+++ b/modules/production_work/tests/test_production_work.py
@@ -0,0 +1,26 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import unittest
+import doctest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import ModuleTestCase
+from trytond.tests.test_tryton import doctest_teardown
+from trytond.tests.test_tryton import doctest_checker
+
+from trytond.modules.company.tests import CompanyTestMixin
+
+
+class ProductionWorkTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test Production Work module'
+ module = 'production_work'
+
+
+def suite():
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductionWorkTestCase))
+ suite.addTests(doctest.DocFileSuite('scenario_production_work.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ return suite
diff --git a/modules/production_work/tox.ini b/modules/production_work/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/production_work/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/production_work/tryton.cfg b/modules/production_work/tryton.cfg
new file mode 100644
index 0000000000..a3aac5e459
--- /dev/null
+++ b/modules/production_work/tryton.cfg
@@ -0,0 +1,14 @@
+[tryton]
+version=6.0.1
+depends:
+ company
+ ir
+ product
+ production
+ production_routing
+ stock
+xml:
+ work.xml
+ routing.xml
+ production.xml
+ message.xml
diff --git a/modules/production_work/view/operation_form.xml b/modules/production_work/view/operation_form.xml
new file mode 100644
index 0000000000..70d56f1874
--- /dev/null
+++ b/modules/production_work/view/operation_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/production_work/view/operation_list.xml b/modules/production_work/view/operation_list.xml
new file mode 100644
index 0000000000..1b019d3074
--- /dev/null
+++ b/modules/production_work/view/operation_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_work/view/production_form.xml b/modules/production_work/view/production_form.xml
new file mode 100644
index 0000000000..5193959baf
--- /dev/null
+++ b/modules/production_work/view/production_form.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/production_work/view/production_list.xml b/modules/production_work/view/production_list.xml
new file mode 100644
index 0000000000..dab5a73e42
--- /dev/null
+++ b/modules/production_work/view/production_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_work/view/work_center_category_form.xml b/modules/production_work/view/work_center_category_form.xml
new file mode 100644
index 0000000000..3e61cab53d
--- /dev/null
+++ b/modules/production_work/view/work_center_category_form.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/modules/production_work/view/work_center_category_list.xml b/modules/production_work/view/work_center_category_list.xml
new file mode 100644
index 0000000000..b4d89538b1
--- /dev/null
+++ b/modules/production_work/view/work_center_category_list.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/modules/production_work/view/work_center_form.xml b/modules/production_work/view/work_center_form.xml
new file mode 100644
index 0000000000..84189ecdc9
--- /dev/null
+++ b/modules/production_work/view/work_center_form.xml
@@ -0,0 +1,23 @@
+
+
+
diff --git a/modules/production_work/view/work_center_list.xml b/modules/production_work/view/work_center_list.xml
new file mode 100644
index 0000000000..61c24206d1
--- /dev/null
+++ b/modules/production_work/view/work_center_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_work/view/work_center_tree.xml b/modules/production_work/view/work_center_tree.xml
new file mode 100644
index 0000000000..6de974f880
--- /dev/null
+++ b/modules/production_work/view/work_center_tree.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_work/view/work_cycle_form.xml b/modules/production_work/view/work_cycle_form.xml
new file mode 100644
index 0000000000..5a573aab82
--- /dev/null
+++ b/modules/production_work/view/work_cycle_form.xml
@@ -0,0 +1,17 @@
+
+
+
diff --git a/modules/production_work/view/work_cycle_list.xml b/modules/production_work/view/work_cycle_list.xml
new file mode 100644
index 0000000000..6d848921f9
--- /dev/null
+++ b/modules/production_work/view/work_cycle_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_work/view/work_form.xml b/modules/production_work/view/work_form.xml
new file mode 100644
index 0000000000..3fe5289592
--- /dev/null
+++ b/modules/production_work/view/work_form.xml
@@ -0,0 +1,23 @@
+
+
+
diff --git a/modules/production_work/view/work_list.xml b/modules/production_work/view/work_list.xml
new file mode 100644
index 0000000000..53dae0681b
--- /dev/null
+++ b/modules/production_work/view/work_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/production_work/view/work_list_sequence.xml b/modules/production_work/view/work_list_sequence.xml
new file mode 100644
index 0000000000..95ea7cd5d1
--- /dev/null
+++ b/modules/production_work/view/work_list_sequence.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/production_work/work.py b/modules/production_work/work.py
new file mode 100644
index 0000000000..fa1fcc37b8
--- /dev/null
+++ b/modules/production_work/work.py
@@ -0,0 +1,361 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import datetime
+import random
+from decimal import Decimal
+from functools import wraps
+
+from trytond.i18n import gettext
+from trytond.model import (
+ ModelSQL, ModelView, Workflow, DeactivableMixin, fields, sequence_ordered,
+ tree)
+from trytond.model.exceptions import AccessError
+from trytond.pool import Pool
+from trytond.pyson import Eval, If, Bool
+from trytond.transaction import Transaction
+
+from trytond.modules.product import price_digits, round_price
+from .exceptions import PickerError
+
+
+class WorkCenterCategory(ModelSQL, ModelView):
+ 'Work Center Category'
+ __name__ = 'production.work.center.category'
+ name = fields.Char('Name', required=True, translate=True)
+
+
+class WorkCenter(DeactivableMixin, tree(separator=' / '), ModelSQL, ModelView):
+ 'Work Center'
+ __name__ = 'production.work.center'
+ name = fields.Char('Name', required=True, translate=True)
+ parent = fields.Many2One('production.work.center', 'Parent', select=True,
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ('warehouse', '=', Eval('warehouse', -1)),
+ ],
+ depends=['company', 'warehouse'])
+ children = fields.One2Many('production.work.center', 'parent', 'Children',
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ('warehouse', '=', Eval('warehouse', -1)),
+ ],
+ depends=['company', 'warehouse'])
+ category = fields.Many2One('production.work.center.category', 'Category')
+ cost_price = fields.Numeric('Cost Price', digits=price_digits,
+ states={
+ 'required': Bool(Eval('cost_method')),
+ },
+ depends=['cost_method'])
+ cost_method = fields.Selection([
+ ('', ''),
+ ('cycle', 'Per Cycle'),
+ ('hour', 'Per Hour'),
+ ], 'Cost Method',
+ states={
+ 'required': Bool(Eval('cost_price')),
+ },
+ depends=['cost_price'])
+ company = fields.Many2One('company.company', 'Company', required=True,
+ select=True)
+ warehouse = fields.Many2One('stock.location', 'Warehouse', required=True,
+ domain=[
+ ('type', '=', 'warehouse'),
+ ])
+
+ @classmethod
+ def __setup__(cls):
+ super(WorkCenter, cls).__setup__()
+ cls._order.insert(0, ('name', 'ASC'))
+
+ @classmethod
+ def default_company(cls):
+ return Transaction().context.get('company')
+
+ @classmethod
+ def default_warehouse(cls):
+ Location = Pool().get('stock.location')
+ return Location.get_default_warehouse()
+
+ @classmethod
+ def get_picker(cls):
+ """Return a method that picks a work center
+ for the category and the parent"""
+ cache = {}
+
+ def picker(parent, category):
+ key = (parent, category)
+ if key not in cache:
+ work_centers = cls.search([
+ ('parent', 'child_of', [parent.id]),
+ ('category', '=', category.id),
+ ])
+ if not work_centers:
+ raise PickerError(
+ gettext('production_work.msg_missing_work_center',
+ category=category.rec_name,
+ parent=parent.rec_name))
+ cache[key] = work_centers
+ return random.choice(cache[key])
+ return picker
+
+
+class Work(sequence_ordered(), ModelSQL, ModelView):
+ 'Production Work'
+ __name__ = 'production.work'
+ operation = fields.Many2One('production.routing.operation', 'Operation',
+ required=True)
+ production = fields.Many2One('production', 'Production', required=True,
+ select=True, ondelete='CASCADE',
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ],
+ depends=['company'])
+ work_center_category = fields.Function(fields.Many2One(
+ 'production.work.center.category', 'Work Center Category'),
+ 'on_change_with_work_center_category')
+ work_center = fields.Many2One('production.work.center', 'Work Center',
+ domain=[
+ If(~Eval('work_center_category'),
+ (),
+ ('category', '=', Eval('work_center_category'))),
+ ('company', '=', Eval('company', -1)),
+ ('warehouse', '=', Eval('warehouse', -1)),
+ ],
+ states={
+ 'required': ~Eval('state').in_(['request', 'draft']),
+ },
+ depends=['work_center_category', 'company', 'warehouse', 'state'])
+ cycles = fields.One2Many('production.work.cycle', 'work', 'Cycles',
+ states={
+ 'readonly': Eval('state').in_(['request', 'done']),
+ },
+ depends=['state'])
+ active_cycles = fields.One2Many(
+ 'production.work.cycle', 'work', "Active Cycles",
+ readonly=True,
+ filter=[
+ ('state', '=', 'running'),
+ ])
+ company = fields.Many2One('company.company', 'Company', required=True,
+ select=True)
+ warehouse = fields.Function(fields.Many2One('stock.location', 'Warehouse'),
+ 'on_change_with_warehouse')
+ state = fields.Selection([
+ ('request', 'Request'),
+ ('draft', 'Draft'),
+ ('waiting', 'Waiting'),
+ ('running', 'Running'),
+ ('finished', 'Finished'),
+ ('done', 'Done'),
+ ], 'State', select=True, readonly=True)
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._buttons.update({
+ 'start': {
+ 'invisible': Bool(Eval('active_cycles', [])),
+ 'readonly': Eval('state').in_(['request', 'done']),
+ 'depends': ['active_cycles'],
+ },
+ 'stop': {
+ 'invisible': ~Bool(Eval('active_cycles', [])),
+ 'depends': ['active_cycles'],
+ },
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
+
+ super().__register__(module_name)
+ table = cls.__table_handler__(module_name)
+
+ # Migration from 5.4: Drop not null on work_center
+ table.not_null_action('work_center', 'remove')
+
+ @fields.depends('operation')
+ def on_change_with_work_center_category(self, name=None):
+ if self.operation and self.operation.work_center_category:
+ return self.operation.work_center_category.id
+
+ @classmethod
+ def default_company(cls):
+ return Transaction().context.get('company')
+
+ @fields.depends('production', '_parent_production.warehouse')
+ def on_change_with_warehouse(self, name=None):
+ if self.production:
+ return self.production.warehouse.id
+
+ @classmethod
+ def default_state(cls):
+ return 'request'
+
+ @classmethod
+ @ModelView.button
+ def start(cls, works):
+ pool = Pool()
+ Cycle = pool.get('production.work.cycle')
+ cycles = [Cycle(work=w) for w in works]
+ Cycle.save(cycles)
+ Cycle.run(cycles)
+
+ @classmethod
+ @ModelView.button
+ def stop(cls, works):
+ pool = Pool()
+ Cycle = pool.get('production.work.cycle')
+
+ to_do = []
+ for work in works:
+ for cycle in work.active_cycles:
+ to_do.append(cycle)
+ Cycle.do(to_do)
+
+ @property
+ def _state(self):
+ if self.production.state == 'waiting' and not self.cycles:
+ return 'request'
+ elif self.production.state == 'done':
+ return 'done'
+ elif (not self.cycles
+ or all(c.state == 'cancelled' for c in self.cycles)):
+ return 'draft'
+ elif all(c.state in ['done', 'cancelled'] for c in self.cycles):
+ return 'finished'
+ elif any(c.state == 'running' for c in self.cycles):
+ return 'running'
+ else:
+ return 'waiting'
+
+ @classmethod
+ def set_state(cls, works):
+ for work in works:
+ work.state = work._state
+ cls.save(works)
+
+ def get_rec_name(self, name):
+ return '%s @ %s' % (self.operation.rec_name, self.production.rec_name)
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ if clause[1].startswith('!') or clause[1].startswith('not '):
+ bool_op = 'AND'
+ else:
+ bool_op = 'OR'
+ return [bool_op,
+ ('operation.rec_name',) + tuple(clause[1:]),
+ ('production.rec_name',) + tuple(clause[1:]),
+ ]
+
+ @classmethod
+ def create(cls, values):
+ works = super(Work, cls).create(values)
+ cls.set_state(works)
+ return works
+
+ @classmethod
+ def delete(cls, works):
+ for work in works:
+ if work.state not in {'request', 'draft'}:
+ raise AccessError(
+ gettext('production_work.msg_delete_request',
+ work=work.rec_name))
+ super(Work, cls).delete(works)
+
+
+def set_work_state(func):
+ @wraps(func)
+ def wrapper(cls, cycles):
+ pool = Pool()
+ Work = pool.get('production.work')
+ func(cls, cycles)
+ Work.set_state(Work.browse({c.work.id for c in cycles}))
+ return wrapper
+
+
+class WorkCycle(Workflow, ModelSQL, ModelView):
+ 'Work Cycle'
+ __name__ = 'production.work.cycle'
+ work = fields.Many2One('production.work', 'Work', required=True,
+ ondelete='CASCADE', select=True)
+ duration = fields.TimeDelta('Duration',
+ states={
+ 'required': Eval('state') == 'done',
+ 'readonly': Eval('state').in_(['done', 'draft', 'cancelled']),
+ },
+ depends=['state'])
+ cost = fields.Numeric('Cost', digits=price_digits, readonly=True)
+ state = fields.Selection([
+ ('draft', 'Draft'),
+ ('running', 'Running'),
+ ('done', 'Done'),
+ ('cancelled', 'Cancelled'),
+ ], 'State', required=True, readonly=True)
+
+ @classmethod
+ def __setup__(cls):
+ super(WorkCycle, cls).__setup__()
+ cls._transitions |= set((
+ ('draft', 'running'),
+ ('running', 'done'),
+ ('draft', 'cancelled'),
+ ('running', 'cancelled'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': Eval('state').in_(['done', 'cancelled']),
+ 'depends': ['state'],
+ },
+ 'run': {
+ 'invisible': Eval('state') != 'draft',
+ 'depends': ['state'],
+ },
+ 'do': {
+ 'invisible': Eval('state') != 'running',
+ 'depends': ['state'],
+ },
+ })
+
+ @classmethod
+ def default_state(cls):
+ return 'draft'
+
+ @classmethod
+ @ModelView.button
+ @set_work_state
+ @Workflow.transition('cancelled')
+ def cancel(cls, cycles):
+ pass
+
+ @classmethod
+ @ModelView.button
+ @set_work_state
+ @Workflow.transition('running')
+ def run(cls, cycles):
+ pass
+
+ @classmethod
+ @ModelView.button
+ @set_work_state
+ @Workflow.transition('done')
+ def do(cls, cycles):
+ now = datetime.datetime.now()
+ for cycle in cycles:
+ cycle.set_duration(now)
+ cycle.set_cost()
+ cls.save(cycles)
+
+ def set_duration(self, now):
+ if self.duration is None:
+ self.duration = now - self.write_date
+
+ def set_cost(self):
+ if self.cost is None:
+ center = self.work.work_center
+ if center.cost_method == 'cycle':
+ self.cost = center.cost_price
+ elif center.cost_method == 'hour':
+ hours = self.duration.total_seconds() / (60 * 60)
+ self.cost = center.cost_price * Decimal(str(hours))
+ self.cost = round_price(self.cost)
diff --git a/modules/production_work/work.xml b/modules/production_work/work.xml
new file mode 100644
index 0000000000..defa6075d7
--- /dev/null
+++ b/modules/production_work/work.xml
@@ -0,0 +1,340 @@
+
+
+
+
+
+ production.work.center
+ tree
+
+ children
+ work_center_tree
+
+
+
+ production.work.center
+ tree
+
+ work_center_list
+
+
+
+ production.work.center
+ tree
+
+ work_center_tree
+
+
+
+ production.work.center
+ form
+ work_center_form
+
+
+
+ Work Centers
+ production.work.center
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Work Centers
+ production.work.center
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+ production.work.center.category
+ tree
+ work_center_category_list
+
+
+
+ production.work.center.category
+ form
+ work_center_category_form
+
+
+
+ Work Center Categories
+ production.work.center.category
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ production.work
+ tree
+ work_list
+
+
+
+ production.work
+ tree
+ work_list_sequence
+
+
+
+ production.work
+ form
+ work_form
+
+
+
+ Works
+ production.work
+
+
+
+
+
+
+
+
+
+
+
+
+ Request
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+
+ Waiting
+
+
+
+
+
+
+ Running
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ start
+ Start
+
+
+
+
+ stop
+ Stop
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+ production.work.cycle
+ tree
+ work_cycle_list
+
+
+
+ production.work.cycle
+ form
+ work_cycle_form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+
+
+
+
+ do
+ Do
+
+
+
+
+ run
+ Run
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/production_work_timesheet/.drone.yml b/modules/production_work_timesheet/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/production_work_timesheet/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/production_work_timesheet/.flake8 b/modules/production_work_timesheet/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/production_work_timesheet/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/production_work_timesheet/CHANGELOG b/modules/production_work_timesheet/CHANGELOG
new file mode 100644
index 0000000000..919755dc73
--- /dev/null
+++ b/modules/production_work_timesheet/CHANGELOG
@@ -0,0 +1,31 @@
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+
+Version 4.2.0 - 2016-11-28
+* Initial release
diff --git a/modules/production_work_timesheet/COPYRIGHT b/modules/production_work_timesheet/COPYRIGHT
new file mode 100644
index 0000000000..e0c9acfac7
--- /dev/null
+++ b/modules/production_work_timesheet/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2016-2021 Cédric Krier
+Copyright (C) 2016-2021 B2CK
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/production_work_timesheet/LICENSE b/modules/production_work_timesheet/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/production_work_timesheet/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/production_work_timesheet/MANIFEST.in b/modules/production_work_timesheet/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/production_work_timesheet/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/production_work_timesheet/README.rst b/modules/production_work_timesheet/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/production_work_timesheet/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/production_work_timesheet/__init__.py b/modules/production_work_timesheet/__init__.py
new file mode 100644
index 0000000000..c71dd2664a
--- /dev/null
+++ b/modules/production_work_timesheet/__init__.py
@@ -0,0 +1,15 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import work
+from . import routing
+from . import timesheet
+
+
+def register():
+ Pool.register(
+ work.Work,
+ routing.Operation,
+ timesheet.Work,
+ module='production_work_timesheet', type_='model')
diff --git a/modules/production_work_timesheet/doc/index.rst b/modules/production_work_timesheet/doc/index.rst
new file mode 100644
index 0000000000..99df023af1
--- /dev/null
+++ b/modules/production_work_timesheet/doc/index.rst
@@ -0,0 +1,5 @@
+Production Work Timesheet Module
+################################
+
+The production work timesheet module allows to enter timesheet for production
+works.
diff --git a/modules/production_work_timesheet/locale/bg.po b/modules/production_work_timesheet/locale/bg.po
new file mode 100644
index 0000000000..43d61412e8
--- /dev/null
+++ b/modules/production_work_timesheet/locale/bg.po
@@ -0,0 +1,27 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Наличен в график"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Наличен в график"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Редове от график"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Редове от график"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/ca.po b/modules/production_work_timesheet/locale/ca.po
new file mode 100644
index 0000000000..b54997de80
--- /dev/null
+++ b/modules/production_work_timesheet/locale/ca.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponible en fulls de treball"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponible en fulls de treball"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Línies del full de treball"
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Full de treball"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Treballs del full"
diff --git a/modules/production_work_timesheet/locale/cs.po b/modules/production_work_timesheet/locale/cs.po
new file mode 100644
index 0000000000..686151f1e6
--- /dev/null
+++ b/modules/production_work_timesheet/locale/cs.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/de.po b/modules/production_work_timesheet/locale/de.po
new file mode 100644
index 0000000000..56208d41db
--- /dev/null
+++ b/modules/production_work_timesheet/locale/de.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Verfügbar für Zeiterfassung"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Verfügbar für Zeiterfassung"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Zeiterfassungspositionen"
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Tätigkeit"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Tätigkeiten"
diff --git a/modules/production_work_timesheet/locale/es.po b/modules/production_work_timesheet/locale/es.po
new file mode 100644
index 0000000000..7c1fb3a4e3
--- /dev/null
+++ b/modules/production_work_timesheet/locale/es.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponible en partes de trabajo"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponible en partes de trabajo"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Líneas del parte de trabajo"
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Partes de trabajo"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Partes de trabajo"
diff --git a/modules/production_work_timesheet/locale/es_419.po b/modules/production_work_timesheet/locale/es_419.po
new file mode 100644
index 0000000000..686151f1e6
--- /dev/null
+++ b/modules/production_work_timesheet/locale/es_419.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/et.po b/modules/production_work_timesheet/locale/et.po
new file mode 100644
index 0000000000..4976eddf57
--- /dev/null
+++ b/modules/production_work_timesheet/locale/et.po
@@ -0,0 +1,24 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Saadaval töögraafikutes"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Saadaval töögraafikutes"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Töögraafiku read"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Töögraafiku tööd"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Töögraafiku tööd"
diff --git a/modules/production_work_timesheet/locale/fa.po b/modules/production_work_timesheet/locale/fa.po
new file mode 100644
index 0000000000..82b3df6673
--- /dev/null
+++ b/modules/production_work_timesheet/locale/fa.po
@@ -0,0 +1,24 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "موجود در جدول زمانی"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "موجود در جدول زمانی"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "خطوط جدول زمانی"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "جدول زمانی کارها"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "جدول زمانی کارها"
diff --git a/modules/production_work_timesheet/locale/fi.po b/modules/production_work_timesheet/locale/fi.po
new file mode 100644
index 0000000000..686151f1e6
--- /dev/null
+++ b/modules/production_work_timesheet/locale/fi.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/fr.po b/modules/production_work_timesheet/locale/fr.po
new file mode 100644
index 0000000000..85b750ff31
--- /dev/null
+++ b/modules/production_work_timesheet/locale/fr.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponible sur les feuilles de présence"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponible sur les feuilles de présence"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Lignes de feuille de présence"
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Travile de feuille de présence"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Lignes de feuille de présence des travaux"
diff --git a/modules/production_work_timesheet/locale/hu.po b/modules/production_work_timesheet/locale/hu.po
new file mode 100644
index 0000000000..1495f80915
--- /dev/null
+++ b/modules/production_work_timesheet/locale/hu.po
@@ -0,0 +1,25 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Időpozíció"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Időpozíció"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/id.po b/modules/production_work_timesheet/locale/id.po
new file mode 100644
index 0000000000..686151f1e6
--- /dev/null
+++ b/modules/production_work_timesheet/locale/id.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/it.po b/modules/production_work_timesheet/locale/it.po
new file mode 100644
index 0000000000..686151f1e6
--- /dev/null
+++ b/modules/production_work_timesheet/locale/it.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/lo.po b/modules/production_work_timesheet/locale/lo.po
new file mode 100644
index 0000000000..2eec75e7ce
--- /dev/null
+++ b/modules/production_work_timesheet/locale/lo.po
@@ -0,0 +1,24 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "ມີໃຫ້ໃຊ້ໃນໃບຕິດຕາມເວລາ"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "ມີໃຫ້ໃຊ້ໃນໃບຕິດຕາມເວລາ"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "ລາຍການ ໃນໃບຕິດຕາມເວລາ"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "ໜ້າວຽກໃນໃບຕິດຕາມເວລາ"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "ໜ້າວຽກໃນໃບຕິດຕາມເວລາ"
diff --git a/modules/production_work_timesheet/locale/lt.po b/modules/production_work_timesheet/locale/lt.po
new file mode 100644
index 0000000000..686151f1e6
--- /dev/null
+++ b/modules/production_work_timesheet/locale/lt.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/nl.po b/modules/production_work_timesheet/locale/nl.po
new file mode 100644
index 0000000000..4a04e84487
--- /dev/null
+++ b/modules/production_work_timesheet/locale/nl.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Beschikbaar in tijdsregistratie"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Beschikbaar in tijdregistartie"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Tijdregistratieregels"
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "aanwezigheidsblad werken"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Tijdsregistratie werken"
diff --git a/modules/production_work_timesheet/locale/pl.po b/modules/production_work_timesheet/locale/pl.po
new file mode 100644
index 0000000000..686151f1e6
--- /dev/null
+++ b/modules/production_work_timesheet/locale/pl.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/pt.po b/modules/production_work_timesheet/locale/pt.po
new file mode 100644
index 0000000000..1878eb006c
--- /dev/null
+++ b/modules/production_work_timesheet/locale/pt.po
@@ -0,0 +1,24 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponível em folhas de registro de trabalho"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponível em folhas de registro de trabalho"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Linhas do Horário de Trabalho"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Horários de Trabalho "
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Horários de Trabalho"
diff --git a/modules/production_work_timesheet/locale/ro.po b/modules/production_work_timesheet/locale/ro.po
new file mode 100644
index 0000000000..686151f1e6
--- /dev/null
+++ b/modules/production_work_timesheet/locale/ro.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/ru.po b/modules/production_work_timesheet/locale/ru.po
new file mode 100644
index 0000000000..6762606d90
--- /dev/null
+++ b/modules/production_work_timesheet/locale/ru.po
@@ -0,0 +1,27 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Доступно в табелях"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Доступно в табелях"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Строки табеля"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Строки табеля"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/locale/sl.po b/modules/production_work_timesheet/locale/sl.po
new file mode 100644
index 0000000000..6e9dcbd0c3
--- /dev/null
+++ b/modules/production_work_timesheet/locale/sl.po
@@ -0,0 +1,24 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Na evidenci"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Na evidenci"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Postavke evidence"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Evidentirane naloge"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Evidentirane naloge"
diff --git a/modules/production_work_timesheet/locale/tr.po b/modules/production_work_timesheet/locale/tr.po
new file mode 100644
index 0000000000..be57a7d949
--- /dev/null
+++ b/modules/production_work_timesheet/locale/tr.po
@@ -0,0 +1,24 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Zaman çizelgelerinde ki boşluklar"
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Zaman çizelgelerinde ki boşluklar"
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr "Zaman Çizelgesi Hatlar"
+
+#, fuzzy
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr "Zaman Çizelgesi İşler"
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Zaman Çizelgesi İşler"
diff --git a/modules/production_work_timesheet/locale/zh_CN.po b/modules/production_work_timesheet/locale/zh_CN.po
new file mode 100644
index 0000000000..686151f1e6
--- /dev/null
+++ b/modules/production_work_timesheet/locale/zh_CN.po
@@ -0,0 +1,23 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:production.routing.operation,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_lines:"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_work:"
+msgid "Timesheet Work"
+msgstr ""
+
+msgctxt "field:production.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
diff --git a/modules/production_work_timesheet/routing.py b/modules/production_work_timesheet/routing.py
new file mode 100644
index 0000000000..dfde074513
--- /dev/null
+++ b/modules/production_work_timesheet/routing.py
@@ -0,0 +1,14 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import PoolMeta
+from trytond.model import fields
+
+
+class Operation(metaclass=PoolMeta):
+ __name__ = 'production.routing.operation'
+
+ timesheet_available = fields.Boolean('Available on timesheets')
+
+ @classmethod
+ def default_timesheet_available(cls):
+ return False
diff --git a/modules/production_work_timesheet/routing.xml b/modules/production_work_timesheet/routing.xml
new file mode 100644
index 0000000000..f0219be3b6
--- /dev/null
+++ b/modules/production_work_timesheet/routing.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+ production.routing.operation
+
+ operation_list
+
+
+
+ production.routing.operation
+
+ operation_form
+
+
+
diff --git a/modules/production_work_timesheet/setup.py b/modules/production_work_timesheet/setup.py
new file mode 100755
index 0000000000..2edeaada5f
--- /dev/null
+++ b/modules/production_work_timesheet/setup.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_production_work_timesheet'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = []
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = []
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module for timesheet on production work',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": (
+ 'https://hg.tryton.org/modules/production_work_timesheet'),
+ },
+ keywords='tryton production work timesheet',
+ package_dir={'trytond.modules.production_work_timesheet': '.'},
+ packages=(
+ ['trytond.modules.production_work_timesheet']
+ + ['trytond.modules.production_work_timesheet.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.production_work_timesheet': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.fodt',
+ 'icons/*.svg', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ production_work_timesheet = trytond.modules.production_work_timesheet
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/production_work_timesheet/tests/__init__.py b/modules/production_work_timesheet/tests/__init__.py
new file mode 100644
index 0000000000..c24ddea355
--- /dev/null
+++ b/modules/production_work_timesheet/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.production_work_timesheet.tests.test_production_work_timesheet import suite # noqa: E501
+except ImportError:
+ from .test_production_work_timesheet import suite
+
+__all__ = ['suite']
diff --git a/modules/production_work_timesheet/tests/test_production_work_timesheet.py b/modules/production_work_timesheet/tests/test_production_work_timesheet.py
new file mode 100644
index 0000000000..d94b9735d3
--- /dev/null
+++ b/modules/production_work_timesheet/tests/test_production_work_timesheet.py
@@ -0,0 +1,112 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import datetime
+import unittest
+
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.tests.test_tryton import suite as test_suite
+from trytond.pool import Pool
+from trytond.modules.company.tests import (
+ create_company, set_company, create_employee, CompanyTestMixin)
+
+
+class ProductionWorkTimesheetTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test Production Work Timesheet module'
+ module = 'production_work_timesheet'
+
+ def create_work(self, production_state='draft'):
+ pool = Pool()
+ Work = pool.get('production.work')
+ Operation = pool.get('production.routing.operation')
+ WorkCenter = pool.get('production.work.center')
+ Production = pool.get('production')
+
+ work_center = WorkCenter(name='Work Center')
+ work_center.save()
+
+ operation = Operation(name='Operation')
+ operation.timesheet_available = True
+ operation.save()
+
+ production = Production(state=production_state)
+ production.save()
+
+ work = Work(
+ production=production,
+ operation=operation,
+ work_center=work_center)
+ return work
+
+ @with_transaction()
+ def test_set_timesheet_work(self):
+ 'Test _set_timesheet_work'
+ pool = Pool()
+ Work = pool.get('production.work')
+ TimesheetWork = pool.get('timesheet.work')
+ Date = pool.get('ir.date')
+
+ company = create_company()
+ with set_company(company):
+ # Test on create
+ work = self.create_work()
+ work.save()
+ self.assertEqual(len(work.timesheet_works), 1)
+
+ # Test on write
+ work.operation.timesheet_available = False
+ work.operation.save()
+ work.sequence = 1 # trigger write
+ work.save()
+ self.assertFalse(work.timesheet_works)
+
+ # Test delete
+ work = self.create_work()
+ work.save()
+ timesheet_work, = work.timesheet_works
+ timesheet_work_id = timesheet_work.id
+ Work.delete([work])
+ self.assertFalse(
+ TimesheetWork.search([('id', '=', timesheet_work_id)]))
+
+ # Test create as done
+ work = self.create_work(production_state='done')
+ work.save()
+ timesheet_work, = work.timesheet_works
+ self.assertEqual(timesheet_work.timesheet_end_date, Date.today())
+
+ # Set write as done
+ work = self.create_work()
+ work.save()
+ work.state = 'done'
+ work.save()
+ timesheet_work, = work.timesheet_works
+ self.assertEqual(timesheet_work.timesheet_end_date, Date.today())
+
+ @with_transaction()
+ def test_timesheet_lines(self):
+ 'Test timesheet_lines'
+ pool = Pool()
+ TimesheetLine = pool.get('timesheet.line')
+
+ company = create_company()
+ with set_company(company):
+ work = self.create_work()
+ work.save()
+
+ employee = create_employee(company)
+
+ timesheet_line = TimesheetLine(
+ employee=employee,
+ duration=datetime.timedelta(1))
+
+ work.timesheet_lines = [timesheet_line]
+ work.save()
+
+ self.assertEqual(len(work.timesheet_lines), 1)
+
+
+def suite():
+ suite = test_suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProductionWorkTimesheetTestCase))
+ return suite
diff --git a/modules/production_work_timesheet/timesheet.py b/modules/production_work_timesheet/timesheet.py
new file mode 100644
index 0000000000..082995435f
--- /dev/null
+++ b/modules/production_work_timesheet/timesheet.py
@@ -0,0 +1,19 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import PoolMeta, Pool
+
+
+class Work(metaclass=PoolMeta):
+ __name__ = 'timesheet.work'
+
+ @classmethod
+ def _get_origin(cls):
+ return super()._get_origin() + ['production.work']
+
+ def _validate_company(self):
+ pool = Pool()
+ ProductionWork = pool.get('production.work')
+ result = super()._validate_company()
+ if isinstance(self.origin, ProductionWork):
+ result &= self.company == self.origin.company
+ return result
diff --git a/modules/production_work_timesheet/tox.ini b/modules/production_work_timesheet/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/production_work_timesheet/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/production_work_timesheet/tryton.cfg b/modules/production_work_timesheet/tryton.cfg
new file mode 100644
index 0000000000..8a18e64db7
--- /dev/null
+++ b/modules/production_work_timesheet/tryton.cfg
@@ -0,0 +1,10 @@
+[tryton]
+version=6.0.1
+depends:
+ ir
+ production_routing
+ production_work
+ timesheet
+xml:
+ work.xml
+ routing.xml
diff --git a/modules/production_work_timesheet/view/operation_form.xml b/modules/production_work_timesheet/view/operation_form.xml
new file mode 100644
index 0000000000..0a63b08b30
--- /dev/null
+++ b/modules/production_work_timesheet/view/operation_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/production_work_timesheet/view/operation_list.xml b/modules/production_work_timesheet/view/operation_list.xml
new file mode 100644
index 0000000000..d791f496a7
--- /dev/null
+++ b/modules/production_work_timesheet/view/operation_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_work_timesheet/view/work_form.xml b/modules/production_work_timesheet/view/work_form.xml
new file mode 100644
index 0000000000..8f90c60e2f
--- /dev/null
+++ b/modules/production_work_timesheet/view/work_form.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/production_work_timesheet/work.py b/modules/production_work_timesheet/work.py
new file mode 100644
index 0000000000..0336c202b1
--- /dev/null
+++ b/modules/production_work_timesheet/work.py
@@ -0,0 +1,120 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from collections import defaultdict
+
+from trytond.pool import PoolMeta, Pool
+from trytond.model import fields
+from trytond.pyson import Eval
+
+
+class Work(metaclass=PoolMeta):
+ __name__ = 'production.work'
+
+ timesheet_works = fields.One2Many(
+ 'timesheet.work', 'origin', 'Timesheet Works', readonly=True, size=1)
+ timesheet_work = fields.Function(
+ fields.Many2One('timesheet.work', "Timesheet Work"),
+ 'get_timesheet_work')
+ timesheet_available = fields.Function(
+ fields.Boolean('Available on timesheets'),
+ 'on_change_with_timesheet_available')
+ timesheet_lines = fields.Function(
+ fields.One2Many('timesheet.line', None, 'Timesheet Lines',
+ states={
+ 'invisible': ~Eval('timesheet_works'),
+ },
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ('work', '=', Eval('timesheet_work', -1)),
+ ],
+ depends=['timesheet_works', 'timesheet_work', 'company']),
+ 'get_timesheet_lines', setter='set_timesheet_lines')
+
+ def get_timesheet_work(self, name):
+ if self.timesheet_works:
+ timesheet_work, = self.timesheet_works
+ return timesheet_work.id
+
+ @fields.depends('operation')
+ def on_change_with_timesheet_available(self, name=None):
+ if self.operation:
+ return self.operation.timesheet_available
+
+ def get_timesheet_lines(self, name):
+ if self.timesheet_works:
+ return [l.id for w in self.timesheet_works
+ for l in w.timesheet_lines]
+ else:
+ return []
+
+ @classmethod
+ def set_timesheet_lines(cls, works, name, value):
+ pool = Pool()
+ TimesheetWork = pool.get('timesheet.work')
+ if value:
+ timesheet_works = [tw for w in works for tw in w.timesheet_works]
+ TimesheetWork.write(timesheet_works, {
+ 'timesheet_lines': value,
+ })
+
+ @classmethod
+ def create(cls, vlist):
+ works = super(Work, cls).create(vlist)
+ cls._set_timesheet_work(works)
+ return works
+
+ @classmethod
+ def write(cls, *args):
+ super(Work, cls).write(*args)
+ works = sum(args[0:None:2], [])
+ cls._set_timesheet_work(works)
+
+ @classmethod
+ def delete(cls, works):
+ pool = Pool()
+ TimesheetWork = pool.get('timesheet.work')
+
+ timesheet_works = [w for pw in works for w in pw.timesheet_works]
+
+ super(Work, cls).delete(works)
+
+ if timesheet_works:
+ TimesheetWork.delete(timesheet_works)
+
+ @classmethod
+ def _set_timesheet_work(cls, productions):
+ pool = Pool()
+ Timesheet = pool.get('timesheet.work')
+ Date = pool.get('ir.date')
+ today = Date.today()
+
+ to_create = []
+ to_delete = []
+ to_write = defaultdict(list)
+ for production in productions:
+ if production.timesheet_available:
+ ended = production.state in {'done', 'cancelled'}
+ if not production.timesheet_works:
+ to_create.append({
+ 'origin': str(production),
+ 'company': production.company.id,
+ 'timesheet_end_date': today if ended else None,
+ })
+ elif ended:
+ for timesheet in production.timesheet_works:
+ date = max([today]
+ + [l.date for l in timesheet.timesheet_lines])
+ to_write[date].append(timesheet)
+ if (not production.timesheet_available
+ and production.timesheet_works):
+ if all(not w.timesheet_lines
+ for w in production.timesheet_works):
+ to_delete.extend(production.timesheet_works)
+ if to_create:
+ Timesheet.create(to_create)
+ if to_delete:
+ Timesheet.delete(to_delete)
+ for date, timesheets in list(to_write.items()):
+ Timesheet.write(timesheets, {
+ 'timesheet_end_date': date,
+ })
diff --git a/modules/production_work_timesheet/work.xml b/modules/production_work_timesheet/work.xml
new file mode 100644
index 0000000000..f21445f89d
--- /dev/null
+++ b/modules/production_work_timesheet/work.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ production.work
+
+ work_form
+
+
+
diff --git a/modules/project/.drone.yml b/modules/project/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/project/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/project/.flake8 b/modules/project/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/project/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/project/CHANGELOG b/modules/project/CHANGELOG
new file mode 100644
index 0000000000..23a4d33914
--- /dev/null
+++ b/modules/project/CHANGELOG
@@ -0,0 +1,86 @@
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+* Make project status configurable
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+* Fill default timesheet work from project relate
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+* Order timesheet setters
+* Check opened project to erase party
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+* Add sequence attribute on tree views
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+* Use origin on Timesheet Work
+* Make timesheet available editable
+
+Version 4.0.0 - 2016-05-02
+* Bug fixes (see mercurial logs for details)
+* Add Python3 support
+
+Version 3.8.0 - 2015-11-02
+* Bug fixes (see mercurial logs for details)
+* Add progress of work
+* Uses own parent, name for work
+
+Version 3.6.0 - 2015-04-20
+* Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+* Use TimeDelta field
+
+Version 3.4.0 - 2014-10-20
+* Bug fixes (see mercurial logs for details)
+
+Version 3.2.0 - 2014-04-21
+* Bug fixes (see mercurial logs for details)
+
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+
+Version 2.8.0 - 2013-04-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.6.0 - 2012-10-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.4.0 - 2012-04-24
+* Bug fixes (see mercurial logs for details)
+* Remove usage of type in context
+
+Version 2.2.0 - 2011-10-24
+* Bug fixes (see mercurial logs for details)
+
+Version 2.0.0 - 2011-04-27
+* Bug fixes (see mercurial logs for details)
+
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
+Version 1.6.0 - 2010-05-13
+* Bug fixes (see mercurial logs for details)
+
+Version 1.4.0 - 2009-10-19
+* Initial release
diff --git a/modules/project/COPYRIGHT b/modules/project/COPYRIGHT
new file mode 100644
index 0000000000..23d5df7833
--- /dev/null
+++ b/modules/project/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2008-2021 Cédric Krier.
+Copyright (C) 2008-2021 B2CK SPRL.
+Copyright (C) 2009-2013 Bertrand Chenal.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/project/LICENSE b/modules/project/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/project/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/project/MANIFEST.in b/modules/project/MANIFEST.in
new file mode 100644
index 0000000000..94499680c6
--- /dev/null
+++ b/modules/project/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
+include icons/LICENSE
diff --git a/modules/project/README.rst b/modules/project/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/project/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/project/__init__.py b/modules/project/__init__.py
new file mode 100644
index 0000000000..0bf2a800b5
--- /dev/null
+++ b/modules/project/__init__.py
@@ -0,0 +1,23 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import ir
+from . import work
+from . import timesheet
+from . import party
+
+
+def register():
+ Pool.register(
+ # Before Work because status default value is read from WorkStatus
+ work.WorkStatus,
+ work.Work,
+ timesheet.Line,
+ timesheet.Work,
+ ir.ActWindow,
+ module='project', type_='model')
+ Pool.register(
+ party.Replace,
+ party.Erase,
+ module='project', type_='wizard')
diff --git a/modules/project/doc/index.rst b/modules/project/doc/index.rst
new file mode 100644
index 0000000000..df97b04d23
--- /dev/null
+++ b/modules/project/doc/index.rst
@@ -0,0 +1,34 @@
+Project Module
+##############
+
+The Project module provides the concepts of project and task and the
+basis for simple project management.
+
+Work Effort
+***********
+
+The Work Effort model is used for creating both projects and tasks. This allows
+for instance to transform a task into a project if it gets bigger and need to
+be split. The following fields are defined on the model:
+
+- Name: The name of the Project/Task.
+- Type: Can be *Project* or *Task*.
+- Status: The current status of the work.
+- Parent and Children: Define the tree structure of projects and tasks.
+- Party and Party Address: The optional party (and the contact address) for
+ which the project is made. Available on projects.
+- Timesheet, start and end: Allow to enter timesheet for this work.
+- Effort: The estimated effort of a task.
+- Total Effort: Available on projects. Gives the total effort of the sub-tasks
+ (I.E. tasks of the project and tasks of the sub-projects) of the current
+ project.
+- Progress: The progression on the task.
+- Total Progress: Gives the total of progress of the sub-tasks.
+- Comment: A description.
+
+
+Work Status
+***********
+
+The Work Status defines the possible status of projects and tasks. A minimal
+progress can be defined to enforce on works in this status.
diff --git a/modules/project/exceptions.py b/modules/project/exceptions.py
new file mode 100644
index 0000000000..090338fc67
--- /dev/null
+++ b/modules/project/exceptions.py
@@ -0,0 +1,12 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.model.exceptions import ValidationError
+
+
+class WorkValidationError(ValidationError):
+ pass
+
+
+class WorkProgressValidationError(WorkValidationError):
+ pass
diff --git a/modules/project/icons/LICENSE b/modules/project/icons/LICENSE
new file mode 100644
index 0000000000..7a4a3ea242
--- /dev/null
+++ b/modules/project/icons/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/modules/project/icons/tryton-project.svg b/modules/project/icons/tryton-project.svg
new file mode 100644
index 0000000000..ffef0ff71c
--- /dev/null
+++ b/modules/project/icons/tryton-project.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/project/ir.py b/modules/project/ir.py
new file mode 100644
index 0000000000..7421edc377
--- /dev/null
+++ b/modules/project/ir.py
@@ -0,0 +1,15 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import Pool, PoolMeta
+
+
+class ActWindow(metaclass=PoolMeta):
+ __name__ = 'ir.action.act_window'
+
+ def get_domains(self, name):
+ domains = super().get_domains(name)
+ if self.res_model == 'project.work':
+ pool = Pool()
+ WorkStatus = pool.get('project.work.status')
+ domains = WorkStatus.get_window_domains(self)
+ return domains
diff --git a/modules/project/locale/bg.po b/modules/project/locale/bg.po
new file mode 100644
index 0000000000..9d227e37c1
--- /dev/null
+++ b/modules/project/locale/bg.po
@@ -0,0 +1,319 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Наследници"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Коментар"
+
+#, fuzzy
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Ляв"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Родител"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Партньор"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Адрес за контакт"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Десен"
+
+#, fuzzy
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Състояние"
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Наличен в график"
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Продължителност"
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Ред от график"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Общо усилия"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Вид"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Вид"
+
+#, fuzzy
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "Предполагаеми общо усилия за тази задача и подзадачите"
+
+#, fuzzy
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "Предполагаеми общо усилия за тази задача и подзадачите"
+
+#, fuzzy
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "Предполагаеми общо усилия за тази задача и подзадачите"
+
+#, fuzzy
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "Предполагаеми общо усилия за тази задача и подзадачите"
+
+#, fuzzy
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "Предполагаеми общо усилия за тази задача и подзадачите"
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Дейност"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Проект"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Задача"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Основен"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/ca.po b/modules/project/locale/ca.po
new file mode 100644
index 0000000000..baf3a633b2
--- /dev/null
+++ b/modules/project/locale/ca.po
@@ -0,0 +1,295 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Fills"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Comentari"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "Esforç"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Esquerra"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Tercer"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Adreça de contacte"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "Progrés"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Dreta"
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Estat"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponible en fulls de treball"
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Temps"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Final del full de treball"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "Inici del full de treball"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Fulls de treball"
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Esforç total"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr "Progrés total"
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Tipus"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr "Comptador"
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr "Per defecte"
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "Progrés"
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Tipus"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "Esforç estimat per aquest treball."
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "Progrés estimat per aquest treball."
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "Temps total dedicat en aquest treball i els seus subtreballs."
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "Esforç total estimat per aquest treball i els seus subtreballs."
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "Progrés total estimat per aquest treball i els seus subtreballs."
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr "Marqueu per mostrar el nombre de treballs en aquest estat."
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr "Marqueu per utilizar com a estat per defecte pel tipus."
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr "El progrés mínim que es requereix per aquest estat."
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr "Els tipus de treball que poden utilitzar aquest estat."
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasques"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projectes"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Arbre de projectes"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasques"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Línies del full de treball"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Projectes i tasques"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr "Estat del treball"
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Arbre de projectes i tasques"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+"No es pot eliminar el tercer \"%(party)s\" mentre tingui projectes oberts "
+"amb l'empresa \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+"Per completar el treball \"%(work)s\", heu de completar primer tots els seus"
+" fills."
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+"Per actualitzar el terball \"%(work)s\" al estat \"%(status)s\", heu "
+"d'incrementar el seu progres com a mínim fins a %(progress)s."
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+"Per re-obrir el treball \"%(work)s\", heu de re-obrir primer el seu pare "
+"\"%(parent)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Projectes"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projectes"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Arbre de projectes"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasques"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Projectes i tasques"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr "Estat del treball"
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Arbre de projectes i tasques"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Projecte i tasca"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr "Estat del treball"
+
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Obert"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Administració de projectes"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Projecte"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tasca"
+
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr "Fi:"
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr "Inici:"
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr "Full de treball:"
diff --git a/modules/project/locale/cs.po b/modules/project/locale/cs.po
new file mode 100644
index 0000000000..cb53740c73
--- /dev/null
+++ b/modules/project/locale/cs.po
@@ -0,0 +1,296 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr ""
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr ""
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+#, fuzzy
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/de.po b/modules/project/locale/de.po
new file mode 100644
index 0000000000..8fe47dc171
--- /dev/null
+++ b/modules/project/locale/de.po
@@ -0,0 +1,300 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Untergeordnet (Projekte/Aufgaben)"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Kommentar"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "Zeitaufwand"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Links"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Übergeordnet (Projekt/Aufgabe)"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Partei"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Kontaktadresse"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "Fortschritt"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Rechts"
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Status"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Verfügbar für Zeiterfassung"
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Dauer"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Zeiterfassung Ende"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "Zeiterfassung Beginn"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Tätigkeiten"
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Gesamtaufwand (Personenstunden)"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr "Gesamtfortschritt"
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr "Zählen"
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr "Standard"
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "Fortschritt"
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Typen"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "Geschätzter Zeitaufwand für diese Aufgabe."
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "Geschätzter Fortschritt für diese Aufgabe."
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+"Die gesamte Zeit, die für diese Aufgabe inkl. Unteraufgaben verwendet wurde."
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+"Veranschlagter Gesamtaufwand für diese(s) Projekt/Aufgabe inkl. aller "
+"untergeordneten Projekte/Aufgaben in Stunden (Format: Personenstunden, "
+"-tage, -wochen)."
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "Geschätzter Gesamtfortschritt für diese Aufgabe inkl. Unteraufgaben."
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+"Auswählen, um die Anzahl der Projekte/Aufgaben mit diesem Status anzuzeigen."
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr "Auswählen, um diesen Status für den Typ als Standard zu verwenden."
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr "Der minimale Fortschritt, der für diesen Status erforderlich ist."
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr "Die Typen, die diesen Status verwenden können."
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Aufgaben"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projekte"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projekte"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Aufgaben"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Zeiterfassungspositionen"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Aufgaben Aufwände"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr "Aufgaben Status"
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Aufgaben Aufwände"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+"Partei \"%(party)s\" kann nicht gelöscht werden solange für sie noch offene "
+"Projekte bei Unternehmen \"%(company)s\" bestehen."
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+"Um Projekt \"%(parent)s\" abschließen zu können, muss zuerst das "
+"untergeordnete Projekt \"%(child)s\" abgeschlossen werden."
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+"Um \"%(work)s\" in den Status \"%(status)s\" setzen zu können, muss der "
+"Fortschritt mindestens auf %(progress)s gesetzt werden."
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+"Um das Projekt \"%(work)s\" wieder öffnen zu können, muss zuerst das "
+"übergeordnete Projekt \"%(parent)s\" wieder geöffnet werden."
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Projekte"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projekte"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projekte"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Auswertungen"
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Aufgaben"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Aufgaben Aufwände"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr "Aufgabenstatus"
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Aufgaben Aufwände"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Aufgabe Aufwand"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr "Projekt Status"
+
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Offen"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Projekte Administration"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Projekt"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Aufgabe"
+
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr "Ende:"
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr "Start:"
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr "Zeiterfassung:"
diff --git a/modules/project/locale/es.po b/modules/project/locale/es.po
new file mode 100644
index 0000000000..0fc06748bd
--- /dev/null
+++ b/modules/project/locale/es.po
@@ -0,0 +1,293 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Hijos"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "Esfuerzo"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Izquierda"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Tercero"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Dirección de contacto"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "Progreso"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Derecha"
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponible en partes de trabajo"
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Tiempo"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Fin de parte de trabajo"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "Inicio de parte de trabajo"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Partes de trabajo"
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Tiempo total"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr "Progreso total"
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr "Contador"
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr "Por defecto"
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "Progreso"
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Tipos"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "Esfuerzo estimado para este trabajo."
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "Progreso estimado para este trabajo."
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "Tiempo total empleado en este trabajo y sus subtrabajos."
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "Esfuerzo total estimado para este trabajo y sus subtrabajos."
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "Progreso total estimado para este trabajo y sus subtrabajos."
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr "Marcar para mostrar el número de trabajos en este estado."
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr "Marcar para usar como estado por defecto para el tipo."
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr "El progreso mínimo que se requerie para este estado."
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr "Los tipos de trabajo que pueden usar este estado."
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tareas"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Proyectos"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Árbol de proyectos"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tareas"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Líneas del parte de trabajo"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Proyectos y tareas"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr "Estado del trabajo"
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Árbol de proyectos y tareas"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+"No puede eliminar el tercero \"%(party)s\" mientras tenga proyectos abiertos"
+" con la empresa \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+"Para completar el trabajo \"%(work)s\", debe completar primero todos sus "
+"hijos."
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+"Para establecer el trabajo \"%(work)s\" en el estado \"%(status)s\", debe "
+"incrementar su progreso como mínimo hasta %(progress)s."
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr "Para reabrir el trabajo \"%(work)s\", debe reabrir su padre \"%(parent)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Proyectos"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Proyectos"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Árbol de proyectos"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tareas"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Proyectos y tareas"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr "Estado del trabajo"
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Árbol de proyectos y tareas"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Proyecto y tarea"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr "Estado del trabajo"
+
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Abierto"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Administración de proyectos"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Proyecto"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tarea"
+
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr "Fin:"
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr "Inicio:"
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr "Hoja de trabajo:"
diff --git a/modules/project/locale/es_419.po b/modules/project/locale/es_419.po
new file mode 100644
index 0000000000..950264465e
--- /dev/null
+++ b/modules/project/locale/es_419.po
@@ -0,0 +1,292 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr ""
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Duración"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Esfuerzo total"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr ""
+
+#, fuzzy
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "Esfuerzo total estimado para este trabajo y sus subtrabajos"
+
+#, fuzzy
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "Esfuerzo total estimado para este trabajo y sus subtrabajos"
+
+#, fuzzy
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "Esfuerzo total estimado para este trabajo y sus subtrabajos"
+
+#, fuzzy
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "Esfuerzo total estimado para este trabajo y sus subtrabajos"
+
+#, fuzzy
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "Esfuerzo total estimado para este trabajo y sus subtrabajos"
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr ""
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr ""
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr ""
+
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/et.po b/modules/project/locale/et.po
new file mode 100644
index 0000000000..fb2566615c
--- /dev/null
+++ b/modules/project/locale/et.po
@@ -0,0 +1,296 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Alamjaotus"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Kommentaar"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "Püüdlus"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Vasak"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Nimi"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Ülem"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Osapool"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Kontaktaadress"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "Progress"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Parem"
+
+#, fuzzy
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Olek"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Ajatabelis saadaval"
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Kestvus"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Töögraafiku lõpp"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "Töögraafiku algus"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Töögraafiku tööd"
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Koku püüdlus"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr "Kogu progress"
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Tüüp"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Nimi"
+
+#, fuzzy
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "Progress"
+
+#, fuzzy
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Tüüp"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Ülesanded"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projektid"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projektid"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Ülesanded"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Töögraafiku read"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Tööpingutused"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Tööpingutused"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Projekt"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projektid"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projektid"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Ülesanded"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Tööpingutused"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Tööpingutused"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Tööpingutused"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Tehtud"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Avatud"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Projekti juhtimine"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Projekt"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Ülesanne"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr "Lõpp"
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Peamine"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr "Algus"
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr "Töögraafik:"
diff --git a/modules/project/locale/fa.po b/modules/project/locale/fa.po
new file mode 100644
index 0000000000..bc17e257bf
--- /dev/null
+++ b/modules/project/locale/fa.po
@@ -0,0 +1,307 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "زیر مجموعه"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "اظهار نظر"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "تلاش"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "چپ"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "منبع"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "نهاد/سازمان"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "آدرس تماس"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "پیشرفت"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "راست"
+
+#, fuzzy
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "وضعیت"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "موجود در جدول زمانی"
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "مدت زمان"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "پایان جدول زمانی"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "شروع جدول زمانی"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "جدول زمانی کارها"
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "مجموع تلاش"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr "مجموع پیشرفت ها"
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "نوع"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "نام"
+
+#, fuzzy
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "پیشرفت"
+
+#, fuzzy
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "نوع"
+
+#, fuzzy
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "تلاش پیش بینی شده برای این کار"
+
+#, fuzzy
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "پیشرفت پیش بینی شده برای این کار"
+
+#, fuzzy
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "کل زمان صرف شده در این کار و زیر کارهای آن"
+
+#, fuzzy
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "برآورد کل تلاش برای این کار و زیرکارهای آن"
+
+#, fuzzy
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "برآورد کل پیشرفت برای این کار و زیرکارهای آن"
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "وظایف"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "پروژه ها"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "پروژه ها"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "وظایف"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "خطوط جدول زمانی"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "تلاش ها کارها"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "تلاش ها کارها"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+"شما نمیتوانید نهاد/سازمان : \"%(party)s\"را هنگامی که پروژه باز با شرکت : "
+"\"%(company)s\"دارد حذف کنید."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+"برای بستن کار \"%(parent)s\"، شما باید ابتدا کار زیرمجموعه :\"%(child)s\" را"
+" ببندید."
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+"برای بازکردن کار \"%(child)s\"، شما باید ابتدا کار منبع:\"%(parent)s\" را "
+"باز کنید."
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "پروژه"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "پروژه ها"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "پروژه ها"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "وظایف"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "تلاش ها کارها"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "تلاش ها کارها"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "تلاش کار"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "انجام شد"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "باز شده"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "مدیریت پروژه"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "پروژه"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "وظیفه"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr "پایان :"
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "عمومی"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr "شروع :"
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr "جدول زمانی :"
diff --git a/modules/project/locale/fi.po b/modules/project/locale/fi.po
new file mode 100644
index 0000000000..afbe2d611c
--- /dev/null
+++ b/modules/project/locale/fi.po
@@ -0,0 +1,294 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr ""
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr ""
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr ""
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+#, fuzzy
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/fr.po b/modules/project/locale/fr.po
new file mode 100644
index 0000000000..f38acb69ec
--- /dev/null
+++ b/modules/project/locale/fr.po
@@ -0,0 +1,295 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Enfants"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Commentaire"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "Effort"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Gauche"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Tiers"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Adresse"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "Progression"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Droite"
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Statut"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponible sur les feuilles de présence"
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Durée"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Fin de feuille de présence"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "Début de feuille de présence"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Feuille de présence des travaux"
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Effort total"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr "Progression totale"
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr "Compter"
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr "Défaut"
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "Progression"
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Types"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "Effort estimé pour ce travail."
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "Progression estimée pour ce travail."
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "Temps total passé sur ce travail et ses sous-travaux."
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "Effort total estimé pour ce travail et ses sous-travaux."
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "Progression total estimée pour ce travail et ses sous-travaux."
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr "Cocher pour montrer le nombre de travaux dans ce statut."
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr "Cocher pour utiliser comme status par défaut pour ce type."
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr "La progression minimale requise pour ce statut."
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr "Le type de travaux qui peuvent utiliser ce statut."
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tâches"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projets"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projets"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tâches"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Lignes de feuille de présence"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Efforts de travail"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr "Statut de travail"
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Efforts de travail"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr "Tous"
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+"Vous ne pouvez pas effacer le tiers « %(party)s » tant qu'il a des projets "
+"ouverts avec la société « %(company)s »."
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+"Pour terminer le travail « %(work)s », vous devez également terminer tous "
+"ses enfants."
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+"Pour définir le travail « %(work)s » dans le statut « %(status)s », vous "
+"devez augmenter sa progression jusqu'à au moins %(progress)s."
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+"Pour rouvrir le travail « %(work)s », vous devez également rouvrir son "
+"parent « %(parent)s »."
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Projet"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projets"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projets"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapports"
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tâches"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Efforts de travail"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr "Statut de travail"
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Efforts de travail"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Effort de travail"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr "Statut de travail"
+
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Terminés"
+
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Ouverts"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Administration des projets"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Projet"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tâche"
+
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr "Fin :"
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr "Début :"
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr "Feuilles de présence :"
diff --git a/modules/project/locale/hu.po b/modules/project/locale/hu.po
new file mode 100644
index 0000000000..d1eee099d8
--- /dev/null
+++ b/modules/project/locale/hu.po
@@ -0,0 +1,308 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Gyermek (csomag)"
+
+#, fuzzy
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Megjegyzés"
+
+#, fuzzy
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Társaság"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Név"
+
+#, fuzzy
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Szülő (csomag)"
+
+#, fuzzy
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Partner"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Állapot"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Időtartam"
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Időkövetés vége"
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "Időkövetés kezdete"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr ""
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Típus"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Típus"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Beállítások"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+#, fuzzy
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Kész"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/id.po b/modules/project/locale/id.po
new file mode 100644
index 0000000000..01b1e4d045
--- /dev/null
+++ b/modules/project/locale/id.po
@@ -0,0 +1,289 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Cabang"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Komentar"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Kiri"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Induk"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Pihak"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Kanan"
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr ""
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr ""
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr ""
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr ""
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Umum"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr "Mulai:"
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/it.po b/modules/project/locale/it.po
new file mode 100644
index 0000000000..e9e5977a99
--- /dev/null
+++ b/modules/project/locale/it.po
@@ -0,0 +1,303 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Figlio"
+
+#, fuzzy
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Commento"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Sinistra"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+#, fuzzy
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Controparti"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Destra"
+
+#, fuzzy
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Stato"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Durata"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr ""
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Tipo"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+#, fuzzy
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Generale"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/lo.po b/modules/project/locale/lo.po
new file mode 100644
index 0000000000..f5a68ec03f
--- /dev/null
+++ b/modules/project/locale/lo.po
@@ -0,0 +1,309 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "ໝວດຍ່ອຍ"
+
+#, fuzzy
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "ຄໍາເຫັນ"
+
+#, fuzzy
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+#, fuzzy
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "ຮ່ວງ"
+
+#, fuzzy
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "ພາກສ່ວນ"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "ສະຖານະ"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "ກຳນົດເວລາ"
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "ຕາຕະລາງເຮັດວຽກຈົບເວລາ"
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "ຕາຕະລາງເຮັດວຽກເລີ້ມເວລາ"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr ""
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "ຮູບແບບ"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "ຮູບແບບ"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "ການຕັ້ງຄ່າ"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+#, fuzzy
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "ທົ່ວໄປ"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/lt.po b/modules/project/locale/lt.po
new file mode 100644
index 0000000000..9d0d8ff988
--- /dev/null
+++ b/modules/project/locale/lt.po
@@ -0,0 +1,296 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Komentaras"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Kontrahentas"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Kontaktinis adresas"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr ""
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr ""
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+#, fuzzy
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/nl.po b/modules/project/locale/nl.po
new file mode 100644
index 0000000000..ed968c3138
--- /dev/null
+++ b/modules/project/locale/nl.po
@@ -0,0 +1,295 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Onderliggende niveaus"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Opmerking"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "Inspanning"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Links"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Relatie"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "contact adres"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "Vooruitgang"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Rechts"
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Status"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Beschikbaar in tijdregistartie"
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Looptijd"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Einde urenstaat"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "Start urenstaat"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Tijdsregistratie werken"
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Totale inspanning"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr "Totale vooruitgang"
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr "Tellen"
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr "Standaard"
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "Vooruitgang"
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Types"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "Geschatte inspanning voor dit werk."
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "Geschatte voortgang voor dit werk."
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "Totale tijd besteed aan dit werk en de subwerken."
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "Geschatte totale inspanning voor dit werk en de subwerken."
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "Geschatte totale voortgang voor dit werk en de subwerken."
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr "Vink aan om het aantal werken in deze status te tonen."
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr "Vink aan om als standaardstatus voor het type te gebruiken."
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr "De minimaal vereiste voortgang voor deze status."
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr "Het soort werken dat deze status kan gebruiken."
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "taken"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "projecten"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "projecten"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "taken"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Tijdregistratieregel"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Werkt inspanningen"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr "Werk status"
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Werkt inspanningen"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+"U kunt de relatie \"%(party)s\" niet verwijderen terwijl ze facturen in "
+"behandeling hebben bij bedrijf \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+"Om het werk \"%(work)s\" te voltooien, moet u ook al zijn kinderen "
+"voltooien."
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+"Om werk \"%(work)s\" in te stellen op \"%(status)s\" status, moet u de "
+"progressie (vooruitgang) verhogen tot minstens %(progress)s."
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+"Om werk \"%(work)s\" opnieuw te openen, moet u ook het bovenliggende niveau "
+"\"%(parent)s\" opnieuw openen."
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "projecten"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "projecten"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapporten"
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "taken"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Werkt inspanningen"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr "Werk status"
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Werkt inspanningen"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Arbeidsinspanning"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr "Werk status"
+
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Open"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Project"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Taak"
+
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr "Einde:"
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr "Begin:"
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr "Tijdsregistratie:"
diff --git a/modules/project/locale/pl.po b/modules/project/locale/pl.po
new file mode 100644
index 0000000000..5684bb495a
--- /dev/null
+++ b/modules/project/locale/pl.po
@@ -0,0 +1,308 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Elementy podrzędne"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Komentarz"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "W lewo"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Element nadrzędny"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Strona"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Adres kontaktu"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "Postęp"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "W prawo"
+
+#, fuzzy
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Stan"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Czas trwania"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr ""
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+#, fuzzy
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "Postęp"
+
+#, fuzzy
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Typ"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+#, fuzzy
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Projekt"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Zadanie"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Ogólne"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/pt.po b/modules/project/locale/pt.po
new file mode 100644
index 0000000000..2492f78721
--- /dev/null
+++ b/modules/project/locale/pt.po
@@ -0,0 +1,305 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Filhos"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Comentário"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "Esforço"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Esquerda"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Pai"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Parceiro"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Endereço de contato"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "Progresso"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Direita"
+
+#, fuzzy
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Disponível em quadros de tempo"
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Duração"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Fim do Horário de Trabalho"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "Início do Horário de Trabalho"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Horários de Trabalho"
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Esforço total"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr "Progresso Total"
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Nome"
+
+#, fuzzy
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "Progresso"
+
+#, fuzzy
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Tipo"
+
+#, fuzzy
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "Esforço estimado para este trabalho"
+
+#, fuzzy
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "Esforço estimado para este trabalho"
+
+#, fuzzy
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "Tempo total gasto nesta tarefa e nas sub-tarefas"
+
+#, fuzzy
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "O esforço total estimado para este trabalho e tarefas secundárias"
+
+#, fuzzy
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "O progresso total estimado para esta tarefa e para suas sub-tarefas."
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tarefas"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projetos"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projetos"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tarefas"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Linhas de Horário de Trabalho"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Esforços de trabalhos"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Esforços de trabalhos"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+"Você não pode remover a pessoa \"%(party)s\" enquanto ela tiver projetos em "
+"aberto com a empresa \"%(company)s\"."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+"Para fechar o trabalho \"%(parent)s\", você precisa fechar o trabalho "
+"\"%(child)s\"."
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr "Para abrir o trabalho \"%(child)s\", você precisa abrir \"%(parent)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuração"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Projeto"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projetos"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projetos"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tarefas"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Esforços de Trabalhos"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Esforços de Trabalhos"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Esforço do trabalho"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Concluído"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Aberto"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Administração de Projetos"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Projeto"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tarefa"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr "Fim:"
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Geral"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr "Início:"
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr "Quadro de Tempo:"
diff --git a/modules/project/locale/ro.po b/modules/project/locale/ro.po
new file mode 100644
index 0000000000..1372542acc
--- /dev/null
+++ b/modules/project/locale/ro.po
@@ -0,0 +1,287 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Copii"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "Efort"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Rămas"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Părinte"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Parte"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr ""
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr ""
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configurare"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Raportare"
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr ""
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr ""
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr ""
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr ""
+
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/ru.po b/modules/project/locale/ru.po
new file mode 100644
index 0000000000..8f34a6ec0b
--- /dev/null
+++ b/modules/project/locale/ru.po
@@ -0,0 +1,318 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Подчиненый"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Комментарии"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Левая сторона"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Предок"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Контрагент"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Контактный адрес"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Правая сторона"
+
+#, fuzzy
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Состояние"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Доступно в табелях"
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Продолжительность"
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Конечная дата табеля"
+
+#, fuzzy
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "Начальная дата табеля"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Общие затраты"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Тип"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Тип"
+
+#, fuzzy
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "Предположительные общие затраты для этой работы и подчиненных работ"
+
+#, fuzzy
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "Предположительные общие затраты для этой работы и подчиненных работ"
+
+#, fuzzy
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "Предположительные общие затраты для этой работы и подчиненных работ"
+
+#, fuzzy
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "Предположительные общие затраты для этой работы и подчиненных работ"
+
+#, fuzzy
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "Предположительные общие затраты для этой работы и подчиненных работ"
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Рабочие затраты"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Проект"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Задача"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Основной"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/sl.po b/modules/project/locale/sl.po
new file mode 100644
index 0000000000..10a93b367a
--- /dev/null
+++ b/modules/project/locale/sl.po
@@ -0,0 +1,314 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Podnaloge"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Opomba"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "Porabljen čas"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "Levo"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "Matičnia dejavnost"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "Partner"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "Kontakt"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "Napredek"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "Desno"
+
+#, fuzzy
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "Stanje"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "Na evidenci"
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "Trajanje"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "Konec evidence"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "Začetek evidence"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "Evidentirane naloge"
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "Ocena skupaj"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr "Napredek skupaj"
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "Naziv"
+
+#, fuzzy
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "Napredek"
+
+#, fuzzy
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "Tip"
+
+#, fuzzy
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "Ocenjen čas za to nalogo"
+
+#, fuzzy
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "Ocenjen napredek za to nalogo"
+
+#, fuzzy
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "Skupni čas, porabljen na tej nalogi in podnalogami."
+
+#, fuzzy
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "Skupen čas, porabljen za to nalogo in podnaloge"
+
+#, fuzzy
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "Skupen napredek za to nalogo in podnaloge"
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Ocena naloge"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Projekt"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Naloga"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "Splošno"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/tr.po b/modules/project/locale/tr.po
new file mode 100644
index 0000000000..93d9d175ea
--- /dev/null
+++ b/modules/project/locale/tr.po
@@ -0,0 +1,293 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "Alt Öge"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "Açıklama"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr ""
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr ""
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr ""
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr ""
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr ""
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr ""
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr ""
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr ""
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr ""
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr ""
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr ""
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr ""
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr ""
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr ""
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "Project"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "Projects"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "Tasks"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "Works Efforts"
+
+#, fuzzy
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "Works Efforts"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "Opened"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "Project Administration"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "Project"
+
+#, fuzzy
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "Tasks"
+
+#, fuzzy
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr ""
diff --git a/modules/project/locale/zh_CN.po b/modules/project/locale/zh_CN.po
new file mode 100644
index 0000000000..b9da8937a1
--- /dev/null
+++ b/modules/project/locale/zh_CN.po
@@ -0,0 +1,287 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,children:"
+msgid "Children"
+msgstr "子工作"
+
+msgctxt "field:project.work,comment:"
+msgid "Comment"
+msgstr "说明"
+
+msgctxt "field:project.work,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:project.work,effort_duration:"
+msgid "Effort"
+msgstr "投入"
+
+msgctxt "field:project.work,left:"
+msgid "Left"
+msgstr "左"
+
+msgctxt "field:project.work,name:"
+msgid "Name"
+msgstr "名称"
+
+msgctxt "field:project.work,parent:"
+msgid "Parent"
+msgstr "父工作"
+
+msgctxt "field:project.work,party:"
+msgid "Party"
+msgstr "参与者"
+
+msgctxt "field:project.work,party_address:"
+msgid "Contact Address"
+msgstr "联系地址"
+
+msgctxt "field:project.work,progress:"
+msgid "Progress"
+msgstr "进度"
+
+msgctxt "field:project.work,right:"
+msgid "Right"
+msgstr "右"
+
+msgctxt "field:project.work,status:"
+msgid "Status"
+msgstr "状态"
+
+msgctxt "field:project.work,timesheet_available:"
+msgid "Available on timesheets"
+msgstr "在时间表上显示"
+
+msgctxt "field:project.work,timesheet_duration:"
+msgid "Duration"
+msgstr "工期"
+
+msgctxt "field:project.work,timesheet_end_date:"
+msgid "Timesheet End"
+msgstr "时间表结束"
+
+msgctxt "field:project.work,timesheet_start_date:"
+msgid "Timesheet Start"
+msgstr "时间表开始"
+
+msgctxt "field:project.work,timesheet_works:"
+msgid "Timesheet Works"
+msgstr "时间表工作"
+
+msgctxt "field:project.work,total_effort:"
+msgid "Total Effort"
+msgstr "总投入"
+
+msgctxt "field:project.work,total_progress:"
+msgid "Total Progress"
+msgstr "总进度"
+
+msgctxt "field:project.work,type:"
+msgid "Type"
+msgstr "类型"
+
+msgctxt "field:project.work.status,count:"
+msgid "Count"
+msgstr "计数"
+
+msgctxt "field:project.work.status,default:"
+msgid "Default"
+msgstr "默认"
+
+msgctxt "field:project.work.status,name:"
+msgid "Name"
+msgstr "姓名"
+
+msgctxt "field:project.work.status,progress:"
+msgid "Progress"
+msgstr "进度"
+
+msgctxt "field:project.work.status,types:"
+msgid "Types"
+msgstr "类型"
+
+msgctxt "help:project.work,effort_duration:"
+msgid "Estimated Effort for this work."
+msgstr "这项工作的估计工作量."
+
+msgctxt "help:project.work,progress:"
+msgid "Estimated progress for this work."
+msgstr "这项工作的估计进度."
+
+msgctxt "help:project.work,timesheet_duration:"
+msgid "Total time spent on this work and the sub-works."
+msgstr "这项工作和其子工作的总投入时间."
+
+msgctxt "help:project.work,total_effort:"
+msgid "Estimated total effort for this work and the sub-works."
+msgstr "这项工作和其子工作的估计总工作量."
+
+msgctxt "help:project.work,total_progress:"
+msgid "Estimated total progress for this work and the sub-works."
+msgstr "这项工作和其子工作的估计总进度."
+
+msgctxt "help:project.work.status,count:"
+msgid "Check to show the number of works in this status."
+msgstr "选中可显示此状态下的工作数."
+
+msgctxt "help:project.work.status,default:"
+msgid "Check to use as default status for the type."
+msgstr "选中后,将用作此种类型的默认状态."
+
+msgctxt "help:project.work.status,progress:"
+msgid "The minimum progress required for this status."
+msgstr "此状态要求的最小进度."
+
+msgctxt "help:project.work.status,types:"
+msgid "The type of works which can use this status."
+msgstr "可以使用此状态的工作类型."
+
+msgctxt "model:ir.action,name:act_open_child_work"
+msgid "Tasks"
+msgstr "任务"
+
+msgctxt "model:ir.action,name:act_project_form"
+msgid "Projects"
+msgstr "项目"
+
+msgctxt "model:ir.action,name:act_project_tree"
+msgid "Projects"
+msgstr "项目"
+
+msgctxt "model:ir.action,name:act_task_form"
+msgid "Tasks"
+msgstr "任务"
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_work"
+msgid "Timesheet Lines"
+msgstr "时间表明细"
+
+msgctxt "model:ir.action,name:act_work_list"
+msgid "Works Efforts"
+msgstr "工作量"
+
+msgctxt "model:ir.action,name:act_work_status"
+msgid "Work Status"
+msgstr "工作状态"
+
+msgctxt "model:ir.action,name:act_work_tree"
+msgid "Works Efforts"
+msgstr "工作量"
+
+msgctxt "model:ir.message,text:msg_domain_all"
+msgid "All"
+msgstr "所有"
+
+msgctxt "model:ir.message,text:msg_erase_party_opened_project"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have opened projects with "
+"company \"%(company)s\"."
+msgstr "无法清除参与者 \"%(party)s\" , 因为他们与公司 \"%(company)s\" 有未完成项目."
+
+msgctxt "model:ir.message,text:msg_work_children_progress"
+msgid "To complete work \"%(work)s\" you must complete also all its children."
+msgstr "如果要完成工作 \"%(work)s\",你必须完成它的所有子工作."
+
+msgctxt "model:ir.message,text:msg_work_invalid_progress_status"
+msgid ""
+"To set work \"%(work)s\" in \"%(status)s\" status, you must increase its "
+"progress up to at least %(progress)s."
+msgstr "如果要设置工作 \"%(work)s\" 的状态为 \"%(status)s\",你必须将其进度推进到至少 %(progress)s."
+
+msgctxt "model:ir.message,text:msg_work_parent_progress"
+msgid "To re-open work \"%(work)s\" you must re-open also its parent \"%(parent)s\"."
+msgstr "如果要重新开启工作 \"%(work)s\",你首先必须重新开启它的父工作 \"%(parent)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_work_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.ui.menu,name:menu_project"
+msgid "Project"
+msgstr "项目"
+
+msgctxt "model:ir.ui.menu,name:menu_project_form"
+msgid "Projects"
+msgstr "项目"
+
+msgctxt "model:ir.ui.menu,name:menu_project_tree"
+msgid "Projects"
+msgstr "项目"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_task_form"
+msgid "Tasks"
+msgstr "任务"
+
+msgctxt "model:ir.ui.menu,name:menu_work_list"
+msgid "Works Efforts"
+msgstr "工作量"
+
+msgctxt "model:ir.ui.menu,name:menu_work_status"
+msgid "Work Status"
+msgstr "工作状态"
+
+msgctxt "model:ir.ui.menu,name:menu_work_tree"
+msgid "Works Efforts"
+msgstr "工作量"
+
+msgctxt "model:project.work,name:"
+msgid "Work Effort"
+msgstr "工作量"
+
+msgctxt "model:project.work.status,name:"
+msgid "Work Status"
+msgstr "工作状态"
+
+msgctxt "model:project.work.status,name:work_done_status"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "model:project.work.status,name:work_open_status"
+msgid "Open"
+msgstr "开启"
+
+msgctxt "model:res.group,name:group_project_admin"
+msgid "Project Administration"
+msgstr "项目管理"
+
+msgctxt "selection:project.work,type:"
+msgid "Project"
+msgstr "项目"
+
+msgctxt "selection:project.work,type:"
+msgid "Task"
+msgstr "任务"
+
+msgctxt "view:project.work.status:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:project.work:"
+msgid "End:"
+msgstr "结束:"
+
+msgctxt "view:project.work:"
+msgid "General"
+msgstr "常规"
+
+msgctxt "view:project.work:"
+msgid "Start:"
+msgstr "开始:"
+
+msgctxt "view:project.work:"
+msgid "Timesheet:"
+msgstr "时间表:"
diff --git a/modules/project/message.xml b/modules/project/message.xml
new file mode 100644
index 0000000000..f3d5af46d6
--- /dev/null
+++ b/modules/project/message.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ To set work "%(work)s" in "%(status)s" status, you must increase its progress up to at least %(progress)s.
+
+
+ To complete work "%(work)s" you must complete also all its children.
+
+
+ To re-open work "%(work)s" you must re-open also its parent "%(parent)s".
+
+
+ You cannot erase party "%(party)s" while they have opened projects with company "%(company)s".
+
+
+ All
+
+
+
diff --git a/modules/project/party.py b/modules/project/party.py
new file mode 100644
index 0000000000..b161fb8a2a
--- /dev/null
+++ b/modules/project/party.py
@@ -0,0 +1,36 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.i18n import gettext
+from trytond.pool import PoolMeta, Pool
+
+from trytond.modules.party.exceptions import EraseError
+
+
+class Replace(metaclass=PoolMeta):
+ __name__ = 'party.replace'
+
+ @classmethod
+ def fields_to_replace(cls):
+ return super().fields_to_replace() + [
+ ('project.work', 'party'),
+ ]
+
+
+class Erase(metaclass=PoolMeta):
+ __name__ = 'party.erase'
+
+ def check_erase_company(self, party, company):
+ pool = Pool()
+ Work = pool.get('project.work')
+ super().check_erase_company(party, company)
+
+ works = Work.search([
+ ('party', '=', party.id),
+ ('company', '=', company.id),
+ ('progress', '!=', 1),
+ ])
+ if works:
+ raise EraseError(
+ gettext('project.msg_erase_party_opened_project',
+ party=party.rec_name,
+ company=company.rec_name))
diff --git a/modules/project/project.xml b/modules/project/project.xml
new file mode 100644
index 0000000000..ea8bd0d740
--- /dev/null
+++ b/modules/project/project.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+ Project Administration
+
+
+
+
+
+
+
+ tryton-project
+ icons/tryton-project.svg
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/project/setup.py b/modules/project/setup.py
new file mode 100755
index 0000000000..8cd41b8975
--- /dev/null
+++ b/modules/project/setup.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import re
+import os
+import io
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_project'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = ['python-sql >= 0.4']
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [get_require_version('proteus')]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module with projects',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/project',
+ },
+ keywords='tryton project',
+ package_dir={'trytond.modules.project': '.'},
+ packages=(
+ ['trytond.modules.project']
+ + ['trytond.modules.project.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.project': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'icons/*.svg',
+ '*.fodt', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ project = trytond.modules.project
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/project/tests/__init__.py b/modules/project/tests/__init__.py
new file mode 100644
index 0000000000..eb8c40ff34
--- /dev/null
+++ b/modules/project/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.project.tests.test_project import suite
+except ImportError:
+ from .test_project import suite
+
+__all__ = ['suite']
diff --git a/modules/project/tests/scenario_project_status.rst b/modules/project/tests/scenario_project_status.rst
new file mode 100644
index 0000000000..cc09488f68
--- /dev/null
+++ b/modules/project/tests/scenario_project_status.rst
@@ -0,0 +1,94 @@
+=======================
+Project Status Scenario
+=======================
+
+Imports::
+
+ >>> from proteus import Model
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company
+
+Activate project::
+
+ >>> config = activate_modules('project')
+
+Create a company::
+
+ >>> _ = create_company()
+
+Create status::
+
+ >>> WorkStatus = Model.get('project.work.status')
+ >>> in_progress = WorkStatus(name="In-Progress", types=['project'])
+ >>> in_progress.progress = 0.1
+ >>> in_progress.save()
+ >>> open, = WorkStatus.find([('name', '=', "Open")])
+ >>> done, = WorkStatus.find([('name', '=', "Done")])
+
+Create a project with a task::
+
+ >>> Work = Model.get('project.work')
+
+ >>> project = Work(type='project', name="Project")
+ >>> project.status == open
+ True
+ >>> task = project.children.new(name="Task")
+ >>> task.status == open
+ True
+
+ >>> project.save()
+ >>> task, = project.children
+
+Open the project::
+
+ >>> project.status = in_progress
+ >>> project.progress
+ 0.1
+ >>> project.save()
+
+Try to complete project without task::
+
+ >>> project.status = done
+ >>> project.progress
+ 1.0
+ >>> project.save() # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ WorkProgressValidationError: ...
+
+ >>> task, = project.children
+ >>> task.progress = 1
+ >>> project.save()
+
+Try to re-open task without project::
+
+ >>> task = Work(task.id)
+ >>> task.progress = 0.5
+ >>> task.save() # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ WorkProgressValidationError: ...
+
+Change progress with updating status::
+
+ >>> project.progress = 0.8
+ >>> project.save() # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ WorkProgressValidationError: ...
+
+ >>> project.status = in_progress
+ >>> project.save()
+
+Re-open task::
+
+ >>> task = Work(task.id)
+ >>> task.progress = 0.5
+ >>> task.save()
+
+Copy the project::
+
+ >>> project_copy, = project.duplicate()
+ >>> project_copy.status == open
+ True
+ >>> project_copy.progress
diff --git a/modules/project/tests/test_project.py b/modules/project/tests/test_project.py
new file mode 100644
index 0000000000..869fa651f3
--- /dev/null
+++ b/modules/project/tests/test_project.py
@@ -0,0 +1,201 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import datetime
+import doctest
+import unittest
+
+import trytond.tests.test_tryton
+from trytond.pool import Pool
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.tests.test_tryton import doctest_checker
+from trytond.tests.test_tryton import doctest_teardown
+from trytond.transaction import Transaction
+
+from trytond.modules.company.tests import (
+ create_company, set_company, PartyCompanyCheckEraseMixin,
+ CompanyTestMixin)
+
+
+class ProjectTestCase(
+ PartyCompanyCheckEraseMixin, CompanyTestMixin, ModuleTestCase):
+ 'Test Project module'
+ module = 'project'
+
+ @with_transaction()
+ def test_sum_tree(self):
+ 'Test sum_tree'
+ pool = Pool()
+ ProjectWork = pool.get('project.work')
+
+ company = create_company()
+ with set_company(company):
+ p_work_1, = ProjectWork.create([{
+ 'name': 'Work 1',
+ 'company': company.id,
+ 'effort_duration': datetime.timedelta(hours=1),
+ }])
+
+ p_work_1_1, = ProjectWork.create([{
+ 'name': 'Work 1 1',
+ 'company': company.id,
+ 'parent': p_work_1.id,
+ 'effort_duration': datetime.timedelta(hours=1),
+ }])
+
+ p_work_1_2, = ProjectWork.create([{
+ 'name': 'Work 1 2',
+ 'company': company.id,
+ 'parent': p_work_1.id,
+ 'effort_duration': datetime.timedelta(hours=1),
+ }])
+
+ p_work_1_1_1, = ProjectWork.create([{
+ 'name': 'Work 1 1 1',
+ 'company': company.id,
+ 'parent': p_work_1_1.id,
+ 'effort_duration': datetime.timedelta(hours=1),
+ }])
+
+ p_work_1_1_2, = ProjectWork.create([{
+ 'name': 'Work 1 1 2',
+ 'company': company.id,
+ 'parent': p_work_1_1.id,
+ 'effort_duration': datetime.timedelta(hours=1),
+ }])
+
+ p_work_1_1_3, = ProjectWork.create([{
+ 'name': 'Work 1 1 3',
+ 'company': company.id,
+ 'parent': p_work_1_1.id,
+ 'effort_duration': datetime.timedelta(hours=1),
+ }])
+
+ for work, total_effort in (
+ (p_work_1, 6),
+ (p_work_1_1, 4),
+ (p_work_1_2, 1),
+ (p_work_1_1_1, 1),
+ (p_work_1_1_2, 1),
+ (p_work_1_1_3, 1),
+ ):
+ self.assertEqual(work.total_effort,
+ datetime.timedelta(hours=total_effort))
+
+ @with_transaction()
+ def test_timesheet_available(self):
+ 'Test timesheet available'
+ pool = Pool()
+ ProjectWork = pool.get('project.work')
+
+ company = create_company()
+ with set_company(company):
+ p_work = ProjectWork()
+ p_work.name = 'Project Work'
+ p_work.save()
+
+ self.assertFalse(p_work.timesheet_works)
+
+ p_work.timesheet_available = True
+ p_work.save()
+
+ self.assertEqual(len(p_work.timesheet_works), 1)
+
+ p_work.timesheet_available = False
+ p_work.save()
+
+ self.assertFalse(p_work.timesheet_works)
+
+ @with_transaction(context={'_check_access': True})
+ def test_delete_access(self):
+ 'Test delete_access'
+ pool = Pool()
+ User = pool.get('res.user')
+ Group = pool.get('res.group')
+ ModelData = pool.get('ir.model.data')
+ ProjectWork = pool.get('project.work')
+ TimesheetWork = pool.get('timesheet.work')
+
+ company = create_company()
+ with set_company(company):
+ project_user = User()
+ project_user.login = 'project'
+ project_user.companies = [company]
+ project_user.company = company
+ project_group = Group(ModelData.get_id(
+ 'project', 'group_project_admin'))
+ project_user.groups = [project_group]
+ project_user.save()
+ with Transaction().set_user(project_user.id):
+ p_work = ProjectWork()
+ p_work.name = 'Project Work'
+ p_work.timesheet_available = True
+ p_work.save()
+
+ self.assertEqual(len(p_work.timesheet_works), 1)
+ ProjectWork.delete([p_work])
+ self.assertEqual(TimesheetWork.search([]), [])
+
+ @with_transaction()
+ def test_timesheet_default_work_empty(self):
+ "Test timesheet default work with no context"
+ pool = Pool()
+ ProjectWork = pool.get('project.work')
+ TimesheetLine = pool.get('timesheet.line')
+
+ company = create_company()
+ with set_company(company):
+ p_work = ProjectWork()
+ p_work.name = "Work"
+ p_work.timesheet_available = True
+ p_work.save()
+
+ self.assertFalse(TimesheetLine.default_work())
+
+ @with_transaction()
+ def test_timesheet_default_work_single(self):
+ "Test timesheet default work with 1 work in context"
+ pool = Pool()
+ ProjectWork = pool.get('project.work')
+ TimesheetLine = pool.get('timesheet.line')
+
+ company = create_company()
+ with set_company(company):
+ p_work = ProjectWork()
+ p_work.name = "Work"
+ p_work.timesheet_available = True
+ p_work.save()
+
+ with Transaction().set_context({'project.work': [p_work.id]}):
+ self.assertEqual(
+ TimesheetLine.default_work(),
+ p_work.timesheet_works[0].id)
+
+ @with_transaction()
+ def test_timesheet_default_work_multiple(self):
+ "Test timesheet default work with multiple work in context"
+ pool = Pool()
+ ProjectWork = pool.get('project.work')
+ TimesheetLine = pool.get('timesheet.line')
+
+ company = create_company()
+ with set_company(company):
+ works = ProjectWork.create([
+ {'name': "Work 1", 'timesheet_available': True},
+ {'name': "Work 2", 'timesheet_available': True},
+ ])
+
+ with Transaction().set_context(
+ {'project.work': map(int, works)}):
+ self.assertFalse(TimesheetLine.default_work())
+
+
+def suite():
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProjectTestCase))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_project_status.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ return suite
diff --git a/modules/project/timesheet.py b/modules/project/timesheet.py
new file mode 100644
index 0000000000..039b51da10
--- /dev/null
+++ b/modules/project/timesheet.py
@@ -0,0 +1,41 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import PoolMeta, Pool
+from trytond.transaction import Transaction
+
+
+class Line(metaclass=PoolMeta):
+ __name__ = 'timesheet.line'
+
+ @classmethod
+ def default_work(cls):
+ pool = Pool()
+ Work = pool.get('timesheet.work')
+ try:
+ default = super().default_work()
+ except AttributeError:
+ default = None
+ project_works = Transaction().context.get('project.work')
+ if project_works is not None:
+ works = Work.search([
+ ('origin.id', 'in', project_works, 'project.work'),
+ ])
+ if len(works) == 1:
+ default = works[0].id
+ return default
+
+
+class Work(metaclass=PoolMeta):
+ __name__ = 'timesheet.work'
+
+ @classmethod
+ def _get_origin(cls):
+ return super()._get_origin() + ['project.work']
+
+ def _validate_company(self):
+ pool = Pool()
+ ProjectWork = pool.get('project.work')
+ result = super()._validate_company()
+ if isinstance(self.origin, ProjectWork):
+ result &= self.company == self.origin.company
+ return result
diff --git a/modules/project/timesheet.xml b/modules/project/timesheet.xml
new file mode 100644
index 0000000000..602020015e
--- /dev/null
+++ b/modules/project/timesheet.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+ Timesheet Lines
+ timesheet.line
+
+
+
+
+ form_relate
+ project.work,-1
+
+
+
+
diff --git a/modules/project/tox.ini b/modules/project/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/project/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/project/tryton.cfg b/modules/project/tryton.cfg
new file mode 100644
index 0000000000..b8cde7a86f
--- /dev/null
+++ b/modules/project/tryton.cfg
@@ -0,0 +1,13 @@
+[tryton]
+version=6.0.1
+depends:
+ company
+ company_work_time
+ ir
+ party
+ timesheet
+xml:
+ project.xml
+ work.xml
+ timesheet.xml
+ message.xml
diff --git a/modules/project/view/work_form.xml b/modules/project/view/work_form.xml
new file mode 100644
index 0000000000..9ab705c1ba
--- /dev/null
+++ b/modules/project/view/work_form.xml
@@ -0,0 +1,59 @@
+
+
+
diff --git a/modules/project/view/work_list.xml b/modules/project/view/work_list.xml
new file mode 100644
index 0000000000..d8978d9d16
--- /dev/null
+++ b/modules/project/view/work_list.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/project/view/work_list_children.xml b/modules/project/view/work_list_children.xml
new file mode 100644
index 0000000000..3fc46d0d77
--- /dev/null
+++ b/modules/project/view/work_list_children.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/project/view/work_list_simple.xml b/modules/project/view/work_list_simple.xml
new file mode 100644
index 0000000000..78137e4aaa
--- /dev/null
+++ b/modules/project/view/work_list_simple.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/project/view/work_status_form.xml b/modules/project/view/work_status_form.xml
new file mode 100644
index 0000000000..417be4e3fd
--- /dev/null
+++ b/modules/project/view/work_status_form.xml
@@ -0,0 +1,24 @@
+
+
+
diff --git a/modules/project/view/work_status_list.xml b/modules/project/view/work_status_list.xml
new file mode 100644
index 0000000000..38f64e372f
--- /dev/null
+++ b/modules/project/view/work_status_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/project/view/work_tree.xml b/modules/project/view/work_tree.xml
new file mode 100644
index 0000000000..45f1936c04
--- /dev/null
+++ b/modules/project/view/work_tree.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/project/view/work_tree_simple.xml b/modules/project/view/work_tree_simple.xml
new file mode 100644
index 0000000000..1093963c03
--- /dev/null
+++ b/modules/project/view/work_tree_simple.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/project/work.py b/modules/project/work.py
new file mode 100644
index 0000000000..bcd08aff66
--- /dev/null
+++ b/modules/project/work.py
@@ -0,0 +1,542 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import datetime
+
+from sql import Null
+
+from trytond.cache import Cache
+from trytond.i18n import gettext
+from trytond.model import (
+ ModelView, ModelSQL, fields, sequence_ordered, tree, DeactivableMixin)
+from trytond.transaction import Transaction
+from trytond.pool import Pool
+from trytond.pyson import Eval, If, Bool, PYSONEncoder
+from trytond.tools import reduce_ids, grouped_slice
+
+from .exceptions import WorkProgressValidationError
+
+
+class WorkStatus(DeactivableMixin, sequence_ordered(), ModelSQL, ModelView):
+ 'Work Status'
+ __name__ = 'project.work.status'
+
+ _get_default_status_cache = Cache('project_work_status.get_default_status')
+ _get_window_domains_cache = Cache('project_work_status.get_window_domains')
+
+ types = fields.MultiSelection(
+ 'get_types', "Types",
+ help="The type of works which can use this status.")
+ name = fields.Char("Name", required=True, translate=True)
+ progress = fields.Float(
+ "Progress",
+ domain=['OR',
+ ('progress', '=', None),
+ [
+ ('progress', '>=', 0),
+ ('progress', '<=', 1),
+ ],
+ ],
+ help="The minimum progress required for this status.")
+ default = fields.Boolean(
+ "Default",
+ help="Check to use as default status for the type.")
+ count = fields.Boolean(
+ "Count",
+ help="Check to show the number of works in this status.")
+
+ @classmethod
+ def get_types(cls):
+ pool = Pool()
+ Work = pool.get('project.work')
+ return Work.fields_get(['type'])['type']['selection']
+
+ @classmethod
+ def get_default_status(cls, type_=None):
+ if type_ is None:
+ return None
+ status = cls._get_default_status_cache.get(type_, -1)
+ if status != -1:
+ return status
+ records = cls.search([
+ ('types', 'in', type_),
+ ('default', '=', True)
+ ], limit=1)
+ if records:
+ status = records[0].id
+ else:
+ status = None
+ cls._get_default_status_cache.set(type, status)
+ return status
+
+ @classmethod
+ def create(cls, vlist):
+ cls._get_default_status_cache.clear()
+ cls._get_window_domains_cache.clear()
+ return super().create(vlist)
+
+ @classmethod
+ def write(cls, *args):
+ super().write(*args)
+ cls._get_default_status_cache.clear()
+ cls._get_window_domains_cache.clear()
+
+ @classmethod
+ def delete(cls, status):
+ cls._get_default_status_cache.clear()
+ cls._get_window_domains_cache.clear()
+ super().delete(status)
+
+ @classmethod
+ def get_window_domains(cls, action):
+ pool = Pool()
+ Data = pool.get('ir.model.data')
+ if action.id == Data.get_id('project', 'act_project_tree'):
+ return cls._get_window_domains([x[0] for x in cls.get_types()])
+ elif action.id == Data.get_id('project', 'act_project_form'):
+ return cls._get_window_domains(['project'])
+ elif action.id == Data.get_id('project', 'act_task_form'):
+ return cls._get_window_domains(['task'])
+ else:
+ return []
+
+ @classmethod
+ def _get_window_domains(cls, types):
+ key = tuple(sorted(types))
+ domains = cls._get_window_domains_cache.get(key)
+ if domains is not None:
+ return domains
+ encoder = PYSONEncoder()
+ domains = []
+ for status in cls.search([('types', 'in', types)]):
+ domain = encoder.encode([('status', '=', status.id)])
+ domains.append((status.name, domain, status.count))
+ if domains:
+ domains.append(
+ (gettext('project.msg_domain_all'), '[]', False))
+ cls._get_window_domains_cache.set(key, domains)
+ return domains
+
+
+class Work(sequence_ordered(), tree(separator='\\'), ModelSQL, ModelView):
+ 'Work Effort'
+ __name__ = 'project.work'
+ name = fields.Char('Name', required=True, select=True)
+ type = fields.Selection([
+ ('project', 'Project'),
+ ('task', 'Task')
+ ],
+ 'Type', required=True, select=True)
+ company = fields.Many2One('company.company', 'Company', required=True,
+ select=True)
+ party = fields.Many2One('party.party', 'Party',
+ states={
+ 'invisible': Eval('type') != 'project',
+ },
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends=['type', 'company'])
+ party_address = fields.Many2One('party.address', 'Contact Address',
+ domain=[('party', '=', Eval('party'))],
+ states={
+ 'invisible': Eval('type') != 'project',
+ }, depends=['party', 'type'])
+ timesheet_works = fields.One2Many(
+ 'timesheet.work', 'origin', 'Timesheet Works', readonly=True, size=1)
+ timesheet_available = fields.Function(
+ fields.Boolean('Available on timesheets'),
+ 'get_timesheet_available', setter='set_timesheet_available')
+ timesheet_start_date = fields.Function(fields.Date('Timesheet Start',
+ states={
+ 'invisible': ~Eval('timesheet_available'),
+ },
+ depends=['timesheet_available']),
+ 'get_timesheet_date', setter='set_timesheet_date')
+ timesheet_end_date = fields.Function(fields.Date('Timesheet End',
+ states={
+ 'invisible': ~Eval('timesheet_available'),
+ },
+ depends=['timesheet_available']),
+ 'get_timesheet_date', setter='set_timesheet_date')
+ timesheet_duration = fields.Function(fields.TimeDelta('Duration',
+ 'company_work_time',
+ help="Total time spent on this work and the sub-works."),
+ 'get_total')
+ effort_duration = fields.TimeDelta('Effort', 'company_work_time',
+ help="Estimated Effort for this work.")
+ total_effort = fields.Function(fields.TimeDelta('Total Effort',
+ 'company_work_time',
+ help="Estimated total effort for this work and the sub-works."),
+ 'get_total')
+ progress = fields.Float('Progress',
+ domain=['OR',
+ ('progress', '=', None),
+ [
+ ('progress', '>=', 0),
+ ('progress', '<=', 1),
+ ],
+ ],
+ help='Estimated progress for this work.')
+ total_progress = fields.Function(fields.Float('Total Progress',
+ digits=(16, 4),
+ help='Estimated total progress for this work and the sub-works.',
+ states={
+ 'invisible': (
+ Eval('total_progress', None) == None), # noqa: E711
+ }),
+ 'get_total')
+ comment = fields.Text('Comment')
+ parent = fields.Many2One('project.work', 'Parent',
+ left='left', right='right', ondelete='RESTRICT',
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ],
+ depends=['company'])
+ left = fields.Integer('Left', required=True, select=True)
+ right = fields.Integer('Right', required=True, select=True)
+ children = fields.One2Many('project.work', 'parent', 'Children',
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ],
+ depends=['company'])
+ status = fields.Many2One(
+ 'project.work.status', "Status", required=True, select=True,
+ domain=[If(Bool(Eval('type')), ('types', 'in', Eval('type')), ())],
+ depends=['type'])
+
+ @staticmethod
+ def default_type():
+ return 'task'
+
+ @classmethod
+ def default_company(cls):
+ return Transaction().context.get('company')
+
+ @classmethod
+ def default_status(cls):
+ pool = Pool()
+ WorkStatus = pool.get('project.work.status')
+ return WorkStatus.get_default_status(cls.default_type())
+
+ @classmethod
+ def default_left(cls):
+ return 0
+
+ @classmethod
+ def default_right(cls):
+ return 0
+
+ @classmethod
+ def __register__(cls, module_name):
+ TimesheetWork = Pool().get('timesheet.work')
+ transaction = Transaction()
+ cursor = transaction.connection.cursor()
+ update = transaction.connection.cursor()
+ table_project_work = cls.__table_handler__(module_name)
+ project = cls.__table__()
+ timesheet = TimesheetWork.__table__()
+
+ work_exist = table_project_work.column_exist('work')
+ add_parent = (not table_project_work.column_exist('parent')
+ and work_exist)
+ add_company = (not table_project_work.column_exist('company')
+ and work_exist)
+ add_name = (not table_project_work.column_exist('name')
+ and work_exist)
+
+ super(Work, cls).__register__(module_name)
+
+ # Migration from 3.4: change effort into timedelta effort_duration
+ if table_project_work.column_exist('effort'):
+ cursor.execute(*project.select(project.id, project.effort,
+ where=project.effort != Null))
+ for id_, effort in cursor:
+ duration = datetime.timedelta(hours=effort)
+ update.execute(*project.update(
+ [project.effort_duration],
+ [duration],
+ where=project.id == id_))
+ table_project_work.drop_column('effort')
+
+ # Migration from 3.6: add parent, company, drop required on work,
+ # fill name
+ if add_parent:
+ second_project = cls.__table__()
+ query = project.join(timesheet,
+ condition=project.work == timesheet.id
+ ).join(second_project,
+ condition=timesheet.parent == second_project.work
+ ).select(project.id, second_project.id)
+ cursor.execute(*query)
+ for id_, parent in cursor:
+ update.execute(*project.update(
+ [project.parent],
+ [parent],
+ where=project.id == id_))
+ cls._rebuild_tree('parent', None, 0)
+ if add_company:
+ cursor.execute(*project.join(timesheet,
+ condition=project.work == timesheet.id
+ ).select(project.id, timesheet.company))
+ for id_, company in cursor:
+ update.execute(*project.update(
+ [project.company],
+ [company],
+ where=project.id == id_))
+ table_project_work.not_null_action('work', action='remove')
+ if add_name:
+ cursor.execute(*project.join(timesheet,
+ condition=project.work == timesheet.id
+ ).select(project.id, timesheet.name))
+ for id_, name in cursor:
+ update.execute(*project.update(
+ [project.name],
+ [name],
+ where=project.id == id_))
+
+ # Migration from 4.0: remove work
+ if work_exist:
+ table_project_work.drop_constraint('work_uniq')
+ cursor.execute(*project.select(project.id, project.work,
+ where=project.work != Null))
+ for project_id, work_id in cursor:
+ update.execute(*timesheet.update(
+ [timesheet.origin, timesheet.name],
+ ['%s,%s' % (cls.__name__, project_id), Null],
+ where=timesheet.id == work_id))
+ table_project_work.drop_column('work')
+
+ # Migration from 5.4: replace state by status
+ table_project_work.not_null_action('state', action='remove')
+
+ @fields.depends('type', 'status')
+ def on_change_type(self):
+ pool = Pool()
+ WorkState = pool.get('project.work.status')
+ if (self.type
+ and (not self.status
+ or self.type not in self.status.types)):
+ self.status = WorkState.get_default_status(self.type)
+
+ @fields.depends('status', 'progress')
+ def on_change_status(self):
+ if (self.status
+ and self.status.progress is not None
+ and self.status.progress > (self.progress or -1.0)):
+ self.progress = self.status.progress
+
+ @classmethod
+ def index_set_field(cls, name):
+ index = super(Work, cls).index_set_field(name)
+ if name in {'timesheet_start_date', 'timesheet_end_date'}:
+ index = cls.index_set_field('timesheet_available') + 1
+ return index
+
+ @classmethod
+ def validate(cls, works):
+ super(Work, cls).validate(works)
+ for work in works:
+ work.check_work_progress()
+
+ def check_work_progress(self):
+ pool = Pool()
+ progress = -1 if self.progress is None else self.progress
+ if (self.status.progress is not None
+ and progress < self.status.progress):
+ Lang = pool.get('ir.lang')
+ lang = Lang.get()
+ raise WorkProgressValidationError(
+ gettext('project.msg_work_invalid_progress_status',
+ work=self.rec_name,
+ progress=lang.format('%.2f%%', self.status.progress * 100),
+ status=self.status.rec_name))
+ if (self.status.progress == 1.0
+ and not all(c.progress == 1.0 for c in self.children)):
+ raise WorkProgressValidationError(
+ gettext('project.msg_work_children_progress',
+ work=self.rec_name,
+ status=self.status.rec_name))
+ if (self.parent
+ and self.parent.progress == 1.0
+ and not self.progress == 1.0):
+ raise WorkProgressValidationError(
+ gettext('project.msg_work_parent_progress',
+ work=self.rec_name,
+ parent=self.parent.rec_name))
+
+ @property
+ def effort_hours(self):
+ if not self.effort_duration:
+ return 0
+ return self.effort_duration.total_seconds() / 60 / 60
+
+ @property
+ def total_effort_hours(self):
+ if not self.total_effort:
+ return 0
+ return self.total_effort.total_seconds() / 60 / 60
+
+ @property
+ def timesheet_duration_hours(self):
+ if not self.timesheet_duration:
+ return 0
+ return self.timesheet_duration.total_seconds() / 60 / 60
+
+ @classmethod
+ def default_timesheet_available(cls):
+ return False
+
+ def get_timesheet_available(self, name):
+ return bool(self.timesheet_works)
+
+ @classmethod
+ def set_timesheet_available(cls, projects, name, value):
+ pool = Pool()
+ Timesheet = pool.get('timesheet.work')
+
+ to_create = []
+ to_delete = []
+ for project in projects:
+ if not project.timesheet_works and value:
+ to_create.append({
+ 'origin': str(project),
+ 'company': project.company.id,
+ })
+ elif project.timesheet_works and not value:
+ to_delete.extend(project.timesheet_works)
+
+ if to_create:
+ Timesheet.create(to_create)
+ if to_delete:
+ Timesheet.delete(to_delete)
+
+ def get_timesheet_date(self, name):
+ if self.timesheet_works:
+ func = {
+ 'timesheet_start_date': min,
+ 'timesheet_end_date': max,
+ }[name]
+ return func(getattr(w, name) for w in self.timesheet_works)
+
+ @classmethod
+ def set_timesheet_date(cls, projects, name, value):
+ pool = Pool()
+ Timesheet = pool.get('timesheet.work')
+ timesheets = [w for p in projects for w in p.timesheet_works]
+ if timesheets:
+ Timesheet.write(timesheets, {
+ name: value,
+ })
+
+ @classmethod
+ def sum_tree(cls, works, values, parents):
+ result = values.copy()
+ works = set((w.id for w in works))
+ leafs = works - set(parents.values())
+ while leafs:
+ for work in leafs:
+ works.remove(work)
+ parent = parents.get(work)
+ if parent in result:
+ result[parent] += result[work]
+ next_leafs = set(works)
+ for work in works:
+ parent = parents.get(work)
+ if not parent:
+ continue
+ if parent in next_leafs and parent in works:
+ next_leafs.remove(parent)
+ leafs = next_leafs
+ return result
+
+ @classmethod
+ def get_total(cls, works, names):
+ cursor = Transaction().connection.cursor()
+ table = cls.__table__()
+
+ works = cls.search([
+ ('parent', 'child_of', [w.id for w in works]),
+ ])
+ work_ids = [w.id for w in works]
+ parents = {}
+ for sub_ids in grouped_slice(work_ids):
+ where = reduce_ids(table.id, sub_ids)
+ cursor.execute(*table.select(table.id, table.parent,
+ where=where))
+ parents.update(cursor)
+
+ if 'total_progress' in names and 'total_effort' not in names:
+ names = list(names)
+ names.append('total_effort')
+
+ result = {}
+ for name in names:
+ values = getattr(cls, '_get_%s' % name)(works)
+ result[name] = cls.sum_tree(works, values, parents)
+
+ if 'total_progress' in names:
+ digits = cls.total_progress.digits[1]
+ total_progress = result['total_progress']
+ total_effort = result['total_effort']
+ for work in works:
+ if total_effort[work.id]:
+ total_progress[work.id] = round(total_progress[work.id]
+ / (total_effort[work.id].total_seconds() / 60 / 60),
+ digits)
+ else:
+ total_effort[work.id] = None
+ return result
+
+ @classmethod
+ def _get_total_effort(cls, works):
+ return {w.id: w.effort_duration or datetime.timedelta() for w in works}
+
+ @classmethod
+ def _get_timesheet_duration(cls, works):
+ durations = {}
+ for work in works:
+ value = datetime.timedelta()
+ for timesheet_work in work.timesheet_works:
+ if timesheet_work.duration:
+ value += timesheet_work.duration
+ durations[work.id] = value
+ return durations
+
+ @classmethod
+ def _get_total_progress(cls, works):
+ return {w.id: w.effort_hours * (w.progress or 0) for w in works}
+
+ @classmethod
+ def copy(cls, project_works, default=None):
+ pool = Pool()
+ WorkStatus = pool.get('project.work.status')
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('children', None)
+ default.setdefault('progress', None)
+ default.setdefault(
+ 'status', lambda data: WorkStatus.get_default_status(data['type']))
+ return super().copy(project_works, default=default)
+
+ @classmethod
+ def delete(cls, project_works):
+ TimesheetWork = Pool().get('timesheet.work')
+
+ # Get the timesheet works linked to the project works
+ timesheet_works = [
+ w for pw in project_works for w in pw.timesheet_works]
+
+ super(Work, cls).delete(project_works)
+
+ if timesheet_works:
+ with Transaction().set_context(_check_access=False):
+ TimesheetWork.delete(timesheet_works)
+
+ @classmethod
+ def search_global(cls, text):
+ for record, rec_name, icon in super(Work, cls).search_global(text):
+ icon = icon or 'tryton-project'
+ yield record, rec_name, icon
diff --git a/modules/project/work.xml b/modules/project/work.xml
new file mode 100644
index 0000000000..11859bd6a0
--- /dev/null
+++ b/modules/project/work.xml
@@ -0,0 +1,276 @@
+
+
+
+
+
+ project.work.status
+ tree
+ work_status_list
+
+
+ project.work.status
+ form
+ work_status_form
+
+
+ Work Status
+ project.work.status
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ project.work
+ tree
+
+ children
+ work_tree
+
+
+ project.work
+ tree
+
+ children
+ work_tree_simple
+
+
+
+ project.work
+ tree
+
+ work_list
+
+
+ project.work
+ tree
+
+ work_list_simple
+
+
+ project.work
+ tree
+ work_list_children
+
+
+
+ project.work
+ form
+ work_form
+
+
+
+ Works Efforts
+ project.work
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Works Efforts
+ project.work
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Projects
+ project.work
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Projects
+ project.work
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tasks
+ project.work
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tasks
+ project.work
+
+
+
+
+ form_relate
+ project.work,-1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Open
+
+
+
+
+
+ Done
+
+
+
+
+
diff --git a/modules/project_invoice/.drone.yml b/modules/project_invoice/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/project_invoice/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/project_invoice/.flake8 b/modules/project_invoice/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/project_invoice/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/project_invoice/CHANGELOG b/modules/project_invoice/CHANGELOG
new file mode 100644
index 0000000000..4e9cb169c8
--- /dev/null
+++ b/modules/project_invoice/CHANGELOG
@@ -0,0 +1,74 @@
+Version 6.0.4 - 2022-08-03
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.3 - 2022-07-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.2 - 2022-01-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.1 - 2021-12-03
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+* Add date up to which to invoice timesheet
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+* Manage invoicing of non-time based products
+* Base invoicing on quantity and price
+* Remove duration fields
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+* Add invoice method to project list view
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+* Allow to invoice at once sub-projects with a different party
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+
+Version 4.0.0 - 2016-05-02
+* Bug fixes (see mercurial logs for details)
+* Add Python3 support
+
+Version 3.8.0 - 2015-11-02
+* Bug fixes (see mercurial logs for details)
+* Add progress invoice method
+
+Version 3.6.0 - 2015-04-20
+* Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+* Use TimeDelta field
+
+Version 3.4.0 - 2014-10-20
+* Bug fixes (see mercurial logs for details)
+
+Version 3.2.0 - 2014-04-21
+* Bug fixes (see mercurial logs for details)
+
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+
+Version 2.8.0 - 2013-04-22
+* Initial release
diff --git a/modules/project_invoice/COPYRIGHT b/modules/project_invoice/COPYRIGHT
new file mode 100644
index 0000000000..983ad2cd2f
--- /dev/null
+++ b/modules/project_invoice/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2013-2022 Cédric Krier.
+Copyright (C) 2013-2022 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/project_invoice/LICENSE b/modules/project_invoice/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/project_invoice/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/project_invoice/MANIFEST.in b/modules/project_invoice/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/project_invoice/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/project_invoice/README.rst b/modules/project_invoice/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/project_invoice/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/project_invoice/__init__.py b/modules/project_invoice/__init__.py
new file mode 100644
index 0000000000..2f983f3dfb
--- /dev/null
+++ b/modules/project_invoice/__init__.py
@@ -0,0 +1,19 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import project
+from . import timesheet
+from . import invoice
+
+
+def register():
+ Pool.register(
+ project.Work,
+ project.WorkInvoicedProgress,
+ timesheet.Line,
+ invoice.InvoiceLine,
+ module='project_invoice', type_='model')
+ Pool.register(
+ project.OpenInvoice,
+ module='project_invoice', type_='wizard')
diff --git a/modules/project_invoice/doc/index.rst b/modules/project_invoice/doc/index.rst
new file mode 100644
index 0000000000..fab0aed170
--- /dev/null
+++ b/modules/project_invoice/doc/index.rst
@@ -0,0 +1,13 @@
+Project Invoice Module
+######################
+
+The Project Invoice module adds invoice methods on project.
+The methods are:
+
+- Manual: Tryton doesn't create any invoice.
+- On Effort: The invoices are created based on the *Effort* hours for all
+ children works with 100% progress.
+- On Progress: The invoices are create proportionally to the *Progress* of the
+ *Effort* hours of each children work.
+- On Timesheet: The invoices are created based on the timesheets encoded on all
+ children works.
diff --git a/modules/project_invoice/exceptions.py b/modules/project_invoice/exceptions.py
new file mode 100644
index 0000000000..c281451a60
--- /dev/null
+++ b/modules/project_invoice/exceptions.py
@@ -0,0 +1,7 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.exceptions import UserError
+
+
+class InvoicingError(UserError):
+ pass
diff --git a/modules/project_invoice/invoice.py b/modules/project_invoice/invoice.py
new file mode 100644
index 0000000000..865c5fde70
--- /dev/null
+++ b/modules/project_invoice/invoice.py
@@ -0,0 +1,26 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import PoolMeta, Pool
+from trytond.transaction import Transaction
+from trytond.tools import grouped_slice
+
+
+class InvoiceLine(metaclass=PoolMeta):
+ __name__ = 'account.invoice.line'
+
+ @classmethod
+ def delete(cls, lines):
+ pool = Pool()
+ WorkInvoicedProgress = pool.get('project.work.invoiced_progress')
+
+ # Delete progress using root to skip access rule
+ progress = []
+ for sub_ids in grouped_slice([l.id for l in lines]):
+ progress += WorkInvoicedProgress.search([
+ ('invoice_line', 'in', sub_ids),
+ ])
+ if progress:
+ with Transaction().set_user(0):
+ WorkInvoicedProgress.delete(progress)
+
+ super(InvoiceLine, cls).delete(lines)
diff --git a/modules/project_invoice/locale/bg.po b/modules/project_invoice/locale/bg.po
new file mode 100644
index 0000000000..dae0d092ff
--- /dev/null
+++ b/modules/project_invoice/locale/bg.po
@@ -0,0 +1,138 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Project Invoice"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Ред от фактура"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Начин на фактуриране"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Начин на фактуриране"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Ред от фактура"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Задача"
+
+#, fuzzy
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Ред от фактура"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Редове от график"
+
+#, fuzzy
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Фактури"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Project Invoice"
+
+#, fuzzy
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Ръчно"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/ca.po b/modules/project_invoice/locale/ca.po
new file mode 100644
index 0000000000..59cd588588
--- /dev/null
+++ b/modules/project_invoice/locale/ca.po
@@ -0,0 +1,132 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Import a facturar"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línia de factura"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Mètode de facturació"
+
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Factura fins el"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Import facturat"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "Progrés facturat"
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Mètode de facturació"
+
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Factura fins el"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "Quantitat a facturar"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línia de factura"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "Progrés"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Treball"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línia de factura"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+"Limita les línies del full de treball a facturar a les anteriors a aquesta "
+"data."
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Línies del full de treball"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr "No podeu eliminar una línia facturada."
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+"Per facturar el treball \"%(work)s\" heu de configurar un compte d'ingressos"
+" per defecte."
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr "No hi ha cap preu de venda al treball \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr "No hi ha cap tercer al treball \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr "No podeu modificar una línia facturada."
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Per facturar el treball \"%(work)s\" heu de definir un compte d'ingressos "
+"pel producte \"%(product)s\"."
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progrés de treballs facturats"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Facturació de projectes"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr "Per l'esforç estimat"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "Segons el progrés"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr "Per les hores realitzades"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr "%"
diff --git a/modules/project_invoice/locale/cs.po b/modules/project_invoice/locale/cs.po
new file mode 100644
index 0000000000..c8f38ecec3
--- /dev/null
+++ b/modules/project_invoice/locale/cs.po
@@ -0,0 +1,130 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Project Invoice"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+#, fuzzy
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Project Invoice"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/de.po b/modules/project_invoice/locale/de.po
new file mode 100644
index 0000000000..b018d19282
--- /dev/null
+++ b/modules/project_invoice/locale/de.po
@@ -0,0 +1,132 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Fakturierbarer Betrag"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Rechnungsposition"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Methode Rechnungsstellung"
+
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Abrechnen bis"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Abgerechneter Betrag"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "Fakturierter Forstschritt"
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Methode Rechnungsstellung"
+
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Abrechnen bis"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "Fakturierbare Menge"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Rechnungsposition"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "Fortschritt"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Tätigkeit"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Rechnungsposition"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+"Es werden nur Zeiterfassungspositionen vor dem angegebenen Datum "
+"abgerechnet."
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Zeiterfassungspositionen"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Rechnungen"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr "Festgeschriebene Rechnungspositionen können nicht gelöscht werden."
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+"Damit Projekt \"%(work)s\" fakturiert werden kann, muss ein "
+"Standardertragskonto konfiguriert werden."
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr "Fehlender Listenpreis für Aufgabe \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr "Fehlende Partei für Aufgabe \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr "Eine festgeschriebene Rechnungsposition kann nicht geändert werden."
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Damit Projekt \"%(work)s\" fakturiert werden kann, muss ein Ertragskonto für"
+" Artikel \"%(product)s\" konfiguriert werden."
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Rechnung erstellen"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Nach Forstschritt fakturierte Aufgabe"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Projekt Fakturierung"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Manuell"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr "Nach veranschlagtem Aufwand"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "Nach Fortschritt"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr "Nach erfasstem Aufwand"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr "%"
diff --git a/modules/project_invoice/locale/es.po b/modules/project_invoice/locale/es.po
new file mode 100644
index 0000000000..2f3580e1cb
--- /dev/null
+++ b/modules/project_invoice/locale/es.po
@@ -0,0 +1,132 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Importe a facturar"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Factura hasta"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Importe facturado"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "Progreso facturado"
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Factura hasta el"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "Cantidad a facturar"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "Progreso"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Trabajo"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+"Limita las líneas de la hoja de trabajo a facturar a las anteriores a esa "
+"fecha."
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Líneas del parte de trabajo"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr "No puede eliminar una línea facturada."
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+"Para facturar el trabajo \"%(works)\" debéis configurar una cuenta de "
+"ingressos por defecto."
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr "No hay ningún precio en el trabajo \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr "No hay ningún tercero en el trabajo \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr "No puede modificar una línea facturada."
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Para facturar el trabajo \"%(work)s\" debeis definir una cuenta de ingressos"
+" para el producto \"%(product)s\"."
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progreso de trabajos facturados"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Facturación de proyectos"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr "Por el esfuerzo estimado"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "Según el progreso"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr "Por las horas realizadas"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr "%"
diff --git a/modules/project_invoice/locale/es_419.po b/modules/project_invoice/locale/es_419.po
new file mode 100644
index 0000000000..a53b11cea6
--- /dev/null
+++ b/modules/project_invoice/locale/es_419.po
@@ -0,0 +1,132 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Duración a facturar"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Duración facturada"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "Progreso facturado de trabajo"
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Duración facturada"
+
+#, fuzzy
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "Duración a facturar"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "Progreso facturado de trabajo"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progreso facturado de trabajo"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/et.po b/modules/project_invoice/locale/et.po
new file mode 100644
index 0000000000..a7e8591948
--- /dev/null
+++ b/modules/project_invoice/locale/et.po
@@ -0,0 +1,133 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Ajakulu arvele"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Arve rida"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Arve meetod"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Arve meetod"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Arveldatav summa"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "Arveldatud progress"
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Arve meetod"
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Arve meetod"
+
+#, fuzzy
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "Ajakulu arvele"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Arve rida"
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "Progressiga"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Töö"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Arve rida"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Töögraafiku read"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Arved"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr "Ei saa kustutada arveldatud rida."
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr "Tööle \"%(work)s\" ei ole määratud hinda."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr "Tööle \"%(work)s\" ei ole määratud hinda."
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr "Ei saa muuta arveldatud rida."
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Arve"
+
+#, fuzzy
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Arveldatud progress"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Projekti arve"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Käsitsi"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr "Püüdlusega"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "Progressiga"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr "Töögraafikus"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/fa.po b/modules/project_invoice/locale/fa.po
new file mode 100644
index 0000000000..cf0376f232
--- /dev/null
+++ b/modules/project_invoice/locale/fa.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "مدت زمان صورتحساب"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "خط صورتحساب"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "سبک صورتحساب"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "سبک صورتحساب"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "مبلغ صورتحساب"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "پیشرفت های فاکتورشده"
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "روش صورتحساب"
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "سبک صورتحساب"
+
+#, fuzzy
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "مدت زمان صورتحساب"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "خط صورتحساب"
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "در حال پیش رفت"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "کار"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "خط صورتحساب"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "خطوط جدول زمانی"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "صورتحساب ها"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr "شما نمی توانید سطر صورتحساب را حذف کنید."
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr "در کار : \"%s\" هیچ لیست قیمتی وجود ندارد."
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr "در کار : \"%s\" هیچ نهاد/سازمانی وجود ندارد."
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr "شما نمی توانید خط صورتحساب را تغییردهید."
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "پیشرفت های کار فاکتورشده"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "صورتحساب پروژه"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "دستی"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr "در حال تلاش"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "در حال پیش رفت"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr "در جدول زمانی"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/fi.po b/modules/project_invoice/locale/fi.po
new file mode 100644
index 0000000000..c8f38ecec3
--- /dev/null
+++ b/modules/project_invoice/locale/fi.po
@@ -0,0 +1,130 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Project Invoice"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+#, fuzzy
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Project Invoice"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/fr.po b/modules/project_invoice/locale/fr.po
new file mode 100644
index 0000000000..3b43b7ade6
--- /dev/null
+++ b/modules/project_invoice/locale/fr.po
@@ -0,0 +1,132 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Montant à facturer"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Ligne de facture"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Méthode de facturation"
+
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Facturer jusqu'à"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Montant facturé"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "Progression facturée"
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Méthode de facturation"
+
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Facturer jusqu'à"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "Quantité à facturer"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Ligne de facture"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "Progression"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Travail"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Ligne de facture"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+"Limite les lignes de feuille de temps facturées à celles antérieures à la "
+"date."
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Lignes de feuille de présence"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr "Vous ne pouvez pas supprimer une ligne facturée."
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+"Pour facturer le travail « %(work)s », vous devez configurer un compte de "
+"revenu par défaut."
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr "Il n'y a pas de prix listé sur le travail « %(work)s »."
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr "Il n'y a pas de tiers sur le travail « %(work)s »."
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr "Vous ne pouvez pas modifier une ligne facturée."
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Pour facturer le travail « %(work)s », vous devez définir un compte de "
+"revenu pour le produit « %(product)s »."
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Facturer"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progression facturée de travail"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Facture projet"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr "Sur l'effort"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "Sur progrès"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr "Sur feuille de présence"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr "%"
diff --git a/modules/project_invoice/locale/hu.po b/modules/project_invoice/locale/hu.po
new file mode 100644
index 0000000000..09947b123d
--- /dev/null
+++ b/modules/project_invoice/locale/hu.po
@@ -0,0 +1,132 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Project Invoice"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Tevékenység"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Időpozíció"
+
+#, fuzzy
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Project Invoice"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/id.po b/modules/project_invoice/locale/id.po
new file mode 100644
index 0000000000..23d1372b0e
--- /dev/null
+++ b/modules/project_invoice/locale/id.po
@@ -0,0 +1,128 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr ""
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Baris Faktur"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Metode Faktur"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Metode Faktur"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Metode Faktur"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Baris Faktur"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Kerja"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Baris Faktur"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Faktur-faktur"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Faktur"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr "%"
diff --git a/modules/project_invoice/locale/it.po b/modules/project_invoice/locale/it.po
new file mode 100644
index 0000000000..29ddb71ba4
--- /dev/null
+++ b/modules/project_invoice/locale/it.po
@@ -0,0 +1,133 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Importo da fatturare"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Riga fattura"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Metodo di fatturazione"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Metodo di fatturazione"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Importo fatturato"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Metodo di fatturazione"
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Metodo di fatturazione"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "Quantità da fatturare"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Riga fattura"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "Progresso"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Lavoro"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Riga fattura"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Fatture"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr "Non è possibile eliminare una riga fatturata."
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+"Per fatturare il lavoro \"%(work)s\" è necessario configurare un conto delle"
+" entrate di default."
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr "Non esiste un prezzo di listino sul lavoro \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr "manca la controparte sul lavoro \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr "Non è possibile modificare una riga fatturata."
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Per fatturare il lavoro \"%(work)s\" è necessario definire un conto delle "
+"entrate per il prodotto \"%(product)s\"."
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Fattura"
+
+#, fuzzy
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progressi fatturati dal lavoro"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Fattura progetto"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Manuale"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "In corso"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr "%"
diff --git a/modules/project_invoice/locale/lo.po b/modules/project_invoice/locale/lo.po
new file mode 100644
index 0000000000..cb750b4c5e
--- /dev/null
+++ b/modules/project_invoice/locale/lo.po
@@ -0,0 +1,136 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Project Invoice"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "ລາຍການ"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "ລາຍການ"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "ເຮັດວຽກ"
+
+#, fuzzy
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "ລາຍການ"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "ແຖວຕາຕະລາງເຮັດວຽກ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "ໃບເກັບເງິນ"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Project Invoice"
+
+#, fuzzy
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "ໃສ່ເອົາເອງ"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/lt.po b/modules/project_invoice/locale/lt.po
new file mode 100644
index 0000000000..9f6d070b83
--- /dev/null
+++ b/modules/project_invoice/locale/lt.po
@@ -0,0 +1,129 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Projekto sąskaita faktūra"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Sąskaitos faktūros eilutė"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Sąskaita faktūra išrašoma"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Sąskaita faktūra išrašoma"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Sąskaitos faktūros suma"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Sąskaita faktūra išrašoma"
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Sąskaita faktūra išrašoma"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Sąskaitos faktūros eilutė"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Sąskaitos faktūros eilutė"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Sąskaitos faktūros"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Sąskaita faktūra"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Projekto sąskaita faktūra"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/nl.po b/modules/project_invoice/locale/nl.po
new file mode 100644
index 0000000000..65496ccfef
--- /dev/null
+++ b/modules/project_invoice/locale/nl.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Factureer baar bedrag"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Factuurregel"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Factuurmethode"
+
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Factureer tot"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Gefactureerd bedrag"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "Gefactureerde voortgang"
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Factuurmethode"
+
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Factureer tot"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "Factureerbare hoeveelheid"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Factuurregel"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "Vooruitgang"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Werk"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Factuurregel"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+"Beperkt urenstaatregels die gefactureerd worden tot a die voor deze datum."
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Tijdregistratieregels"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Verkoopfacturen"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr "U kunt een factuurregel niet verwijderen."
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+"Om werk \"%(work)s\" te factureren, moet u een standaard omzetaccount "
+"configureren."
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr "Er is geen catalogusprijs op werk \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr "Er is geen relatie op werk \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr "U kunt een factuurregel niet wijzigen."
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Om werk \"%(work)s\" te factureren, moet u een omzet account definiëren voor"
+" het product \"%(product)s\"."
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Factuur"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Werk gefactureerde voortgang"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Projectfactuur"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Handmatig"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr "Naar inspanning (in regie?)"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "Naar voortgang"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr "Op urenstaat"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr "%"
diff --git a/modules/project_invoice/locale/pl.po b/modules/project_invoice/locale/pl.po
new file mode 100644
index 0000000000..354f415a9e
--- /dev/null
+++ b/modules/project_invoice/locale/pl.po
@@ -0,0 +1,130 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Project Invoice"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Wiersz faktury"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Wiersz faktury"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Praca"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Wiersz faktury"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+#, fuzzy
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Project Invoice"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/pt.po b/modules/project_invoice/locale/pt.po
new file mode 100644
index 0000000000..ffbe2a845d
--- /dev/null
+++ b/modules/project_invoice/locale/pt.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Tempo a Faturar"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Linha da Fatura"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Método de Fatura"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Método de Fatura"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Montante de Fatura"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "Progresso Faturado"
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Método de Faturamento"
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Método de Fatura"
+
+#, fuzzy
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "Tempo a Faturar"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Linha de Fatura"
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "Em Progesso"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Tarefa"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Linha de Fatura"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Linhas da Folha de Ponto"
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Faturas"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr "Você não pode apagar uma linha já faturada."
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr "Não há preço para a tarefa \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr "Não há pessoa na tarefa \"%(work)s\"."
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr "Você não pode modificar uma linha já faturada."
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Progresso Faturado de Tarefas"
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Fatura do Projeto"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr "Por Esforço"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "Sobre o Progresso"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr "Na Folha de Ponto"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/ro.po b/modules/project_invoice/locale/ro.po
new file mode 100644
index 0000000000..da543dc6b3
--- /dev/null
+++ b/modules/project_invoice/locale/ro.po
@@ -0,0 +1,126 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr ""
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr ""
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr ""
+
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/ru.po b/modules/project_invoice/locale/ru.po
new file mode 100644
index 0000000000..aff4501fca
--- /dev/null
+++ b/modules/project_invoice/locale/ru.po
@@ -0,0 +1,138 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Project Invoice"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Строка инвойса"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Метод инвойса"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Метод инвойса"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Метод инвойса"
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Метод инвойса"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Строка инвойса"
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Работа"
+
+#, fuzzy
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Строка инвойса"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Строки табеля"
+
+#, fuzzy
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Инвойсы"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Project Invoice"
+
+#, fuzzy
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Ручной"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/sl.po b/modules/project_invoice/locale/sl.po
new file mode 100644
index 0000000000..a940a54b2a
--- /dev/null
+++ b/modules/project_invoice/locale/sl.po
@@ -0,0 +1,138 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Čas do zaračunanja"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr "Postavka računa"
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr "Način obračuna"
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Način obračuna"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr "Zaračunan znesek"
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr "Zaračunano opravljeno delo"
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr "Način obračuna"
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Način obračuna"
+
+#, fuzzy
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr "Čas do zaračunanja"
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr "Postavka računa"
+
+#, fuzzy
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr "Po napredku"
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr "Naloga"
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr "Postavka računa"
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+#, fuzzy
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr "Obračunane postavke ni možne brisati."
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr "Pri nalogi \"%s\" ni cenika."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr "Pri nalogi \"%s\" ni partnerja."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr "Obračunane postavke ni možne popraviti."
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr "Zaračunano opravljeno delo"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Project Invoice"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr "Ročno"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr "Po oceni dela"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr "Po napredku"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr "Po dejanskem delu"
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/tr.po b/modules/project_invoice/locale/tr.po
new file mode 100644
index 0000000000..c8f38ecec3
--- /dev/null
+++ b/modules/project_invoice/locale/tr.po
@@ -0,0 +1,130 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Project Invoice"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+#, fuzzy
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Project Invoice"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/locale/zh_CN.po b/modules/project_invoice/locale/zh_CN.po
new file mode 100644
index 0000000000..c8f38ecec3
--- /dev/null
+++ b/modules/project_invoice/locale/zh_CN.po
@@ -0,0 +1,130 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,amount_to_invoice:"
+msgid "Amount to Invoice"
+msgstr "Project Invoice"
+
+msgctxt "field:project.work,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,invoiced_amount:"
+msgid "Invoiced Amount"
+msgstr ""
+
+msgctxt "field:project.work,invoiced_progress:"
+msgid "Invoiced Progress"
+msgstr ""
+
+msgctxt "field:project.work,project_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,project_invoice_timesheet_up_to:"
+msgid "Invoice up to"
+msgstr "Invoice"
+
+msgctxt "field:project.work,quantity_to_invoice:"
+msgid "Quantity to Invoice"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,progress:"
+msgid "Progress"
+msgstr ""
+
+msgctxt "field:project.work.invoiced_progress,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:timesheet.line,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "help:project.work,project_invoice_timesheet_up_to:"
+msgid ""
+"Limits which timesheet lines get invoiced to only those before the date."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_timesheet_line_form_invoice"
+msgid "Timesheet Lines"
+msgstr "Timesheet Lines"
+
+#, fuzzy
+msgctxt "model:ir.action,name:open_invoice"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "model:ir.message,text:msg_delete_invoiced_line"
+msgid "You cannot delete an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_account_revenue"
+msgid "To invoice work \"%(work)s\" you must configure a default account revenue."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_list_price"
+msgid "There is no list price on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_missing_party"
+msgid "There is no party on work \"%(work)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_modify_invoiced_line"
+msgid "You cannot modify an invoiced line."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_missing_account_revenue"
+msgid ""
+"To invoice work \"%(work)s\" you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:work_invoice_button"
+msgid "Invoice"
+msgstr "Invoice"
+
+msgctxt "model:project.work.invoiced_progress,name:"
+msgid "Work Invoiced Progress"
+msgstr ""
+
+msgctxt "model:res.group,name:group_project_invoice"
+msgid "Project Invoice"
+msgstr "Project Invoice"
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Effort"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Progress"
+msgstr ""
+
+msgctxt "selection:project.work,project_invoice_method:"
+msgid "On Timesheet"
+msgstr ""
+
+msgctxt "view:project.work.invoiced_progress:"
+msgid "%"
+msgstr ""
diff --git a/modules/project_invoice/message.xml b/modules/project_invoice/message.xml
new file mode 100644
index 0000000000..211012405d
--- /dev/null
+++ b/modules/project_invoice/message.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ You cannot modify an invoiced line.
+
+
+ You cannot delete an invoiced line.
+
+
+ To invoice work "%(work)s" you must define an account revenue for product "%(product)s".
+
+
+ To invoice work "%(work)s" you must configure a default account revenue.
+
+
+ There is no list price on work "%(work)s".
+
+
+ There is no party on work "%(work)s".
+
+
+
diff --git a/modules/project_invoice/project.py b/modules/project_invoice/project.py
new file mode 100644
index 0000000000..04b562cbc2
--- /dev/null
+++ b/modules/project_invoice/project.py
@@ -0,0 +1,728 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+
+from itertools import groupby
+from collections import defaultdict
+from decimal import Decimal
+import datetime
+
+from sql import Null
+from sql.aggregate import Sum
+from sql.functions import Extract
+from sql.operators import Concat
+from sql.conditionals import NullIf
+
+from trytond.i18n import gettext
+from trytond.model import ModelSQL, ModelView, fields
+from trytond.pool import PoolMeta
+from trytond.pyson import Eval, Bool, If, Id, PYSONEncoder
+from trytond.pool import Pool
+from trytond.transaction import Transaction
+from trytond.wizard import Wizard, StateAction
+from trytond.tools import reduce_ids, grouped_slice
+
+from .exceptions import InvoicingError
+
+
+class Effort:
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.project_invoice_method.selection.append(
+ ('effort', "On Effort"))
+
+ @classmethod
+ def _get_quantity_to_invoice_effort(cls, works):
+ quantities = {}
+ for work in works:
+ if (work.progress == 1
+ and work.list_price
+ and not work.invoice_line):
+ if work.price_list_hour:
+ quantity = work.effort_hours
+ else:
+ quantity = 1
+ if work.unit_to_invoice:
+ quantity = work.unit_to_invoice.round(quantity)
+ quantities[work.id] = quantity
+ return quantities
+
+ @classmethod
+ def _get_invoiced_amount_effort(cls, works):
+ pool = Pool()
+ InvoiceLine = pool.get('account.invoice.line')
+ Currency = pool.get('currency.currency')
+
+ invoice_lines = InvoiceLine.browse([
+ w.invoice_line.id for w in works
+ if w.invoice_line])
+
+ id2invoice_lines = dict((l.id, l) for l in invoice_lines)
+ amounts = {}
+ for work in works:
+ currency = work.company.currency
+ if work.invoice_line:
+ invoice_line = id2invoice_lines[work.invoice_line.id]
+ invoice_currency = (invoice_line.invoice.currency
+ if invoice_line.invoice else invoice_line.currency)
+ if work.price_list_hour:
+ amount = (
+ Decimal(str(work.effort_hours))
+ * invoice_line.unit_price)
+ else:
+ amount = invoice_line.unit_price
+ amounts[work.id] = Currency.compute(
+ invoice_currency, amount, currency)
+ else:
+ amounts[work.id] = Decimal(0)
+ return amounts
+
+ def get_origins_to_invoice(self):
+ try:
+ origins = super().get_origins_to_invoice()
+ except AttributeError:
+ origins = []
+ if self.invoice_method == 'effort':
+ origins.append(self)
+ return origins
+
+
+class Progress:
+
+ invoiced_progress = fields.One2Many('project.work.invoiced_progress',
+ 'work', 'Invoiced Progress', readonly=True)
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.project_invoice_method.selection.append(
+ ('progress', 'On Progress'))
+
+ @classmethod
+ def _get_quantity_to_invoice_progress(cls, works):
+ pool = Pool()
+ Progress = pool.get('project.work.invoiced_progress')
+
+ cursor = Transaction().connection.cursor()
+ table = cls.__table__()
+ progress = Progress.__table__()
+
+ invoiced_progress = {}
+ quantities = {}
+ for sub_works in grouped_slice(works):
+ sub_works = list(sub_works)
+ where = reduce_ids(
+ table.id, [x.id for x in sub_works if x.list_price])
+ cursor.execute(*table.join(progress,
+ condition=progress.work == table.id
+ ).select(table.id, Sum(progress.progress),
+ where=where,
+ group_by=table.id))
+ invoiced_progress.update(dict(cursor))
+
+ for work in sub_works:
+ delta = (
+ (work.progress or 0)
+ - invoiced_progress.get(work.id, 0.0))
+ if work.list_price and delta > 0:
+ quantity = delta
+ if work.price_list_hour:
+ quantity *= work.effort_hours
+ if work.unit_to_invoice:
+ quantity = work.unit_to_invoice.round(quantity)
+ quantities[work.id] = quantity
+ return quantities
+
+ @property
+ def progress_to_invoice(self):
+ if self.quantity_to_invoice:
+ if self.price_list_hour:
+ return self.quantity_to_invoice / self.effort_hours
+ else:
+ return self.quantity_to_invoice
+
+ @classmethod
+ def _get_invoiced_amount_progress(cls, works):
+ pool = Pool()
+ Progress = pool.get('project.work.invoiced_progress')
+ InvoiceLine = pool.get('account.invoice.line')
+ Company = pool.get('company.company')
+ Currency = pool.get('currency.currency')
+
+ cursor = Transaction().connection.cursor()
+ table = cls.__table__()
+ progress = Progress.__table__()
+ invoice_line = InvoiceLine.__table__()
+ company = Company.__table__()
+
+ amounts = defaultdict(Decimal)
+ work2currency = {}
+ ids2work = dict((w.id, w) for w in works)
+ for sub_ids in grouped_slice(ids2work.keys()):
+ where = reduce_ids(table.id, sub_ids)
+ cursor.execute(*table.join(progress,
+ condition=progress.work == table.id
+ ).join(invoice_line,
+ condition=progress.invoice_line == invoice_line.id
+ ).select(table.id,
+ Sum(progress.progress * invoice_line.unit_price),
+ where=where,
+ group_by=table.id))
+ for work_id, amount in cursor:
+ if not isinstance(amount, Decimal):
+ amount = Decimal(str(amount))
+ work = ids2work[work_id]
+ if work.price_list_hour:
+ amount *= Decimal(str(work.effort_hours))
+ amounts[work_id] = amount
+
+ cursor.execute(*table.join(company,
+ condition=table.company == company.id
+ ).select(table.id, company.currency,
+ where=where))
+ work2currency.update(cursor)
+
+ currencies = Currency.browse(set(work2currency.values()))
+ id2currency = {c.id: c for c in currencies}
+
+ for work in works:
+ currency = id2currency[work2currency[work.id]]
+ amounts[work.id] = currency.round(Decimal(amounts[work.id]))
+ return amounts
+
+ def get_origins_to_invoice(self):
+ pool = Pool()
+ InvoicedProgress = pool.get('project.work.invoiced_progress')
+ try:
+ origins = super().get_origins_to_invoice()
+ except AttributeError:
+ origins = []
+ if self.invoice_method == 'progress':
+ invoiced_progress = InvoicedProgress(
+ work=self, progress=self.progress_to_invoice)
+ origins.append(invoiced_progress)
+ return origins
+
+ @classmethod
+ def copy(cls, records, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('invoiced_progress', None)
+ return super().copy(records, default=default)
+
+
+class Timesheet:
+
+ project_invoice_timesheet_up_to = fields.Date(
+ "Invoice up to",
+ states={
+ 'invisible': Eval('project_invoice_method') != 'timesheet',
+ },
+ depends=['project_invoice_method'],
+ help="Limits which timesheet lines get invoiced to "
+ "only those before the date.")
+ invoice_timesheet_up_to = fields.Function(fields.Date(
+ "Invoice up to"), 'on_change_with_invoice_timesheet_up_to')
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.project_invoice_method.selection.append(
+ ('timesheet', 'On Timesheet'))
+ cls.product.domain = [
+ cls.product.domain,
+ If(Eval('invoice_method') == 'timesheet',
+ ('default_uom_category', '=', Id('product', 'uom_cat_time')),
+ ()),
+ ]
+ if 'invoice_method' not in cls.product.depends:
+ cls.product.depends.append('invoice_method')
+
+ @fields.depends('type', 'project_invoice_timesheet_up_to',
+ 'parent', '_parent_parent.invoice_timesheet_up_to')
+ def on_change_with_invoice_timesheet_up_to(self, name=None):
+ if self.type == 'project':
+ return self.project_invoice_timesheet_up_to
+ elif self.parent:
+ return self.parent.invoice_timesheet_up_to
+
+ @classmethod
+ def _get_quantity_to_invoice_timesheet(cls, works):
+ pool = Pool()
+ TimesheetLine = pool.get('timesheet.line')
+ cursor = Transaction().connection.cursor()
+ line = TimesheetLine.__table__()
+
+ upto2tworks = defaultdict(list)
+ twork2work = {}
+ for work in works:
+ upto = work.invoice_timesheet_up_to
+ for timesheet_work in work.timesheet_works:
+ twork2work[timesheet_work.id] = work.id
+ upto2tworks[upto].append(timesheet_work.id)
+
+ durations = defaultdict(datetime.timedelta)
+ query = line.select(
+ line.work, Sum(line.duration),
+ group_by=line.work)
+ for upto, tworks in upto2tworks.items():
+ for sub_ids in grouped_slice(tworks):
+ query.where = (reduce_ids(line.work, sub_ids)
+ & (line.invoice_line == Null))
+ if upto:
+ query.where &= (line.date <= upto)
+ cursor.execute(*query)
+
+ for twork_id, duration in cursor:
+ if duration:
+ # SQLite uses float for SUM
+ if not isinstance(duration, datetime.timedelta):
+ duration = datetime.timedelta(seconds=duration)
+ durations[twork2work[twork_id]] += duration
+
+ quantities = {}
+ for work in works:
+ duration = durations[work.id]
+ if work.list_price:
+ hours = duration.total_seconds() / 60 / 60
+ if work.unit_to_invoice:
+ hours = work.unit_to_invoice.round(hours)
+ quantities[work.id] = hours
+ return quantities
+
+ @classmethod
+ def _get_invoiced_amount_timesheet(cls, works):
+ pool = Pool()
+ TimesheetWork = pool.get('timesheet.work')
+ TimesheetLine = pool.get('timesheet.line')
+ InvoiceLine = pool.get('account.invoice.line')
+ Company = pool.get('company.company')
+ Currency = pool.get('currency.currency')
+
+ cursor = Transaction().connection.cursor()
+ table = cls.__table__()
+ timesheet_work = TimesheetWork.__table__()
+ timesheet_line = TimesheetLine.__table__()
+ invoice_line = InvoiceLine.__table__()
+ company = Company.__table__()
+
+ amounts = {}
+ work2currency = {}
+ work_ids = [w.id for w in works]
+ for sub_ids in grouped_slice(work_ids):
+ where = reduce_ids(table.id, sub_ids)
+ cursor.execute(*table.join(timesheet_work,
+ condition=(
+ Concat(cls.__name__ + ',', table.id)
+ == timesheet_work.origin)
+ ).join(timesheet_line,
+ condition=timesheet_line.work == timesheet_work.id
+ ).join(invoice_line,
+ condition=timesheet_line.invoice_line == invoice_line.id
+ ).select(table.id,
+ Sum(timesheet_line.duration * invoice_line.unit_price),
+ where=where,
+ group_by=table.id))
+ amounts.update(cursor)
+
+ cursor.execute(*table.join(company,
+ condition=table.company == company.id
+ ).select(table.id, company.currency,
+ where=where))
+ work2currency.update(cursor)
+
+ currencies = Currency.browse(set(work2currency.values()))
+ id2currency = {c.id: c for c in currencies}
+
+ for work in works:
+ currency = id2currency[work2currency[work.id]]
+ amount = amounts.get(work.id, 0)
+ if isinstance(amount, datetime.timedelta):
+ amount = amount.total_seconds()
+ amount = amount / 60 / 60
+ amounts[work.id] = currency.round(Decimal(str(amount)))
+ return amounts
+
+ def get_origins_to_invoice(self):
+ try:
+ origins = super().get_origins_to_invoice()
+ except AttributeError:
+ origins = []
+ if self.invoice_method == 'timesheet':
+ up_to = self.invoice_timesheet_up_to or datetime.date.max
+ origins.extend(
+ l for tw in self.timesheet_works
+ for l in tw.timesheet_lines
+ if not l.invoice_line and l.date <= up_to)
+ return origins
+
+
+class Work(Effort, Progress, Timesheet, metaclass=PoolMeta):
+ __name__ = 'project.work'
+ project_invoice_method = fields.Selection([
+ ('manual', "Manual"),
+ ], "Invoice Method",
+ states={
+ 'readonly': Bool(Eval('invoiced_amount')),
+ 'required': Eval('type') == 'project',
+ 'invisible': Eval('type') != 'project',
+ },
+ depends=['invoiced_amount', 'type'])
+ invoice_method = fields.Function(fields.Selection(
+ 'get_invoice_methods', "Invoice Method"),
+ 'on_change_with_invoice_method')
+ quantity_to_invoice = fields.Function(
+ fields.Float("Quantity to Invoice"), '_get_invoice_values')
+ amount_to_invoice = fields.Function(fields.Numeric("Amount to Invoice",
+ digits=(16, Eval('currency_digits', 2)),
+ states={
+ 'invisible': Eval('invoice_method') == 'manual',
+ },
+ depends=['currency_digits', 'invoice_method']),
+ 'get_total')
+ invoiced_amount = fields.Function(fields.Numeric('Invoiced Amount',
+ digits=(16, Eval('currency_digits', 2)),
+ states={
+ 'invisible': Eval('invoice_method') == 'manual',
+ },
+ depends=['currency_digits', 'invoice_method']),
+ 'get_total')
+ invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
+ readonly=True)
+
+ @classmethod
+ def __setup__(cls):
+ super(Work, cls).__setup__()
+ cls._buttons.update({
+ 'invoice': {
+ 'invisible': ((Eval('type') != 'project')
+ | (Eval('project_invoice_method', 'manual')
+ == 'manual')),
+ 'readonly': ~Eval('amount_to_invoice'),
+ 'depends': [
+ 'type', 'project_invoice_method', 'amount_to_invoice'],
+ },
+ })
+
+ @staticmethod
+ def default_project_invoice_method():
+ return 'manual'
+
+ @classmethod
+ def copy(cls, records, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('invoice_line', None)
+ return super(Work, cls).copy(records, default=default)
+
+ @classmethod
+ def get_invoice_methods(cls):
+ field = 'project_invoice_method'
+ return cls.fields_get(field)[field]['selection']
+
+ @fields.depends('type', 'project_invoice_method',
+ 'parent', '_parent_parent.invoice_method')
+ def on_change_with_invoice_method(self, name=None):
+ if self.type == 'project':
+ return self.project_invoice_method
+ elif self.parent:
+ return self.parent.invoice_method
+ else:
+ return 'manual'
+
+ @classmethod
+ def default_quantity_to_invoice(cls):
+ return 0
+
+ @classmethod
+ def _get_quantity_to_invoice_manual(cls, works):
+ return {}
+
+ @classmethod
+ def _get_amount_to_invoice(cls, works):
+ amounts = {}
+ for work in works:
+ amounts[work.id] = work.company.currency.round(
+ (work.invoice_unit_price or 0)
+ * Decimal(str(work.quantity_to_invoice)))
+ return amounts
+
+ @classmethod
+ def default_invoiced_amount(cls):
+ return Decimal(0)
+
+ @classmethod
+ def _get_invoiced_amount_manual(cls, works):
+ return {}
+
+ @classmethod
+ def _get_invoice_values(cls, works, name):
+ default = getattr(cls, 'default_%s' % name)
+ amounts = dict.fromkeys((w.id for w in works), default())
+ method2works = defaultdict(list)
+ for work in works:
+ method2works[work.invoice_method].append(work)
+ for method, m_works in method2works.items():
+ method = getattr(cls, '_get_%s_%s' % (name, method))
+ # Re-browse for cache alignment
+ amounts.update(method(cls.browse(m_works)))
+ return amounts
+
+ @classmethod
+ def _get_invoiced_amount(cls, works):
+ return cls._get_invoice_values(works, 'invoiced_amount')
+
+ @classmethod
+ @ModelView.button
+ def invoice(cls, works):
+ pool = Pool()
+ Invoice = pool.get('account.invoice')
+
+ invoices = []
+ uninvoiced = works[:]
+ while uninvoiced:
+ work = uninvoiced.pop(0)
+ invoice_lines, uninvoiced_children = (
+ work._get_all_lines_to_invoice())
+ uninvoiced.extend(uninvoiced_children)
+ if not invoice_lines:
+ continue
+ invoice = work._get_invoice()
+ invoice.save()
+ invoices.append(invoice)
+ for key, lines in groupby(invoice_lines,
+ key=work._group_lines_to_invoice_key):
+ lines = list(lines)
+ key = dict(key)
+ invoice_line = work._get_invoice_line(key, invoice, lines)
+ invoice_line.invoice = invoice.id
+ invoice_line.save()
+ origins = defaultdict(list)
+ for line in lines:
+ for origin in line['origins']:
+ origins[origin.__class__].append(origin)
+ # TODO: remove when _check_access ignores record rule
+ with Transaction().set_user(0):
+ for klass, records in origins.items():
+ klass.save(records) # Store first new origins
+ klass.write(records, {
+ 'invoice_line': invoice_line.id,
+ })
+ Invoice.update_taxes(invoices)
+
+ def _get_invoice(self):
+ "Return invoice for the work"
+ pool = Pool()
+ Invoice = pool.get('account.invoice')
+ Journal = pool.get('account.journal')
+
+ journals = Journal.search([
+ ('type', '=', 'revenue'),
+ ], limit=1)
+ if journals:
+ journal, = journals
+ else:
+ journal = None
+
+ if not self.party:
+ raise InvoicingError(
+ gettext('project_invoice.msg_missing_party',
+ work=self.rec_name))
+
+ return Invoice(
+ company=self.company,
+ type='out',
+ journal=journal,
+ party=self.party,
+ invoice_address=self.party.address_get(type='invoice'),
+ currency=self.company.currency,
+ account=self.party.account_receivable_used,
+ payment_term=self.party.customer_payment_term,
+ description=self.name,
+ )
+
+ def _group_lines_to_invoice_key(self, line):
+ "The key to group lines"
+ return (('product', line['product']),
+ ('unit', line['unit']),
+ ('unit_price', line['unit_price']),
+ ('description', line['description']))
+
+ def _get_invoice_line(self, key, invoice, lines):
+ "Return a invoice line for the lines"
+ pool = Pool()
+ InvoiceLine = pool.get('account.invoice.line')
+ AccountConfiguration = pool.get('account.configuration')
+ account_config = AccountConfiguration(1)
+
+ quantity = sum(l['quantity'] for l in lines)
+ product = key['product']
+
+ invoice_line = InvoiceLine()
+ invoice_line.type = 'line'
+ invoice_line.description = key['description']
+ if product:
+ invoice_line.account = product.account_revenue_used
+ if not invoice_line.account:
+ raise InvoicingError(
+ gettext(
+ 'project_invoice.msg_product_missing_account_revenue',
+ work=self.rec_name,
+ product=product.rec_name))
+ else:
+ invoice_line.account = account_config.get_multivalue(
+ 'default_category_account_revenue', company=invoice.company.id)
+ if not invoice_line.account:
+ raise InvoicingError(
+ gettext('project_invoice.msg_missing_account_revenue',
+ work=self.rec_name))
+ invoice_line.product = product
+ invoice_line.unit_price = key['unit_price']
+ invoice_line.quantity = quantity
+ invoice_line.unit = key['unit']
+ invoice_line.currency = invoice.currency
+ invoice_line.company = invoice.company
+
+ taxes = set()
+ pattern = invoice_line._get_tax_rule_pattern()
+ party = invoice.party
+ original_taxes = (
+ product.customer_taxes_used if product else invoice.account.taxes)
+ for tax in original_taxes:
+ if party.customer_tax_rule:
+ tax_ids = party.customer_tax_rule.apply(tax, pattern)
+ if tax_ids:
+ taxes.update(tax_ids)
+ continue
+ taxes.add(tax.id)
+ if party.customer_tax_rule:
+ tax_ids = party.customer_tax_rule.apply(None, pattern)
+ if tax_ids:
+ taxes.update(tax_ids)
+ invoice_line.taxes = taxes
+ return invoice_line
+
+ def _test_group_invoice(self):
+ return (self.company, self.party)
+
+ def _get_all_lines_to_invoice(self, test=None):
+ "Return lines for work and children"
+ lines = []
+ if test is None:
+ test = self._test_group_invoice()
+ uninvoiced_children = []
+ lines += self._get_lines_to_invoice()
+ for children in self.children:
+ if children.type == 'project':
+ if test != children._test_group_invoice():
+ uninvoiced_children.append(children)
+ continue
+ child_lines, uninvoiced = children._get_all_lines_to_invoice(
+ test=test)
+ lines.extend(child_lines)
+ uninvoiced_children.extend(uninvoiced)
+ return lines, uninvoiced_children
+
+ def _get_lines_to_invoice(self):
+ if self.quantity_to_invoice:
+ if self.invoice_unit_price is None:
+ raise InvoicingError(
+ gettext('project_invoice.msg_missing_list_price',
+ work=self.rec_name))
+ return [{
+ 'product': self.product,
+ 'quantity': self.quantity_to_invoice,
+ 'unit': self.unit_to_invoice,
+ 'unit_price': self.invoice_unit_price,
+ 'origins': self.get_origins_to_invoice(),
+ 'description': self.name,
+ }]
+ return []
+
+ @property
+ def invoice_unit_price(self):
+ return self.list_price
+
+ @property
+ def unit_to_invoice(self):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ Uom = pool.get('product.uom')
+ if self.price_list_hour:
+ return Uom(ModelData.get_id('product', 'uom_hour'))
+ elif self.product:
+ return self.product.default_uom
+
+ def get_origins_to_invoice(self):
+ return super().get_origins_to_invoice()
+
+
+class WorkInvoicedProgress(ModelView, ModelSQL):
+ 'Work Invoiced Progress'
+ __name__ = 'project.work.invoiced_progress'
+ work = fields.Many2One('project.work', 'Work', ondelete='RESTRICT',
+ select=True)
+ progress = fields.Float('Progress', required=True,
+ domain=[
+ ('progress', '>=', 0),
+ ])
+ invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
+ ondelete='CASCADE')
+
+ @classmethod
+ def __register__(cls, module_name):
+ cursor = Transaction().connection.cursor()
+ table = cls.__table_handler__(module_name)
+ sql_table = cls.__table__()
+ pool = Pool()
+ Work = pool.get('project.work')
+ work = Work.__table__()
+
+ created_progress = not table.column_exist('progress')
+ effort_exist = table.column_exist('effort_duration')
+
+ super().__register__(module_name)
+
+ # Migration from 5.0: Effort renamed into to progress
+ if created_progress and effort_exist:
+ # Don't use UPDATE FROM because SQLite does not support it.
+ value = work.select(
+ (Extract('EPOCH', sql_table.effort_duration)
+ / NullIf(Extract('EPOCH', work.effort_duration), 0)),
+ where=work.id == sql_table.work)
+ cursor.execute(*sql_table.update([sql_table.progress], [value]))
+
+
+class OpenInvoice(Wizard):
+ 'Open Invoice'
+ __name__ = 'project.open_invoice'
+ start_state = 'open_'
+ open_ = StateAction('account_invoice.act_invoice_form')
+
+ def do_open_(self, action):
+ works = self.model.search([
+ ('parent', 'child_of', list(map(int, self.records))),
+ ])
+ invoice_ids = set()
+ for work in works:
+ if work.invoice_line and work.invoice_line.invoice:
+ invoice_ids.add(work.invoice_line.invoice.id)
+ for twork in work.timesheet_works:
+ for timesheet_line in twork.timesheet_lines:
+ if (timesheet_line.invoice_line
+ and timesheet_line.invoice_line.invoice):
+ invoice_ids.add(timesheet_line.invoice_line.invoice.id)
+ if work.invoiced_progress:
+ for progress in work.invoiced_progress:
+ invoice_ids.add(progress.invoice_line.invoice.id)
+ encoder = PYSONEncoder()
+ action['pyson_domain'] = encoder.encode(
+ [('id', 'in', list(invoice_ids))])
+ action['pyson_search_value'] = encoder.encode([])
+ return action, {}
diff --git a/modules/project_invoice/project.xml b/modules/project_invoice/project.xml
new file mode 100644
index 0000000000..713afe6c91
--- /dev/null
+++ b/modules/project_invoice/project.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+ Project Invoice
+
+
+
+
+
+
+
+ project.work
+
+ work_list
+
+
+ project.work
+
+ work_form
+
+
+
+ invoice
+ Invoice
+
+
+
+
+
+
+
+
+ project.work.invoiced_progress
+ form
+ work_invoiced_progress_form
+
+
+ project.work.invoiced_progress
+ tree
+ work_invoiced_progress_list
+
+
+
+
+
+
+
+
+
+
+ Invoices
+ project.open_invoice
+ project.work
+
+
+ form_relate
+ project.work,-1
+
+
+
+
+
+
+
+
diff --git a/modules/project_invoice/setup.py b/modules/project_invoice/setup.py
new file mode 100755
index 0000000000..95c3bed572
--- /dev/null
+++ b/modules/project_invoice/setup.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_project_invoice'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = ['python-sql >= 0.4']
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [get_require_version('proteus')]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module to invoice projects',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/project_invoice',
+ },
+ keywords='tryton project invoice',
+ package_dir={'trytond.modules.project_invoice': '.'},
+ packages=(
+ ['trytond.modules.project_invoice']
+ + ['trytond.modules.project_invoice.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.project_invoice': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ project_invoice = trytond.modules.project_invoice
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/project_invoice/tests/__init__.py b/modules/project_invoice/tests/__init__.py
new file mode 100644
index 0000000000..2877449bdb
--- /dev/null
+++ b/modules/project_invoice/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.project_invoice.tests.test_project_invoice import suite # noqa: E501
+except ImportError:
+ from .test_project_invoice import suite
+
+__all__ = ['suite']
diff --git a/modules/project_invoice/tests/scenario_project_invoice_effort.rst b/modules/project_invoice/tests/scenario_project_invoice_effort.rst
new file mode 100644
index 0000000000..78a5e267cd
--- /dev/null
+++ b/modules/project_invoice/tests/scenario_project_invoice_effort.rst
@@ -0,0 +1,196 @@
+===============================
+Project Invoice Effort Scenario
+===============================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules, set_user
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> from trytond.modules.account.tests.tools import create_chart, \
+ ... get_accounts
+ >>> from trytond.modules.account_invoice.tests.tools import \
+ ... create_payment_term
+ >>> today = datetime.date.today()
+
+Activate modules::
+
+ >>> config = activate_modules('project_invoice')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create project user::
+
+ >>> User = Model.get('res.user')
+ >>> Group = Model.get('res.group')
+ >>> project_user = User()
+ >>> project_user.name = 'Project'
+ >>> project_user.login = 'project'
+ >>> project_group, = Group.find([('name', '=', 'Project Administration')])
+ >>> timesheet_group, = Group.find([('name', '=', 'Timesheet Administration')])
+ >>> project_user.groups.extend([project_group, timesheet_group])
+ >>> project_user.save()
+
+Create project invoice user::
+
+ >>> project_invoice_user = User()
+ >>> project_invoice_user.name = 'Project Invoice'
+ >>> project_invoice_user.login = 'project_invoice'
+ >>> project_invoice_group, = Group.find([('name', '=', 'Project Invoice')])
+ >>> project_group, = Group.find([('name', '=', 'Project Administration')])
+ >>> project_invoice_user.groups.extend(
+ ... [project_invoice_group, project_group])
+ >>> project_invoice_user.save()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+ >>> revenue = accounts['revenue']
+
+Create payment term::
+
+ >>> payment_term = create_payment_term()
+ >>> payment_term.save()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.customer_payment_term = payment_term
+ >>> customer.save()
+
+Create employee::
+
+ >>> Employee = Model.get('company.employee')
+ >>> employee = Employee()
+ >>> party = Party(name='Employee')
+ >>> party.save()
+ >>> employee.party = party
+ >>> employee.company = company
+ >>> employee.save()
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_revenue = revenue
+ >>> account_category.save()
+
+Create products::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> hour, = ProductUom.find([('name', '=', 'Hour')])
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Service'
+ >>> template.default_uom = hour
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('20')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Service Fixed'
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('50')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product_fixed, = template.products
+
+Create a Project::
+
+ >>> set_user(project_user)
+ >>> ProjectWork = Model.get('project.work')
+ >>> project = ProjectWork()
+ >>> project.name = 'Test effort'
+ >>> project.type = 'project'
+ >>> project.party = customer
+ >>> project.project_invoice_method = 'effort'
+ >>> project.product = product
+ >>> project.effort_duration = datetime.timedelta(hours=1)
+ >>> task = project.children.new()
+ >>> task.name = 'Task 1'
+ >>> task.type = 'task'
+ >>> task.product = product
+ >>> task.effort_duration = datetime.timedelta(hours=5)
+ >>> task_no_effort = project.children.new()
+ >>> task_no_effort.name = "Task 2"
+ >>> task_no_effort.type = 'task'
+ >>> task_no_effort.effort_duration = None
+ >>> task_fixed = project.children.new()
+ >>> task_fixed.name = "Task 2"
+ >>> task_fixed.type = 'task'
+ >>> task_fixed.effort_duration = datetime.timedelta(hours=2)
+ >>> task_fixed.product = product_fixed
+ >>> project.save()
+ >>> task, task_no_effort, task_fixed = project.children
+
+Check project amounts::
+
+ >>> project.reload()
+ >>> project.invoiced_amount
+ Decimal('0')
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+
+Do 1 task::
+
+ >>> task.progress = 1
+ >>> task.save()
+
+Check project amounts::
+
+ >>> project.reload()
+ >>> project.invoiced_amount
+ Decimal('0')
+ >>> project.amount_to_invoice
+ Decimal('100.00')
+
+Invoice project::
+
+ >>> set_user(project_invoice_user)
+ >>> project.click('invoice')
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+ >>> project.invoiced_amount
+ Decimal('100.00')
+
+Do project::
+
+ >>> set_user(project_user)
+ >>> task_no_effort.progress = 1
+ >>> task_no_effort.save()
+ >>> task_fixed.progress = 1
+ >>> task_fixed.save()
+ >>> project.progress = 1
+ >>> project.save()
+
+Check project amounts::
+
+ >>> project.reload()
+ >>> project.amount_to_invoice
+ Decimal('70.00')
+ >>> project.invoiced_amount
+ Decimal('100.00')
+
+Invoice again project::
+
+ >>> set_user(project_invoice_user)
+ >>> project.click('invoice')
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+ >>> project.invoiced_amount
+ Decimal('170.00')
diff --git a/modules/project_invoice/tests/scenario_project_invoice_multiple_party.rst b/modules/project_invoice/tests/scenario_project_invoice_multiple_party.rst
new file mode 100644
index 0000000000..8c8a389841
--- /dev/null
+++ b/modules/project_invoice/tests/scenario_project_invoice_multiple_party.rst
@@ -0,0 +1,122 @@
+=========================================
+Project Invoice Multiple Parties Scenario
+=========================================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> from trytond.modules.account.tests.tools import create_chart, \
+ ... get_accounts
+ >>> today = datetime.date.today()
+
+Activate modules::
+
+ >>> config = activate_modules('project_invoice')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+ >>> revenue = accounts['revenue']
+
+Create two customers::
+
+ >>> Party = Model.get('party.party')
+ >>> customer1 = Party(name='Customer 1')
+ >>> customer1.save()
+ >>> customer2 = Party(name='Customer 2')
+ >>> customer2.save()
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_revenue = revenue
+ >>> account_category.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> hour, = ProductUom.find([('name', '=', 'Hour')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Service'
+ >>> template.default_uom = hour
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('20')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+Create a Project with multiple customers::
+
+ >>> ProjectWork = Model.get('project.work')
+ >>> project = ProjectWork()
+ >>> project.name = 'Test multiple party'
+ >>> project.type = 'project'
+ >>> project.party = customer1
+ >>> project.project_invoice_method = 'effort'
+ >>> project.product = product
+ >>> project.effort_duration = datetime.timedelta(hours=1)
+
+ >>> subproject = project.children.new()
+ >>> subproject.name = 'Subproject'
+ >>> subproject.type = 'project'
+ >>> subproject.party = customer2
+ >>> subproject.project_invoice_method = 'effort'
+ >>> subproject.product = product
+ >>> subproject.effort_duration = datetime.timedelta(hours=5)
+
+ >>> project.save()
+ >>> subproject, = project.children
+
+Check project amounts::
+
+ >>> project.reload()
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+ >>> project.invoiced_amount
+ Decimal('0')
+
+Do project and subproject::
+
+ >>> subproject.progress = 1
+ >>> subproject.save()
+ >>> project.progress = 1
+ >>> project.save()
+
+Check project amounts::
+
+ >>> project.reload()
+ >>> project.amount_to_invoice
+ Decimal('120.00')
+ >>> project.invoiced_amount
+ Decimal('0')
+
+Invoice project::
+
+ >>> project.click('invoice')
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+ >>> project.invoiced_amount
+ Decimal('120.00')
+
+ >>> Invoice = Model.get('account.invoice')
+ >>> invoices = Invoice.find([])
+ >>> len(invoices)
+ 2
+ >>> sorted([i.party.name for i in invoices])
+ ['Customer 1', 'Customer 2']
diff --git a/modules/project_invoice/tests/scenario_project_invoice_progress.rst b/modules/project_invoice/tests/scenario_project_invoice_progress.rst
new file mode 100644
index 0000000000..1b043b9f02
--- /dev/null
+++ b/modules/project_invoice/tests/scenario_project_invoice_progress.rst
@@ -0,0 +1,198 @@
+=================================
+Project Invoice Progress Scenario
+=================================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules, set_user
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> from trytond.modules.account.tests.tools import create_chart, \
+ ... get_accounts
+ >>> from trytond.modules.account_invoice.tests.tools import \
+ ... create_payment_term
+ >>> today = datetime.date.today()
+
+Activate modules::
+
+ >>> config = activate_modules('project_invoice')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create project user::
+
+ >>> User = Model.get('res.user')
+ >>> Group = Model.get('res.group')
+ >>> project_user = User()
+ >>> project_user.name = 'Project'
+ >>> project_user.login = 'project'
+ >>> project_group, = Group.find([('name', '=', 'Project Administration')])
+ >>> timesheet_group, = Group.find([('name', '=', 'Timesheet Administration')])
+ >>> project_user.groups.extend([project_group, timesheet_group])
+ >>> project_user.save()
+
+Create project invoice user::
+
+ >>> project_invoice_user = User()
+ >>> project_invoice_user.name = 'Project Invoice'
+ >>> project_invoice_user.login = 'project_invoice'
+ >>> project_invoice_group, = Group.find([('name', '=', 'Project Invoice')])
+ >>> project_group, = Group.find([('name', '=', 'Project Administration')])
+ >>> project_invoice_user.groups.extend(
+ ... [project_invoice_group, project_group])
+ >>> project_invoice_user.save()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+ >>> revenue = accounts['revenue']
+
+Create payment term::
+
+ >>> payment_term = create_payment_term()
+ >>> payment_term.save()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.customer_payment_term = payment_term
+ >>> customer.save()
+
+Create employee::
+
+ >>> Employee = Model.get('company.employee')
+ >>> employee = Employee()
+ >>> party = Party(name='Employee')
+ >>> party.save()
+ >>> employee.party = party
+ >>> employee.company = company
+ >>> employee.save()
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_revenue = revenue
+ >>> account_category.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> hour, = ProductUom.find([('name', '=', 'Hour')])
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> unit.rounding = 0.01
+ >>> unit.digits = 2
+ >>> unit.save()
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Service'
+ >>> template.default_uom = hour
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('20')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Service Fixed'
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('50')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product_fixed, = template.products
+
+Create a Project::
+
+ >>> set_user(project_user)
+ >>> ProjectWork = Model.get('project.work')
+ >>> TimesheetWork = Model.get('timesheet.work')
+ >>> project = ProjectWork()
+ >>> project.name = 'Test effort'
+ >>> project.type = 'project'
+ >>> project.party = customer
+ >>> project.project_invoice_method = 'progress'
+ >>> project.product = product
+ >>> project.effort_duration = datetime.timedelta(hours=1)
+ >>> task = project.children.new()
+ >>> task.name = 'Task 1'
+ >>> task.type = 'task'
+ >>> task.product = product
+ >>> task.effort_duration = datetime.timedelta(hours=5)
+ >>> task_fixed = project.children.new()
+ >>> task_fixed.name = 'Task 2'
+ >>> task_fixed.type = 'task'
+ >>> task_fixed.product = product
+ >>> task_fixed.product = product_fixed
+ >>> project.save()
+ >>> task, task_fixed = project.children
+
+Check project amounts::
+
+ >>> project.reload()
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+ >>> project.invoiced_amount
+ Decimal('0.00')
+
+Do 50% of task::
+
+ >>> task.progress = 0.5
+ >>> task.save()
+ >>> task_fixed.progress = 0.5
+ >>> task_fixed.save()
+
+Check project amounts::
+
+ >>> project.reload()
+ >>> project.amount_to_invoice
+ Decimal('75.00')
+ >>> project.invoiced_amount
+ Decimal('0.00')
+
+Invoice project::
+
+ >>> set_user(project_invoice_user)
+ >>> project.click('invoice')
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+ >>> project.invoiced_amount
+ Decimal('75.00')
+
+Do 75% and 90% of tasks and 80% of project::
+
+ >>> set_user(project_user)
+ >>> task.progress = 0.75
+ >>> task.save()
+ >>> task_fixed.progress = 0.9
+ >>> task_fixed.save()
+ >>> project.progress = 0.80
+ >>> project.save()
+
+Check project amounts::
+
+ >>> project.reload()
+ >>> project.amount_to_invoice
+ Decimal('61.00')
+ >>> project.invoiced_amount
+ Decimal('75.00')
+
+Invoice again project::
+
+ >>> set_user(project_invoice_user)
+ >>> project.click('invoice')
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+ >>> project.invoiced_amount
+ Decimal('136.00')
diff --git a/modules/project_invoice/tests/scenario_project_invoice_timesheet.rst b/modules/project_invoice/tests/scenario_project_invoice_timesheet.rst
new file mode 100644
index 0000000000..6b4be53e5c
--- /dev/null
+++ b/modules/project_invoice/tests/scenario_project_invoice_timesheet.rst
@@ -0,0 +1,226 @@
+==================================
+Project Invoice Timesheet Scenario
+==================================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules, set_user
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> from trytond.modules.account.tests.tools import create_chart, \
+ ... get_accounts
+ >>> from trytond.modules.account_invoice.tests.tools import \
+ ... create_payment_term
+ >>> today = datetime.date.today()
+ >>> yesterday = today - datetime.timedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('project_invoice')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create project user::
+
+ >>> User = Model.get('res.user')
+ >>> Group = Model.get('res.group')
+ >>> project_user = User()
+ >>> project_user.name = 'Project'
+ >>> project_user.login = 'project'
+ >>> project_group, = Group.find([('name', '=', 'Project Administration')])
+ >>> timesheet_group, = Group.find([('name', '=', 'Timesheet Administration')])
+ >>> project_user.groups.extend([project_group, timesheet_group])
+ >>> project_user.save()
+
+Create project invoice user::
+
+ >>> project_invoice_user = User()
+ >>> project_invoice_user.name = 'Project Invoice'
+ >>> project_invoice_user.login = 'project_invoice'
+ >>> project_invoice_group, = Group.find([('name', '=', 'Project Invoice')])
+ >>> project_group, = Group.find([('name', '=', 'Project Administration')])
+ >>> invoice_group, = Group.find([('name', '=', 'Account')])
+ >>> project_invoice_user.groups.extend(
+ ... [project_invoice_group, project_group, invoice_group])
+ >>> project_invoice_user.save()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+ >>> revenue = accounts['revenue']
+
+Create payment term::
+
+ >>> payment_term = create_payment_term()
+ >>> payment_term.save()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.customer_payment_term = payment_term
+ >>> customer.save()
+
+Create employee::
+
+ >>> Employee = Model.get('company.employee')
+ >>> employee = Employee()
+ >>> party = Party(name='Employee')
+ >>> party.save()
+ >>> employee.party = party
+ >>> employee.company = company
+ >>> employee.save()
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_revenue = revenue
+ >>> account_category.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> hour, = ProductUom.find([('name', '=', 'Hour')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Service'
+ >>> template.default_uom = hour
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('20')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+Create a Project::
+
+ >>> set_user(project_user)
+ >>> ProjectWork = Model.get('project.work')
+ >>> project = ProjectWork()
+ >>> project.name = 'Test timesheet'
+ >>> project.type = 'project'
+ >>> project.party = customer
+ >>> project.project_invoice_method = 'timesheet'
+ >>> project.product = product
+ >>> project.timesheet_available = True
+ >>> task = ProjectWork()
+ >>> task.name = 'Task 1'
+ >>> task.timesheet_available = True
+ >>> task.type = 'task'
+ >>> task.product = product
+ >>> project.children.append(task)
+ >>> project.save()
+ >>> task, = project.children
+
+Add a task without timesheet work::
+
+ >>> task2 = project.children.new()
+ >>> task2.name = 'Task 2'
+ >>> task2.type = 'task'
+ >>> project.save()
+
+Create timesheets::
+
+ >>> TimesheetLine = Model.get('timesheet.line')
+ >>> line = TimesheetLine()
+ >>> line.date = yesterday
+ >>> line.employee = employee
+ >>> line.duration = datetime.timedelta(hours=3)
+ >>> line.work, = task.timesheet_works
+ >>> line.save()
+ >>> line = TimesheetLine()
+ >>> line.date = today
+ >>> line.employee = employee
+ >>> line.duration = datetime.timedelta(hours=2)
+ >>> line.work, = project.timesheet_works
+ >>> line.save()
+
+Check project amounts::
+
+ >>> project.reload()
+ >>> project.amount_to_invoice
+ Decimal('100.00')
+ >>> project.invoiced_amount
+ Decimal('0.00')
+
+Invoice project up to yesterday::
+
+ >>> set_user(project_user)
+ >>> project.project_invoice_timesheet_up_to = yesterday
+ >>> project.save()
+ >>> set_user(project_invoice_user)
+ >>> project.click('invoice')
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+ >>> project.invoiced_amount
+ Decimal('60.00')
+
+ >>> project.project_invoice_timesheet_up_to = today
+ >>> project.save()
+ >>> project.amount_to_invoice
+ Decimal('40.00')
+
+ >>> set_user(project_invoice_user)
+ >>> Invoice = Model.get('account.invoice')
+ >>> invoice, = Invoice.find([])
+ >>> invoice.total_amount
+ Decimal('60.00')
+
+Invoice all project::
+
+ >>> set_user(project_user)
+ >>> project.project_invoice_timesheet_up_to = None
+ >>> project.save()
+ >>> set_user(project_invoice_user)
+ >>> project.click('invoice')
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+ >>> project.invoiced_amount
+ Decimal('100.00')
+
+ >>> set_user(project_invoice_user)
+ >>> _, invoice = Invoice.find([], order=[('id', 'ASC')])
+ >>> invoice.total_amount
+ Decimal('40.00')
+
+Create more timesheets::
+
+ >>> set_user(project_user)
+ >>> TimesheetLine = Model.get('timesheet.line')
+ >>> line = TimesheetLine()
+ >>> line.employee = employee
+ >>> line.duration = datetime.timedelta(hours=4)
+ >>> line.work, = task.timesheet_works
+ >>> line.save()
+
+Check project amounts::
+
+ >>> project.reload()
+ >>> project.amount_to_invoice
+ Decimal('80.00')
+ >>> project.invoiced_amount
+ Decimal('100.00')
+
+Invoice again project::
+
+ >>> set_user(project_invoice_user)
+ >>> project.click('invoice')
+ >>> project.amount_to_invoice
+ Decimal('0.00')
+ >>> project.invoiced_amount
+ Decimal('180.00')
+
+ >>> set_user(project_invoice_user)
+ >>> _, _, invoice = Invoice.find([], order=[('id', 'ASC')])
+ >>> invoice.total_amount
+ Decimal('80.00')
diff --git a/modules/project_invoice/tests/test_project_invoice.py b/modules/project_invoice/tests/test_project_invoice.py
new file mode 100644
index 0000000000..c8895954d0
--- /dev/null
+++ b/modules/project_invoice/tests/test_project_invoice.py
@@ -0,0 +1,40 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import unittest
+import doctest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import ModuleTestCase
+from trytond.tests.test_tryton import doctest_teardown
+from trytond.tests.test_tryton import doctest_checker
+
+
+class ProjectInvoiceTestCase(ModuleTestCase):
+ 'Test Project Invoice module'
+ module = 'project_invoice'
+
+
+def suite():
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProjectInvoiceTestCase))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_project_invoice_timesheet.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_project_invoice_effort.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_project_invoice_progress.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_project_invoice_multiple_party.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ return suite
diff --git a/modules/project_invoice/timesheet.py b/modules/project_invoice/timesheet.py
new file mode 100644
index 0000000000..62899a9628
--- /dev/null
+++ b/modules/project_invoice/timesheet.py
@@ -0,0 +1,38 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.i18n import gettext
+from trytond.model import fields
+from trytond.model.exceptions import AccessError
+from trytond.pool import PoolMeta
+
+
+class Line(metaclass=PoolMeta):
+ __name__ = 'timesheet.line'
+ invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
+ readonly=True)
+
+ @classmethod
+ def copy(cls, records, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('invoice_line', None)
+ return super().copy(records, default=default)
+
+ @classmethod
+ def write(cls, *args):
+ actions = iter(args)
+ for lines, values in zip(actions, actions):
+ if (('duration' in values or 'work' in values)
+ and any(l.invoice_line for l in lines)):
+ raise AccessError(
+ gettext('project_invoice.msg_modify_invoiced_line'))
+ super().write(*args)
+
+ @classmethod
+ def delete(cls, records):
+ if any(r.invoice_line for r in records):
+ raise AccessError(
+ gettext('project_invoice.msg_delete_invoiced_line'))
+ super().delete(records)
diff --git a/modules/project_invoice/timesheet.xml b/modules/project_invoice/timesheet.xml
new file mode 100644
index 0000000000..9906415ff2
--- /dev/null
+++ b/modules/project_invoice/timesheet.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ Timesheet Lines
+ timesheet.line
+
+
+
+ form_relate
+ account.invoice,-1
+
+
+
+
+
+
+
+
diff --git a/modules/project_invoice/tox.ini b/modules/project_invoice/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/project_invoice/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/project_invoice/tryton.cfg b/modules/project_invoice/tryton.cfg
new file mode 100644
index 0000000000..eecf65b696
--- /dev/null
+++ b/modules/project_invoice/tryton.cfg
@@ -0,0 +1,15 @@
+[tryton]
+version=6.0.5
+depends:
+ ir
+ project
+ project_revenue
+ timesheet
+ account
+ account_invoice
+ account_product
+ product
+xml:
+ project.xml
+ timesheet.xml
+ message.xml
diff --git a/modules/project_invoice/view/work_form.xml b/modules/project_invoice/view/work_form.xml
new file mode 100644
index 0000000000..0f4ded9d3b
--- /dev/null
+++ b/modules/project_invoice/view/work_form.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/project_invoice/view/work_invoiced_progress_form.xml b/modules/project_invoice/view/work_invoiced_progress_form.xml
new file mode 100644
index 0000000000..99e48cf424
--- /dev/null
+++ b/modules/project_invoice/view/work_invoiced_progress_form.xml
@@ -0,0 +1,15 @@
+
+
+
diff --git a/modules/project_invoice/view/work_invoiced_progress_list.xml b/modules/project_invoice/view/work_invoiced_progress_list.xml
new file mode 100644
index 0000000000..eefeb22106
--- /dev/null
+++ b/modules/project_invoice/view/work_invoiced_progress_list.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/project_invoice/view/work_list.xml b/modules/project_invoice/view/work_list.xml
new file mode 100644
index 0000000000..7e4ee868a9
--- /dev/null
+++ b/modules/project_invoice/view/work_list.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/modules/project_plan/.drone.yml b/modules/project_plan/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/project_plan/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/project_plan/.flake8 b/modules/project_plan/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/project_plan/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/project_plan/CHANGELOG b/modules/project_plan/CHANGELOG
new file mode 100644
index 0000000000..0c10029fa3
--- /dev/null
+++ b/modules/project_plan/CHANGELOG
@@ -0,0 +1,73 @@
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+
+Version 4.0.0 - 2016-05-02
+* Bug fixes (see mercurial logs for details)
+* Add Python3 support
+
+Version 3.8.0 - 2015-11-02
+* Bug fixes (see mercurial logs for details)
+
+Version 3.6.0 - 2015-04-20
+* Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+* Use TimeDelta field
+
+Version 3.4.0 - 2014-10-20
+* Bug fixes (see mercurial logs for details)
+
+Version 3.2.0 - 2014-04-21
+* Bug fixes (see mercurial logs for details)
+
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+
+Version 2.8.0 - 2013-04-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.6.0 - 2012-10-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.4.0 - 2012-04-24
+* Bug fixes (see mercurial logs for details)
+
+Version 2.2.0 - 2011-10-25
+* Bug fixes (see mercurial logs for details)
+
+Version 2.0.0 - 2011-04-27
+* Bug fixes (see mercurial logs for details)
+
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
+Version 1.6.0 - 2010-05-13
+* Initial release
diff --git a/modules/project_plan/COPYRIGHT b/modules/project_plan/COPYRIGHT
new file mode 100644
index 0000000000..d9166f48a0
--- /dev/null
+++ b/modules/project_plan/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2009-2013 Bertrand Chenal.
+Copyright (C) 2009-2021 Cédric Krier.
+Copyright (C) 2009-2021 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/project_plan/LICENSE b/modules/project_plan/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/project_plan/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/project_plan/MANIFEST.in b/modules/project_plan/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/project_plan/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/project_plan/README.rst b/modules/project_plan/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/project_plan/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/project_plan/__init__.py b/modules/project_plan/__init__.py
new file mode 100644
index 0000000000..07b5deccb9
--- /dev/null
+++ b/modules/project_plan/__init__.py
@@ -0,0 +1,17 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import allocation
+from . import work
+
+
+def register():
+ Pool.register(
+ allocation.Allocation,
+ work.Work,
+ work.PredecessorSuccessor,
+ module='project_plan', type_='model')
+ Pool.register(
+ work.Leveling,
+ module='project_plan', type_='wizard')
diff --git a/modules/project_plan/allocation.py b/modules/project_plan/allocation.py
new file mode 100644
index 0000000000..a22df3dd38
--- /dev/null
+++ b/modules/project_plan/allocation.py
@@ -0,0 +1,68 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, ModelSQL, fields
+from trytond.pool import Pool
+
+
+class Allocation(ModelSQL, ModelView):
+ 'Allocation'
+ __name__ = 'project.allocation'
+ employee = fields.Many2One('company.employee', 'Employee', required=True,
+ select=True, ondelete='CASCADE')
+ work = fields.Many2One('project.work', 'Work', required=True,
+ select=True, ondelete='CASCADE')
+ percentage = fields.Float('Percentage', digits=(16, 2), required=True,
+ domain=[('percentage', '>', 0.0)])
+
+ @classmethod
+ def __register__(cls, module_name):
+ super(Allocation, cls).__register__(module_name)
+
+ table = cls.__table_handler__(module_name)
+
+ # Migration from 3.2:
+ table.drop_constraint('percentage_positive')
+
+ @staticmethod
+ def default_percentage():
+ return 100
+
+ def get_rec_name(self, name):
+ return self.employee.rec_name
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return [('employee.rec_name',) + tuple(clause[1:])]
+
+ @classmethod
+ def write(cls, *args):
+ Work = Pool().get('project.work')
+ super(Allocation, cls).write(*args)
+
+ works = Work.search([
+ ('allocations', 'in',
+ [a.id for allocations in args[::2] for a in allocations]),
+ ])
+
+ for work in works:
+ work.reset_leveling()
+ for work in works:
+ work.compute_dates()
+
+ @classmethod
+ def create(cls, vlist):
+ allocations = super(Allocation, cls).create(vlist)
+ for allocation in allocations:
+ allocation.work.reset_leveling()
+ allocation.work.compute_dates()
+ return allocations
+
+ @classmethod
+ def delete(cls, allocations):
+ works = [a.work for a in allocations]
+ super(Allocation, cls).delete(allocations)
+
+ for work in works:
+ work.reset_leveling()
+ for work in works:
+ work.compute_dates()
diff --git a/modules/project_plan/allocation.xml b/modules/project_plan/allocation.xml
new file mode 100644
index 0000000000..f42992ef6b
--- /dev/null
+++ b/modules/project_plan/allocation.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ project.allocation
+ form
+ allocation_form
+
+
+ project.allocation
+ tree
+
+ allocation_tree
+
+
+
diff --git a/modules/project_plan/doc/index.rst b/modules/project_plan/doc/index.rst
new file mode 100644
index 0000000000..365c0722cd
--- /dev/null
+++ b/modules/project_plan/doc/index.rst
@@ -0,0 +1,36 @@
+Project Plan Module
+###################
+
+The Project Plan module adds planning features on top of the Project
+module.
+
+
+Allocation
+**********
+
+An allocation links together an employee, a task and a percentage. It
+defines which part of his time the employee should dedicate to this
+task.
+
+
+Work
+****
+
+The Work model is extended to support planning features:
+
+- Tasks dependencies: Each work may have predecessor and
+ successors. Predecessor and successor must share the same parent
+ project.
+- tasks leveling, I.E. automatically delay some task to avoid
+ overallocation of resources.
+- Early Start and Late End computation: If Constraint Start and
+ Constraint End are set on a work, on its parent work or on one of
+ the predecessors/successors, the Early Start and Late End dates (but
+ also Late Start and Early Finish dates) are computed automatically.
+- Resource allocation: Each task may allocate one or more resource
+ (I.E. a certain amount of time of an employee).
+
+
+The *Task Leveling* wizard allow to level a group of tasks to avoid
+eventual overallocation of resources, It will delay some tasks
+depending on task precedencies and task sequences.
diff --git a/modules/project_plan/locale/bg.po b/modules/project_plan/locale/bg.po
new file mode 100644
index 0000000000..5b59974b90
--- /dev/null
+++ b/modules/project_plan/locale/bg.po
@@ -0,0 +1,134 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Служител"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Процент"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Задача"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Предшественик"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Наследник"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "Действително завършване"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "Време на действително завършване"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "Действително започване"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "Време на действително започване"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Разпределения"
+
+#, fuzzy
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "Изравняване на закъснение"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "Ограничение за край"
+
+#, fuzzy
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "Ограничение за време на завършване"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "Ограничение за начало"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "Ограничение за начално време"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Продължителност"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "По-рано завършване"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "Време на по-рано приключване"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "По-рано начало"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "По-ранно време на започване"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "По-късно завършване"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "Време на по-късно завършване"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "По-късно начало"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "Време на по-късно начало"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "Изравняване на закъснение"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "Предшественици"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "Наследници"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Разпределние"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "Предшественик - Наследник"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Разпределения"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "План"
diff --git a/modules/project_plan/locale/ca.po b/modules/project_plan/locale/ca.po
new file mode 100644
index 0000000000..db058259fe
--- /dev/null
+++ b/modules/project_plan/locale/ca.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Empleat"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Percentatge"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Treball"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Predecessor"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Successor"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "Finalització real"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "Hora de finalització real"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "Inici real"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "Hora d'inici real"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Assignacions"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "Retard de l'anivellació"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "Restricció de finalització"
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "Restricció d'hora de finalització"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "Restricció d'inici"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "Restricció de temps d'inici"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Temps"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "Finalització avançada"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "Hora de finalització avançada"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "Inici prematur"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "Hora d'inici prematur"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "Finalització amb retard"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "Hora de finalització amb retard"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "Inici amb retard"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "Hora d'inici amb retard"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "Retard d'anivellació"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "Predecessors"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "Successors"
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Anivellació de tasques"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Assignació"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "Predecessor - Successor"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Assignacions"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "Planificació"
diff --git a/modules/project_plan/locale/cs.po b/modules/project_plan/locale/cs.po
new file mode 100644
index 0000000000..62da2ba685
--- /dev/null
+++ b/modules/project_plan/locale/cs.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr ""
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr ""
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr ""
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr ""
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr ""
diff --git a/modules/project_plan/locale/de.po b/modules/project_plan/locale/de.po
new file mode 100644
index 0000000000..c57986d9b9
--- /dev/null
+++ b/modules/project_plan/locale/de.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Mitarbeiter"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Prozentsatz"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Tätigkeit"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Vorgänger"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Nachfolger"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "Tatsächliches Enddatum"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "Tatsächliche Endzeit"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "Tatsächliches Startdatum"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "Tatsächliche Startzeit"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Zuordnungen"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "Verzögerung Abgleich Rückstand"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "Fixes Enddatum"
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "Fixe Endzeit"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "Fixes Startdatum"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "Fixe Startzeit"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Dauer"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "Frühestes Enddatum"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "Früheste Endzeit"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "Frühestes Startdatum"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "Früheste Startzeit"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "Spätestes Enddatum"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "Späteste Endzeit"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "Spätestes Startdatum"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "Späteste Startzeit"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "Verzögerung Abgleich"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "Vorgänger"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "Nachfolger"
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Aufgaben abgleichen"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Zuordnung"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "Vorgänger - Nachfolger"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Zuordnungen"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "Planung"
diff --git a/modules/project_plan/locale/es.po b/modules/project_plan/locale/es.po
new file mode 100644
index 0000000000..4c6f72ed87
--- /dev/null
+++ b/modules/project_plan/locale/es.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Empleado"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Porcentaje"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Trabajo"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Predecesor"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Sucesor"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "Finalización real"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "Hora de finalización real"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "Inicio real"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "Hora de inicio real"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Asignaciones"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "Retraso de la nivelación"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "Restricción de finalización"
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "Restricción hora de finalización"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "Restricción de inicio"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "Restricción hora de inicio"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Tiempo"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "Finalización anticipada"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "Hora de finalización anticipada"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "Inicio anticipado"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "Hora de inicio anticipado"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "Finalización con retraso"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "Hora de finalización con retraso"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "Inicio con retraso"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "Hora de inicio con retraso"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "Retraso de nivelación"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "Predecesores"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "Sucesores"
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Nivelación de tareas"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Asignación"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "Predecesor - Sucesor"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Asignaciones"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "Planificación"
diff --git a/modules/project_plan/locale/es_419.po b/modules/project_plan/locale/es_419.po
new file mode 100644
index 0000000000..52ab2d0b3b
--- /dev/null
+++ b/modules/project_plan/locale/es_419.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr ""
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr ""
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "Retraso del ajuste"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "Fin de limitación"
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "Hora fin de limitación"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "Inicio de limitación"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "Hora inicio de limitación"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Duración"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "Retraso de ajuste"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr ""
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr ""
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr ""
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr ""
diff --git a/modules/project_plan/locale/et.po b/modules/project_plan/locale/et.po
new file mode 100644
index 0000000000..ff286b2b61
--- /dev/null
+++ b/modules/project_plan/locale/et.po
@@ -0,0 +1,135 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Töötaja"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Protsent"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Töö"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Eelkäija"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Järeltulija"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "Tegelik lõpp"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "Tegelik lõpp aeg"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "Tegelik algus"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "Tegelik algus aeg"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Allokatsioon"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Kestvus"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "Eelkäija"
+
+#, fuzzy
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "Järeltulija"
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Allokatsioon"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Allokatsioon"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "Plaan"
diff --git a/modules/project_plan/locale/fa.po b/modules/project_plan/locale/fa.po
new file mode 100644
index 0000000000..caec389ee7
--- /dev/null
+++ b/modules/project_plan/locale/fa.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "کارمند"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "درصد"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "کار"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "کارمند اسبق"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "جانشین"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "پایان واقعی"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "زمان پایان واقعی"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "شروع واقعی"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "زمان شروع واقعی"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "تخصیص ها"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "سطح تاخیر به عقب"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "پایان محدودیت"
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "زمان پایان محدودیت"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "شروع محدودیت"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "زمان شروع محدودیت"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "مدت زمان"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "پایان زودهنگام"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "زمان پایان زودهنگام"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "شروع زودهنگام"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "زمان شروع زودهنگام"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "پایان تأخییر افتاده"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "زمان پایان تأخییر افتاده"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "شروع با تأخییر"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "زمان شروع با تأخییر"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "سطح تاخیر"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "پیشینیان"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "جانشین ها"
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "سطح وظایف"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "تخصیص"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "کارمند اسبق - جانشین"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "تخصیص ها"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "طرح"
diff --git a/modules/project_plan/locale/fi.po b/modules/project_plan/locale/fi.po
new file mode 100644
index 0000000000..62da2ba685
--- /dev/null
+++ b/modules/project_plan/locale/fi.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr ""
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr ""
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr ""
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr ""
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr ""
diff --git a/modules/project_plan/locale/fr.po b/modules/project_plan/locale/fr.po
new file mode 100644
index 0000000000..08de5a00a5
--- /dev/null
+++ b/modules/project_plan/locale/fr.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Employé"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Pourcentage"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Travail"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Prédécesseur"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Successeur"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "Fin réelle"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "Heure de fin réelle"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "Début réel"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "Heure de début réelle"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Répartitions"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "Délais rétro-décalage"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "Fin imposée"
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "Heure de fin imposée"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "Début imposé"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "Heure de début imposée"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Durée"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "Fin au plus tôt"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "Heure de fin au plus tôt"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "Début au plus tôt"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "Heure de début au plus tôt"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "Fin au plus tard"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "Heure de fin au plus tard"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "Début au plus tard"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "Heure de début au plus tard"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "Délais décalage"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "Prédécesseurs"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "Successeurs"
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Décalage des tâches"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Répartition"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "Prédécesseur - Successeur"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Répartitions"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "Planification"
diff --git a/modules/project_plan/locale/hu.po b/modules/project_plan/locale/hu.po
new file mode 100644
index 0000000000..a3d49def01
--- /dev/null
+++ b/modules/project_plan/locale/hu.po
@@ -0,0 +1,135 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Alkalmazott"
+
+#, fuzzy
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Százalék:"
+
+#, fuzzy
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Tevékenység"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Időtartam"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr ""
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr ""
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr ""
diff --git a/modules/project_plan/locale/id.po b/modules/project_plan/locale/id.po
new file mode 100644
index 0000000000..308b1f7048
--- /dev/null
+++ b/modules/project_plan/locale/id.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Pegawai"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr ""
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr ""
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr ""
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr ""
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr ""
diff --git a/modules/project_plan/locale/it.po b/modules/project_plan/locale/it.po
new file mode 100644
index 0000000000..81571971cb
--- /dev/null
+++ b/modules/project_plan/locale/it.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Dipendente"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Percentuale"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Lavoro"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Durata"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr ""
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr ""
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr ""
diff --git a/modules/project_plan/locale/lo.po b/modules/project_plan/locale/lo.po
new file mode 100644
index 0000000000..2082160be2
--- /dev/null
+++ b/modules/project_plan/locale/lo.po
@@ -0,0 +1,135 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "ພະນັກງານ"
+
+#, fuzzy
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "ອັດຕາສ່ວນຮ້ອຍ"
+
+#, fuzzy
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "ເຮັດວຽກ"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "ກຳນົດເວລາ"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr ""
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr ""
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr ""
diff --git a/modules/project_plan/locale/lt.po b/modules/project_plan/locale/lt.po
new file mode 100644
index 0000000000..62da2ba685
--- /dev/null
+++ b/modules/project_plan/locale/lt.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr ""
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr ""
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr ""
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr ""
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr ""
diff --git a/modules/project_plan/locale/nl.po b/modules/project_plan/locale/nl.po
new file mode 100644
index 0000000000..cc0bf8eed0
--- /dev/null
+++ b/modules/project_plan/locale/nl.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Werknemer"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Percentage"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Werk"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Voorganger"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Opvolger"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "Werkelijke einddatum"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "Werkelijke eindtijd"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "Werkelijke start"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "Werkelijke starttijd"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Toekenningen"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "Achteruitstelvertraging(Back Leveling Delay)"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "Vaste einddatum"
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "Beperking eindtijd"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "Vaste startdatum"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "Vaste start tijd"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Looptijd"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "vroegste einddatum"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "vroegste eindtijd"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "Vroegste startdatum"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "vroegst start tijd"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "ten laatste gedaan"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "ten laatste gedaan (tijd)"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "laatste start datum"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "laatste start tijd"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "Leverings vertraging"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "voorgangers"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "opvolgers"
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling (match taken?)"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Toewijzing"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "Voorganger - opvolger"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Toekenningen"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "planning"
diff --git a/modules/project_plan/locale/pl.po b/modules/project_plan/locale/pl.po
new file mode 100644
index 0000000000..701516b546
--- /dev/null
+++ b/modules/project_plan/locale/pl.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Pracownik"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Procentowy"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Praca"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Poprzednik"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Następca"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Alokacje"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Czas trwania"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "Poprzednicy"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "Następcy"
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Alokacja"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "Poprzednik - Następca"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Alokacje"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "Plan"
diff --git a/modules/project_plan/locale/pt.po b/modules/project_plan/locale/pt.po
new file mode 100644
index 0000000000..cd01046703
--- /dev/null
+++ b/modules/project_plan/locale/pt.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Empregado"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Porcentagem"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Tarefa"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Predecessor"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Sucessor"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "Finalização Real"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "Hora de Finalização Real"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "Início Real"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "Hora de Início Real"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Alocações"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "Atraso de Nivelamento"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "Restrição de Finalização"
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "Restrição de Hora de Finalização"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "Restrição de Início"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "Restrições de Hora de Início"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Duração"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "Finalização Antecipada"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "Hora de Finalização Antecipada"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "Início Antecipado"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "Hora de Início Antecipado"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "Finalização com Atrado"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "Hora da Finalização com Atraso"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "Início com Atraso"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "Hora de Início com Atraso"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "Atraso de Nivelação"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "Predecessores"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "Sucessores"
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Nivelamento Das Tarefas"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Alocação"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "Predecessor - Sucessor"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Alocações"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "Planejamento"
diff --git a/modules/project_plan/locale/ro.po b/modules/project_plan/locale/ro.po
new file mode 100644
index 0000000000..93e3dbbf00
--- /dev/null
+++ b/modules/project_plan/locale/ro.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr ""
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr ""
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr ""
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr ""
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr ""
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr ""
diff --git a/modules/project_plan/locale/ru.po b/modules/project_plan/locale/ru.po
new file mode 100644
index 0000000000..ac23ddfec9
--- /dev/null
+++ b/modules/project_plan/locale/ru.po
@@ -0,0 +1,133 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Сотрудник"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Процент"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Работа"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Предок"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Потомок"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "Фактически завершен"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "Фактически завершен (время)"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "Фактически начат"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "Фактически начат (время)"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Распределения"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "Обратная выравнивающая задержка"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "Порог завершения"
+
+#, fuzzy
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "Порог завершения (время)"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "Порог начала"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "Порог начала (время)"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Продолжительность"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "Досрочное завершение"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "Досрочное завершение (время)"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "Досрочное начало"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "Досрочное начало (время)"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "Позднее завершение"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "Позднее завершение (время)"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "Позднее начало"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "Позднее начало (время)"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "Выравнивающая задержка"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "Предки"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "Потомки"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Распределение"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "Предок - Потомок"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Распределения"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "План"
diff --git a/modules/project_plan/locale/sl.po b/modules/project_plan/locale/sl.po
new file mode 100644
index 0000000000..c650ecfee7
--- /dev/null
+++ b/modules/project_plan/locale/sl.po
@@ -0,0 +1,132 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "Zaposlenec"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "Delež"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "Naloga"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "Predhodnik"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "Naslednik"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "Dejanski konec"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "Dejanski končni čas"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "Dejanski začetek"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "Dejanski začetni čas"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "Razporeditve"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr "Izravnalna zakasnitev nazaj"
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "Planiran konec"
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "Planiran konćni čas"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "Planiran začetek"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "Planiran začetni čas"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "Trajanje"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "Predčasni konec"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "Predčasni končni čas"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "Predčasni začetek"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "Predčasni začetni čas"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "Pozen konec"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "Pozen končni čas"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "Pozen začetek"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "Pozen začetni čas"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "Izravnalna zakasnitev"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "Predhodniki"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "Nasledniki"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "Razporeditev"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "Predhodnik - Naslednik"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "Razporeditve"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "Planiranje"
diff --git a/modules/project_plan/locale/tr.po b/modules/project_plan/locale/tr.po
new file mode 100644
index 0000000000..62da2ba685
--- /dev/null
+++ b/modules/project_plan/locale/tr.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr ""
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr ""
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr ""
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr ""
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr ""
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr ""
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr ""
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr ""
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr ""
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr ""
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr ""
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr ""
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr ""
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr ""
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr ""
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "Tasks Leveling"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr ""
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr ""
diff --git a/modules/project_plan/locale/zh_CN.po b/modules/project_plan/locale/zh_CN.po
new file mode 100644
index 0000000000..1bf36c28c5
--- /dev/null
+++ b/modules/project_plan/locale/zh_CN.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.allocation,employee:"
+msgid "Employee"
+msgstr "雇员"
+
+msgctxt "field:project.allocation,percentage:"
+msgid "Percentage"
+msgstr "百分比"
+
+msgctxt "field:project.allocation,work:"
+msgid "Work"
+msgstr "工作"
+
+msgctxt "field:project.predecessor_successor,predecessor:"
+msgid "Predecessor"
+msgstr "前驱"
+
+msgctxt "field:project.predecessor_successor,successor:"
+msgid "Successor"
+msgstr "后继"
+
+msgctxt "field:project.work,actual_finish_date:"
+msgid "Actual Finish"
+msgstr "实际完成"
+
+msgctxt "field:project.work,actual_finish_time:"
+msgid "Actual Finish Time"
+msgstr "实际完成时间"
+
+msgctxt "field:project.work,actual_start_date:"
+msgid "Actual Start"
+msgstr "实际开始"
+
+msgctxt "field:project.work,actual_start_time:"
+msgid "Actual Start Time"
+msgstr "实际开始时间"
+
+msgctxt "field:project.work,allocations:"
+msgid "Allocations"
+msgstr "资源分配"
+
+msgctxt "field:project.work,back_leveling_delay:"
+msgid "Back Leveling Delay"
+msgstr ""
+
+msgctxt "field:project.work,constraint_finish_date:"
+msgid "Constraint Finish"
+msgstr "约束完成"
+
+msgctxt "field:project.work,constraint_finish_time:"
+msgid "Constraint Finish Time"
+msgstr "约束完成时间"
+
+msgctxt "field:project.work,constraint_start_date:"
+msgid "Constraint Start"
+msgstr "约束开始"
+
+msgctxt "field:project.work,constraint_start_time:"
+msgid "Constraint Start Time"
+msgstr "约束开始时间"
+
+msgctxt "field:project.work,duration:"
+msgid "Duration"
+msgstr "持续时间"
+
+msgctxt "field:project.work,early_finish_date:"
+msgid "Early Finish"
+msgstr "最早完成"
+
+msgctxt "field:project.work,early_finish_time:"
+msgid "Early Finish Time"
+msgstr "最早完成时间"
+
+msgctxt "field:project.work,early_start_date:"
+msgid "Early Start"
+msgstr "最早开始"
+
+msgctxt "field:project.work,early_start_time:"
+msgid "Early Start Time"
+msgstr "最早开始时间"
+
+msgctxt "field:project.work,late_finish_date:"
+msgid "Late Finish"
+msgstr "最迟完成"
+
+msgctxt "field:project.work,late_finish_time:"
+msgid "Late Finish Time"
+msgstr "最迟完成时间"
+
+msgctxt "field:project.work,late_start_date:"
+msgid "Late Start"
+msgstr "最迟开始"
+
+msgctxt "field:project.work,late_start_time:"
+msgid "Late Start Time"
+msgstr "最迟开始时间"
+
+msgctxt "field:project.work,leveling_delay:"
+msgid "Leveling Delay"
+msgstr "资源调配延迟"
+
+msgctxt "field:project.work,predecessors:"
+msgid "Predecessors"
+msgstr "前驱"
+
+msgctxt "field:project.work,successors:"
+msgid "Successors"
+msgstr "后继"
+
+msgctxt "model:ir.action,name:wizard_leveling"
+msgid "Tasks Leveling"
+msgstr "任务资源调配"
+
+msgctxt "model:project.allocation,name:"
+msgid "Allocation"
+msgstr "资源分配"
+
+msgctxt "model:project.predecessor_successor,name:"
+msgid "Predecessor - Successor"
+msgstr "前驱 - 后继"
+
+msgctxt "view:project.work:"
+msgid "Allocations"
+msgstr "资源分配"
+
+msgctxt "view:project.work:"
+msgid "Plan"
+msgstr "规划"
diff --git a/modules/project_plan/setup.py b/modules/project_plan/setup.py
new file mode 100755
index 0000000000..4e7090722c
--- /dev/null
+++ b/modules/project_plan/setup.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_project_plan'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = []
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module to add planning capabilities on projects',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/project_plan',
+ },
+ keywords='tryton project planning',
+ package_dir={'trytond.modules.project_plan': '.'},
+ packages=(
+ ['trytond.modules.project_plan']
+ + ['trytond.modules.project_plan.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.project_plan': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ project_plan = trytond.modules.project_plan
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ )
diff --git a/modules/project_plan/tests/__init__.py b/modules/project_plan/tests/__init__.py
new file mode 100644
index 0000000000..d99647c6b2
--- /dev/null
+++ b/modules/project_plan/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.project_plan.tests.test_project_plan import suite
+except ImportError:
+ from .test_project_plan import suite
+
+__all__ = ['suite']
diff --git a/modules/project_plan/tests/test_project_plan.py b/modules/project_plan/tests/test_project_plan.py
new file mode 100644
index 0000000000..e0acc4d59c
--- /dev/null
+++ b/modules/project_plan/tests/test_project_plan.py
@@ -0,0 +1,19 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import unittest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import ModuleTestCase
+
+from trytond.modules.company.tests import CompanyTestMixin
+
+
+class ProjectPlanTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test ProjectPlan module'
+ module = 'project_plan'
+
+
+def suite():
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProjectPlanTestCase))
+ return suite
diff --git a/modules/project_plan/tox.ini b/modules/project_plan/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/project_plan/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/project_plan/tryton.cfg b/modules/project_plan/tryton.cfg
new file mode 100644
index 0000000000..7ee1be6b98
--- /dev/null
+++ b/modules/project_plan/tryton.cfg
@@ -0,0 +1,10 @@
+[tryton]
+version=6.0.1
+depends:
+ ir
+ company
+ project
+ timesheet
+xml:
+ work.xml
+ allocation.xml
diff --git a/modules/project_plan/view/allocation_form.xml b/modules/project_plan/view/allocation_form.xml
new file mode 100644
index 0000000000..96cec5ee50
--- /dev/null
+++ b/modules/project_plan/view/allocation_form.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/modules/project_plan/view/allocation_tree.xml b/modules/project_plan/view/allocation_tree.xml
new file mode 100644
index 0000000000..cebbab2468
--- /dev/null
+++ b/modules/project_plan/view/allocation_tree.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/project_plan/view/work_form.xml b/modules/project_plan/view/work_form.xml
new file mode 100644
index 0000000000..ed4cc3028e
--- /dev/null
+++ b/modules/project_plan/view/work_form.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/project_plan/work.py b/modules/project_plan/work.py
new file mode 100644
index 0000000000..61d3cc9a04
--- /dev/null
+++ b/modules/project_plan/work.py
@@ -0,0 +1,654 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import datetime
+from collections import deque, defaultdict
+from functools import reduce
+from heapq import heappop, heappush
+
+from trytond.model import ModelSQL, fields, tree
+from trytond.wizard import Wizard, StateTransition
+from trytond.pyson import Eval
+from trytond.pool import Pool, PoolMeta
+
+
+def intfloor(x):
+ return int(round(x, 4))
+
+
+class Work(tree(parent='successors'), metaclass=PoolMeta):
+ __name__ = 'project.work'
+ predecessors = fields.Many2Many('project.predecessor_successor',
+ 'successor', 'predecessor', 'Predecessors',
+ domain=[
+ ('parent', '=', Eval('parent')),
+ ('id', '!=', Eval('id')),
+ ],
+ depends=['parent', 'id'])
+ successors = fields.Many2Many('project.predecessor_successor',
+ 'predecessor', 'successor', 'Successors',
+ domain=[
+ ('parent', '=', Eval('parent')),
+ ('id', '!=', Eval('id')),
+ ],
+ depends=['parent', 'id'])
+ leveling_delay = fields.Float("Leveling Delay", required=True)
+ back_leveling_delay = fields.Float("Back Leveling Delay", required=True)
+ allocations = fields.One2Many('project.allocation', 'work', 'Allocations',
+ states={
+ 'invisible': Eval('type') != 'task',
+ }, depends=['type'])
+ duration = fields.Function(
+ fields.TimeDelta('Duration', 'company_work_time'),
+ 'get_function_fields')
+ early_start_time = fields.DateTime("Early Start Time", readonly=True)
+ late_start_time = fields.DateTime("Late Start Time", readonly=True)
+ early_finish_time = fields.DateTime("Early Finish Time", readonly=True)
+ late_finish_time = fields.DateTime("Late Finish Time", readonly=True)
+ actual_start_time = fields.DateTime("Actual Start Time")
+ actual_finish_time = fields.DateTime("Actual Finish Time")
+ constraint_start_time = fields.DateTime("Constraint Start Time")
+ constraint_finish_time = fields.DateTime("Constraint Finish Time")
+ early_start_date = fields.Function(fields.Date('Early Start'),
+ 'get_function_fields')
+ late_start_date = fields.Function(fields.Date('Late Start'),
+ 'get_function_fields')
+ early_finish_date = fields.Function(fields.Date('Early Finish'),
+ 'get_function_fields')
+ late_finish_date = fields.Function(fields.Date('Late Finish'),
+ 'get_function_fields')
+ actual_start_date = fields.Function(fields.Date('Actual Start'),
+ 'get_function_fields', setter='set_function_fields')
+ actual_finish_date = fields.Function(fields.Date('Actual Finish'),
+ 'get_function_fields', setter='set_function_fields')
+ constraint_start_date = fields.Function(fields.Date('Constraint Start',
+ depends=['type']), 'get_function_fields',
+ setter='set_function_fields')
+ constraint_finish_date = fields.Function(fields.Date('Constraint Finish',
+ depends=['type']), 'get_function_fields',
+ setter='set_function_fields')
+
+ @classmethod
+ def __setup__(cls):
+ super(Work, cls).__setup__()
+
+ @staticmethod
+ def default_leveling_delay():
+ return 0.0
+
+ @staticmethod
+ def default_back_leveling_delay():
+ return 0.0
+
+ @classmethod
+ def get_function_fields(cls, works, names):
+ '''
+ Function to compute function fields
+ '''
+ res = {}
+
+ ids = [w.id for w in works]
+ if 'duration' in names:
+ all_works = cls.search([
+ ('parent', 'child_of', ids),
+ ])
+ all_works = set(all_works)
+
+ durations = {}
+ id2work = {}
+ leafs = set()
+ for work in all_works:
+ id2work[work.id] = work
+ if not work.children:
+ leafs.add(work.id)
+
+ total_allocation = 0
+ effort = work.effort_duration or datetime.timedelta()
+ if not work.allocations:
+ durations[work.id] = effort
+ continue
+ for allocation in work.allocations:
+ total_allocation += allocation.percentage
+ durations[work.id] = datetime.timedelta(
+ seconds=effort.total_seconds()
+ / (total_allocation / 100.0))
+
+ while leafs:
+ for work_id in leafs:
+ work = id2work[work_id]
+ all_works.remove(work)
+ if work.parent and work.parent.id in durations:
+ durations[work.parent.id] += durations[work_id]
+ next_leafs = set(w.id for w in all_works)
+ for work in all_works:
+ if not work.parent:
+ continue
+ if work.parent.id in next_leafs and work.parent in works:
+ next_leafs.remove(work.parent.id)
+ leafs = next_leafs
+ res['duration'] = durations
+
+ fun_fields = ('early_start_date', 'early_finish_date',
+ 'late_start_date', 'late_finish_date',
+ 'actual_start_date', 'actual_finish_date',
+ 'constraint_start_date', 'constraint_finish_date')
+ db_fields = ('early_start_time', 'early_finish_time',
+ 'late_start_time', 'late_finish_time',
+ 'actual_start_time', 'actual_finish_time',
+ 'constraint_start_time', 'constraint_finish_time')
+
+ for fun_field, db_field in zip(fun_fields, db_fields):
+ if fun_field in names:
+ values = {}
+ for work in works:
+ values[work.id] = getattr(work, db_field) \
+ and getattr(work, db_field).date() or None
+ res[fun_field] = values
+
+ return res
+
+ @classmethod
+ def set_function_fields(cls, works, name, value):
+ fun_fields = ('actual_start_date', 'actual_finish_date',
+ 'constraint_start_date', 'constraint_finish_date')
+ db_fields = ('actual_start_time', 'actual_finish_time',
+ 'constraint_start_time', 'constraint_finish_time')
+ for fun_field, db_field in zip(fun_fields, db_fields):
+ if fun_field == name:
+ cls.write(works, {
+ db_field: (value
+ and datetime.datetime.combine(value,
+ datetime.time())
+ or None),
+ })
+ break
+
+ @property
+ def hours(self):
+ if not self.duration:
+ return 0
+ return self.duration.total_seconds() / 60 / 60
+
+ @classmethod
+ def add_minutes(cls, company, date, minutes):
+ minutes = int(round(minutes))
+ minutes = date.minute + minutes
+
+ hours = minutes // 60
+ if hours:
+ date = cls.add_hours(company, date, hours)
+
+ minutes = minutes % 60
+
+ date = datetime.datetime(
+ date.year,
+ date.month,
+ date.day,
+ date.hour,
+ minutes,
+ date.second)
+
+ return date
+
+ @classmethod
+ def add_hours(cls, company, date, hours):
+ while hours:
+ if hours != intfloor(hours):
+ minutes = (hours - intfloor(hours)) * 60
+ date = cls.add_minutes(company, date, minutes)
+ hours = intfloor(hours)
+
+ hours = date.hour + hours
+ days = hours // company.hours_per_work_day
+ if days:
+ date = cls.add_days(company, date, days)
+
+ hours = hours % company.hours_per_work_day
+
+ date = datetime.datetime(
+ date.year,
+ date.month,
+ date.day,
+ intfloor(hours),
+ date.minute,
+ date.second)
+
+ hours = hours - intfloor(hours)
+
+ return date
+
+ @classmethod
+ def add_days(cls, company, date, days):
+ day_per_week = company.hours_per_work_week / company.hours_per_work_day
+
+ while days:
+ if days != intfloor(days):
+ hours = (days - intfloor(days)) * company.hours_per_work_day
+ date = cls.add_hours(company, date, hours)
+ days = intfloor(days)
+
+ days = date.weekday() + days
+
+ weeks = days // day_per_week
+ days = days % day_per_week
+
+ if weeks:
+ date = cls.add_weeks(company, date, weeks)
+
+ date += datetime.timedelta(days=-date.weekday() + intfloor(days))
+
+ days = days - intfloor(days)
+
+ return date
+
+ @classmethod
+ def add_weeks(cls, company, date, weeks):
+ day_per_week = company.hours_per_work_week / company.hours_per_work_day
+
+ if weeks != intfloor(weeks):
+ days = (weeks - intfloor(weeks)) * day_per_week
+ if days:
+ date = cls.add_days(company, date, days)
+
+ date += datetime.timedelta(days=7 * intfloor(weeks))
+
+ return date
+
+ def compute_dates(self):
+ values = {}
+
+ def get_early_finish(work):
+ return values.get(work, {}).get(
+ 'early_finish_time', work.early_finish_time)
+
+ def get_late_start(work):
+ return values.get(work, {}).get(
+ 'late_start_time', work.late_start_time)
+
+ def maxdate(x, y):
+ return x and y and max(x, y) or x or y
+
+ def mindate(x, y):
+ return x and y and min(x, y) or x or y
+
+ # propagate constraint_start_time
+ constraint_start = reduce(maxdate, (pred.early_finish_time
+ for pred in self.predecessors), None)
+
+ if constraint_start is None and self.parent:
+ constraint_start = self.parent.early_start_time
+
+ constraint_start = maxdate(constraint_start,
+ self.constraint_start_time)
+
+ works = deque([(self, constraint_start)])
+ work2children = {}
+ parent = None
+
+ while works or parent:
+ if parent:
+ work = parent
+ parent = None
+
+ # Compute early_finish
+ if work.children:
+ early_finish_time = reduce(
+ maxdate, map(get_early_finish, work.children), None)
+ else:
+ early_finish_time = None
+ if values[work]['early_start_time']:
+ early_finish_time = self.add_hours(work.company,
+ values[work]['early_start_time'],
+ work.hours)
+ values[work]['early_finish_time'] = early_finish_time
+
+ # Propagate constraint_start on successors
+ for w in work.successors:
+ works.append((w, early_finish_time))
+
+ if not work.parent:
+ continue
+
+ # housecleaning work2children
+ if work.parent not in work2children:
+ work2children[work.parent] = set()
+ work2children[work.parent].update(work.successors)
+
+ if work in work2children[work.parent]:
+ work2children[work.parent].remove(work)
+
+ # if no sibling continue to walk up the tree
+ if not work2children.get(work.parent):
+ if work.parent not in values:
+ values[work.parent] = {}
+ parent = work.parent
+
+ continue
+
+ work, constraint_start = works.popleft()
+ # take constraint define on the work into account
+ constraint_start = maxdate(constraint_start,
+ work.constraint_start_time)
+
+ if constraint_start:
+ early_start = self.add_hours(work.company, constraint_start,
+ work.leveling_delay)
+ else:
+ early_start = None
+
+ # update values
+ if work not in values:
+ values[work] = {}
+ values[work]['early_start_time'] = early_start
+
+ # Loop on children if they exist
+ if work.children and work not in work2children:
+ work2children[work] = set(work.children)
+ # Propagate constraint_start on children
+ for w in work.children:
+ if w.predecessors:
+ continue
+ works.append((w, early_start))
+ else:
+ parent = work
+
+ # propagate constraint_finish_time
+ constraint_finish = reduce(mindate, (succ.late_start_time
+ for succ in self.successors), None)
+
+ if constraint_finish is None and self.parent:
+ constraint_finish = self.parent.late_finish_time
+
+ constraint_finish = mindate(constraint_finish,
+ self.constraint_finish_time)
+
+ works = deque([(self, constraint_finish)])
+ work2children = {}
+ parent = None
+
+ while works or parent:
+ if parent:
+ work = parent
+ parent = None
+
+ # Compute late_start
+ if work.children:
+ reduce(mindate, map(get_late_start, work.children), None)
+ else:
+ late_start_time = None
+ if values[work]['late_finish_time']:
+ late_start_time = self.add_hours(work.company,
+ values[work]['late_finish_time'],
+ -work.hours)
+ values[work]['late_start_time'] = late_start_time
+
+ # Propagate constraint_finish on predecessors
+ for w in work.predecessors:
+ works.append((w, late_start_time))
+
+ if not work.parent:
+ continue
+
+ # housecleaning work2children
+ if work.parent not in work2children:
+ work2children[work.parent] = set()
+ work2children[work.parent].update(work.predecessors)
+
+ if work in work2children[work.parent]:
+ work2children[work.parent].remove(work)
+
+ # if no sibling continue to walk up the tree
+ if not work2children.get(work.parent):
+ if work.parent not in values:
+ values[work.parent] = {}
+ parent = work.parent
+
+ continue
+
+ work, constraint_finish = works.popleft()
+ # take constraint define on the work into account
+ constraint_finish = mindate(constraint_finish,
+ work.constraint_finish_time)
+
+ if constraint_finish:
+ late_finish = self.add_hours(work.company, constraint_finish,
+ -work.back_leveling_delay)
+ else:
+ late_finish = None
+
+ # update values
+ if work not in values:
+ values[work] = {}
+ values[work]['late_finish_time'] = late_finish
+
+ # Loop on children if they exist
+ if work.children and work not in work2children:
+ work2children[work] = set(work.children)
+ # Propagate constraint_start on children
+ for w in work.children:
+ if w.successors:
+ continue
+ works.append((w, late_finish))
+ else:
+ parent = work
+
+ # write values
+ write_fields = ('early_start_time', 'early_finish_time',
+ 'late_start_time', 'late_finish_time')
+ to_write = []
+ for work, val in values.items():
+ write_cond = False
+ for field in write_fields:
+ if field in val and getattr(work, field) != val[field]:
+ write_cond = True
+ break
+
+ if write_cond:
+ to_write.extend(([work], val))
+ if to_write:
+ self.write(*to_write)
+
+ def reset_leveling(self):
+ def get_key(w):
+ return (
+ set(p.id for p in w.predecessors),
+ set(s.id for s in w.successors))
+
+ if not self.parent:
+ return
+ siblings = self.search([
+ ('parent', '=', self.parent.id)
+ ])
+ to_clean = []
+
+ ref_key = get_key(self)
+ for sibling in siblings:
+ if sibling.leveling_delay == sibling.back_leveling_delay == 0:
+ continue
+ if get_key(sibling) == ref_key:
+ to_clean.append(sibling)
+
+ if to_clean:
+ self.write(to_clean, {
+ 'leveling_delay': 0,
+ 'back_leveling_delay': 0,
+ })
+
+ def create_leveling(self):
+ # define some helper functions
+ def get_key(w):
+ return (
+ set(p.id for p in w.predecessors),
+ set(s.id for s in w.successors))
+
+ def over_alloc(current_alloc, work):
+ return reduce(lambda res, alloc: (
+ res
+ or (current_alloc[alloc.employee.id]
+ + alloc.percentage) > 100),
+ work.allocations,
+ False)
+
+ def sum_allocs(current_alloc, work):
+ res = defaultdict(float)
+ for alloc in work.allocations:
+ empl = alloc.employee.id
+ res[empl] = current_alloc[empl] + alloc.percentage
+ return res
+
+ def compute_delays(siblings):
+ # time_line is a list [[end_delay, allocations], ...], this
+ # mean that allocations is valid between the preceding end_delay
+ # (or 0 if it doesn't exist) and the current end_delay.
+ timeline = []
+ for sibling in siblings:
+ delay = 0
+ ignored = []
+ overloaded = []
+ item = None
+
+ while timeline:
+ # item is [end_delay, allocations]
+ item = heappop(timeline)
+ if over_alloc(item[1], sibling):
+ ignored.extend(overloaded)
+ ignored.append(item)
+ delay = item[0]
+ continue
+ elif item[1] >= delay + sibling.duration:
+ overloaded.append(item)
+ else:
+ # Succes!
+ break
+
+ heappush(timeline,
+ [delay + sibling.duration,
+ sum_allocs(defaultdict(float), sibling),
+ sibling.id])
+
+ for i in ignored:
+ heappush(timeline, i)
+ for i in overloaded:
+ i[1] = sum_allocs(i[1], sibling)
+ heappush(timeline, i)
+
+ yield sibling, delay
+
+ siblings = self.search([
+ ('parent', '=', self.parent.id if self.parent else None)
+ ])
+
+ refkey = get_key(self)
+ siblings = [s for s in siblings if get_key(s) == refkey]
+
+ for sibling, delay in compute_delays(siblings):
+ sibling.leveling_delay = delay
+
+ siblings.reverse()
+ for sibling, delay in compute_delays(siblings):
+ sibling.back_leveling_delay = delay
+ self.__class__.save(siblings)
+
+ if self.parent:
+ self.parent.compute_dates()
+
+ @classmethod
+ def write(cls, *args):
+ super(Work, cls).write(*args)
+
+ actions = iter(args)
+ for works, values in zip(actions, actions):
+ if 'effort' in values:
+ for work in works:
+ work.reset_leveling()
+ fields = ('constraint_start_time', 'constraint_finish_time',
+ 'effort')
+ if reduce(lambda x, y: x or y in values, fields, False):
+ for work in works:
+ work.compute_dates()
+
+ @classmethod
+ def create(cls, vlist):
+ works = super(Work, cls).create(vlist)
+ for work in works:
+ work.reset_leveling()
+ work.compute_dates()
+ return works
+
+ @classmethod
+ def delete(cls, works):
+ to_update = set()
+ for work in works:
+ if work.parent and work.parent not in works:
+ to_update.add(work.parent)
+ to_update.update(c for c in work.parent.children
+ if c not in works)
+ super(Work, cls).delete(works)
+
+ for work in to_update:
+ work.reset_leveling()
+ work.compute_dates()
+
+
+class PredecessorSuccessor(ModelSQL):
+ 'Predecessor - Successor'
+ __name__ = 'project.predecessor_successor'
+ predecessor = fields.Many2One('project.work', 'Predecessor',
+ ondelete='CASCADE', required=True, select=True)
+ successor = fields.Many2One('project.work', 'Successor',
+ ondelete='CASCADE', required=True, select=True)
+
+ @classmethod
+ def write(cls, *args):
+ Work = Pool().get('project.work')
+ super(PredecessorSuccessor, cls).write(*args)
+
+ work_ids = [v for values in args[1::2]
+ for k, v in values.values()
+ if k in ('predecessor', 'successor')]
+ works = Work.browse(work_ids)
+ for work in works:
+ work.reset_leveling()
+ for work in works:
+ work.compute_dates()
+
+ @classmethod
+ def delete(cls, pred_succs):
+ works = set()
+ parents = set()
+ for pred_succ in pred_succs:
+ works.update((pred_succ.predecessor,
+ pred_succ.successor))
+
+ if pred_succ.predecessor.parent:
+ parents.add(pred_succ.predecessor.parent)
+
+ super(PredecessorSuccessor, cls).delete(pred_succs)
+
+ for work in works:
+ work.reset_leveling()
+
+ for parent in parents:
+ parent.compute_dates()
+
+ @classmethod
+ def create(cls, vlist):
+ pred_succs = super(PredecessorSuccessor, cls).create(vlist)
+
+ for pred_succ in pred_succs:
+ pred_succ.predecessor.reset_leveling()
+ pred_succ.successor.reset_leveling()
+
+ if pred_succ.predecessor.parent:
+ pred_succ.predecessor.parent.compute_dates()
+ return pred_succs
+
+
+class Leveling(Wizard):
+ 'Tasks Leveling'
+ __name__ = 'project_plan.work.leveling'
+ start_state = 'leveling'
+ leveling = StateTransition()
+
+ def transition_leveling(self):
+ self.record.create_leveling()
+ return 'end'
diff --git a/modules/project_plan/work.xml b/modules/project_plan/work.xml
new file mode 100644
index 0000000000..b297ec65ef
--- /dev/null
+++ b/modules/project_plan/work.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ project.work
+
+ work_form
+
+
+
+ Tasks Leveling
+ project_plan.work.leveling
+ project.work
+
+
+ form_action
+ project.work,-1
+
+
+
+
+
diff --git a/modules/project_revenue/.drone.yml b/modules/project_revenue/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/project_revenue/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/project_revenue/.flake8 b/modules/project_revenue/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/project_revenue/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/project_revenue/CHANGELOG b/modules/project_revenue/CHANGELOG
new file mode 100644
index 0000000000..b4fa6f1fa7
--- /dev/null
+++ b/modules/project_revenue/CHANGELOG
@@ -0,0 +1,81 @@
+Version 6.0.1 - 2022-07-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+* Allow non-time based products on work
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+
+Version 4.0.0 - 2016-05-02
+* Bug fixes (see mercurial logs for details)
+* Add Python3 support
+
+Version 3.8.0 - 2015-11-02
+* Bug fixes (see mercurial logs for details)
+* Use product price_decimal for list price
+* Include linked purchase to cost
+
+Version 3.6.0 - 2015-04-20
+* Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+
+Version 3.4.0 - 2014-10-20
+* Bug fixes (see mercurial logs for details)
+
+Version 3.2.0 - 2014-04-21
+* Bug fixes (see mercurial logs for details)
+
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+
+Version 2.8.0 - 2013-04-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.6.0 - 2012-10-22
+* Bug fixes (see mercurial logs for details)
+
+Version 2.4.0 - 2012-04-24
+* Bug fixes (see mercurial logs for details)
+
+Version 2.2.0 - 2011-10-25
+* Bug fixes (see mercurial logs for details)
+
+Version 2.0.0 - 2011-04-27
+* Bug fixes (see mercurial logs for details)
+
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
+Version 1.6.0 - 2010-05-13
+* Bug fixes (see mercurial logs for details)
+
+Version 1.4.0 - 2009-10-19
+* Initial release
diff --git a/modules/project_revenue/COPYRIGHT b/modules/project_revenue/COPYRIGHT
new file mode 100644
index 0000000000..d3964e68a4
--- /dev/null
+++ b/modules/project_revenue/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2008-2022 Cédric Krier.
+Copyright (C) 2008-2022 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/project_revenue/LICENSE b/modules/project_revenue/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/project_revenue/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/project_revenue/MANIFEST.in b/modules/project_revenue/MANIFEST.in
new file mode 100644
index 0000000000..e88b2348a3
--- /dev/null
+++ b/modules/project_revenue/MANIFEST.in
@@ -0,0 +1,5 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
diff --git a/modules/project_revenue/README.rst b/modules/project_revenue/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/project_revenue/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/project_revenue/__init__.py b/modules/project_revenue/__init__.py
new file mode 100644
index 0000000000..963296f750
--- /dev/null
+++ b/modules/project_revenue/__init__.py
@@ -0,0 +1,16 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import work
+from . import purchase
+
+
+def register():
+ Pool.register(
+ work.Work,
+ module='project_revenue', type_='model')
+ Pool.register(
+ purchase.Line,
+ module='project_revenue', type_='model',
+ depends=['purchase'])
diff --git a/modules/project_revenue/doc/index.rst b/modules/project_revenue/doc/index.rst
new file mode 100644
index 0000000000..05e3fac98c
--- /dev/null
+++ b/modules/project_revenue/doc/index.rst
@@ -0,0 +1,9 @@
+Project Revenue Module
+######################
+
+The project revenue module computes revenue and cost per task and project.
+The revenue uses the list price of the product. If the product's unit of
+measure is time based, the revenue is computed as the product of the price and
+the hours of effort otherwise the price is considered as fixed.
+The cost is computed by summing the cost of all the linked time sheets and the
+linked purchase lines.
diff --git a/modules/project_revenue/locale/bg.po b/modules/project_revenue/locale/bg.po
new file mode 100644
index 0000000000..66ef8ad0b8
--- /dev/null
+++ b/modules/project_revenue/locale/bg.po
@@ -0,0 +1,50 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Разход"
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Цифри за валута"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Цифри за валута"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Каталожна цена"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Приход"
+
+#, fuzzy
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Дейност"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Покупки"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/locale/ca.po b/modules/project_revenue/locale/ca.po
new file mode 100644
index 0000000000..8b8020910b
--- /dev/null
+++ b/modules/project_revenue/locale/ca.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Decimals de la moneda"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Preu de llista"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Línies de compra"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Ingressos"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Temps del treball"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr "Afegiu al cost del Projecte/Tasca."
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "Projecte"
diff --git a/modules/project_revenue/locale/cs.po b/modules/project_revenue/locale/cs.po
new file mode 100644
index 0000000000..87505200ed
--- /dev/null
+++ b/modules/project_revenue/locale/cs.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/locale/de.po b/modules/project_revenue/locale/de.po
new file mode 100644
index 0000000000..1126189204
--- /dev/null
+++ b/modules/project_revenue/locale/de.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Nachkommastellen Währung"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Listenpreis"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Einkaufspositionen"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Ertrag"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Aufgabe Aufwand"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr "Zu den Kosten des Arbeitsaufwands hinzufügen."
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "Projekt"
diff --git a/modules/project_revenue/locale/es.po b/modules/project_revenue/locale/es.po
new file mode 100644
index 0000000000..55f196913e
--- /dev/null
+++ b/modules/project_revenue/locale/es.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Coste"
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Decimales de la moneda"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Precio de venta"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Líneas de compra"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Ingresos"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Tiempo del trabajo"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr "Añade al coste del Proyecto/Tarea."
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "Proyecto"
diff --git a/modules/project_revenue/locale/es_419.po b/modules/project_revenue/locale/es_419.po
new file mode 100644
index 0000000000..12d93e0a3a
--- /dev/null
+++ b/modules/project_revenue/locale/es_419.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Costo"
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Esfuerzo de trabajo"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/locale/et.po b/modules/project_revenue/locale/et.po
new file mode 100644
index 0000000000..31ab631600
--- /dev/null
+++ b/modules/project_revenue/locale/et.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Kulu"
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Valuuta numbriline arv"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Valuuta numbriline arv"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Müügihind"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Ostu read"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Müügitulu"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Pingutus"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr "Lisa pingutuse kulule."
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Ostud"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "Projekt"
diff --git a/modules/project_revenue/locale/fa.po b/modules/project_revenue/locale/fa.po
new file mode 100644
index 0000000000..36969fce1d
--- /dev/null
+++ b/modules/project_revenue/locale/fa.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "هزینه"
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "رقم های واحد پول"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "رقم های واحد پول"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "لیست قیمت"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "خطوط خرید"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "درآمد"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "تلاش کار"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr "اضافه کردن هزینه تلاش کار."
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "خریدها"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "پروژه"
diff --git a/modules/project_revenue/locale/fi.po b/modules/project_revenue/locale/fi.po
new file mode 100644
index 0000000000..87505200ed
--- /dev/null
+++ b/modules/project_revenue/locale/fi.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/locale/fr.po b/modules/project_revenue/locale/fr.po
new file mode 100644
index 0000000000..eb7288d01e
--- /dev/null
+++ b/modules/project_revenue/locale/fr.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Coût"
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Décimales de la devise"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Prix Listé"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Lignes d'achat"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Revenu"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Effort de travail"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr "Ajouter au coût de l'effort de travail."
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "Projet"
diff --git a/modules/project_revenue/locale/hu.po b/modules/project_revenue/locale/hu.po
new file mode 100644
index 0000000000..fc92d36a07
--- /dev/null
+++ b/modules/project_revenue/locale/hu.po
@@ -0,0 +1,50 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Költség"
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Árlista szerinti ár"
+
+#, fuzzy
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/locale/id.po b/modules/project_revenue/locale/id.po
new file mode 100644
index 0000000000..c2e78a877b
--- /dev/null
+++ b/modules/project_revenue/locale/id.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Pendapatan"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/locale/it.po b/modules/project_revenue/locale/it.po
new file mode 100644
index 0000000000..d140a45165
--- /dev/null
+++ b/modules/project_revenue/locale/it.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Costo"
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Cifre valuta"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Cifre valuta"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Listino prezzi"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Linee di acquisto"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Ricavi"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Acquisti"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "Progetto"
diff --git a/modules/project_revenue/locale/lo.po b/modules/project_revenue/locale/lo.po
new file mode 100644
index 0000000000..68ce8e8b7d
--- /dev/null
+++ b/modules/project_revenue/locale/lo.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "ລາຄາ"
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "ເລກເສດສະກຸນເງິນ"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "ເລກເສດສະກຸນເງິນ"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "ລາຍການລາຄາ"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "ລາຍການສັ່ງຊື້"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "ລາຍຮັບ"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "ວຽກສູ້ຊົນ"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "ການຈັດຊື້"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "ໂຄງການ"
diff --git a/modules/project_revenue/locale/lt.po b/modules/project_revenue/locale/lt.po
new file mode 100644
index 0000000000..66949172c7
--- /dev/null
+++ b/modules/project_revenue/locale/lt.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Valiutos skaitmenų skaičius"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Valiutos skaitmenų skaičius"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/locale/nl.po b/modules/project_revenue/locale/nl.po
new file mode 100644
index 0000000000..2d73c41879
--- /dev/null
+++ b/modules/project_revenue/locale/nl.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Valuta decimalen"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Catalogusprijs"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "aankooplijnen"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Opbrengst/omzet?"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Arbeidsinspanning"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr "Voeg toe aan de kosten van de werkinspanning."
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Aankopen"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "Project"
diff --git a/modules/project_revenue/locale/pl.po b/modules/project_revenue/locale/pl.po
new file mode 100644
index 0000000000..533b0be029
--- /dev/null
+++ b/modules/project_revenue/locale/pl.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Koszt"
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Cyfry waluty"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Cyfry waluty"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Cena sprzedaży"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Wiersze zakupu"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Przychód"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Zakupy"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "Projekt"
diff --git a/modules/project_revenue/locale/pt.po b/modules/project_revenue/locale/pt.po
new file mode 100644
index 0000000000..61700de92b
--- /dev/null
+++ b/modules/project_revenue/locale/pt.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Custo"
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Dígitos da Moeda"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Dígitos da Moeda"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Preço de Lista"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Linhas de compra"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Receita"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Esforço de trabalho"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr "Adiciona ao custo do trabalho."
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "Projeto"
diff --git a/modules/project_revenue/locale/ro.po b/modules/project_revenue/locale/ro.po
new file mode 100644
index 0000000000..62ce989f50
--- /dev/null
+++ b/modules/project_revenue/locale/ro.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Zecimale valută"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Zecimale valută"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Lista de preturi"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/locale/ru.po b/modules/project_revenue/locale/ru.po
new file mode 100644
index 0000000000..c7a0e7d158
--- /dev/null
+++ b/modules/project_revenue/locale/ru.po
@@ -0,0 +1,50 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Стоимость"
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Кол-во цифр валюты"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Кол-во цифр валюты"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Цена"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Доходы"
+
+#, fuzzy
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Рабочие затраты"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Покупки"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/locale/sl.po b/modules/project_revenue/locale/sl.po
new file mode 100644
index 0000000000..5093db53f1
--- /dev/null
+++ b/modules/project_revenue/locale/sl.po
@@ -0,0 +1,48 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr "Strošek"
+
+#, fuzzy
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr "Decimalke"
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr "Decimalke"
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr "Prodajna cena"
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr "Nabavne postavke"
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr "Prihodki"
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr "Ocena naloge"
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr "Nabavni nalogi"
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr "Projekt"
diff --git a/modules/project_revenue/locale/tr.po b/modules/project_revenue/locale/tr.po
new file mode 100644
index 0000000000..87505200ed
--- /dev/null
+++ b/modules/project_revenue/locale/tr.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/locale/zh_CN.po b/modules/project_revenue/locale/zh_CN.po
new file mode 100644
index 0000000000..87505200ed
--- /dev/null
+++ b/modules/project_revenue/locale/zh_CN.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:project.work,cost:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "field:project.work,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:project.work,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:project.work,list_price:"
+msgid "List Price"
+msgstr ""
+
+msgctxt "field:project.work,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:project.work,purchase_lines:"
+msgid "Purchase Lines"
+msgstr ""
+
+msgctxt "field:project.work,revenue:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "field:purchase.line,work:"
+msgid "Work Effort"
+msgstr ""
+
+msgctxt "help:purchase.line,work:"
+msgid "Add to the cost of the work effort."
+msgstr ""
+
+msgctxt "view:project.work:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Project"
+msgstr ""
diff --git a/modules/project_revenue/purchase.py b/modules/project_revenue/purchase.py
new file mode 100644
index 0000000000..1699602478
--- /dev/null
+++ b/modules/project_revenue/purchase.py
@@ -0,0 +1,19 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.pool import PoolMeta
+from trytond.model import fields
+from trytond.pyson import Eval
+
+
+class Line(metaclass=PoolMeta):
+ __name__ = 'purchase.line'
+
+ work = fields.Many2One('project.work', 'Work Effort', select=True,
+ domain=[
+ ('company', '=', Eval('_parent_purchase', {}).get('company', -1)),
+ ],
+ states={
+ 'invisible': Eval('type') != 'line',
+ },
+ depends=['type'],
+ help="Add to the cost of the work effort.")
diff --git a/modules/project_revenue/purchase.xml b/modules/project_revenue/purchase.xml
new file mode 100644
index 0000000000..fb6612fb46
--- /dev/null
+++ b/modules/project_revenue/purchase.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ purchase.line
+
+ purchase_line_form
+
+
+
diff --git a/modules/project_revenue/setup.py b/modules/project_revenue/setup.py
new file mode 100755
index 0000000000..45ac357638
--- /dev/null
+++ b/modules/project_revenue/setup.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python3
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+import io
+import os
+import re
+from configparser import ConfigParser
+from setuptools import setup, find_packages
+
+
+def read(fname):
+ return io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+
+
+def get_require_version(name):
+ if minor_version % 2:
+ require = '%s >= %s.%s.dev0, < %s.%s'
+ else:
+ require = '%s >= %s.%s, < %s.%s'
+ require %= (name, major_version, minor_version,
+ major_version, minor_version + 1)
+ return require
+
+
+config = ConfigParser()
+config.read_file(open(os.path.join(os.path.dirname(__file__), 'tryton.cfg')))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+ if key in info:
+ info[key] = info[key].strip().splitlines()
+version = info.get('version', '0.0.1')
+major_version, minor_version, _ = version.split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
+name = 'trytond_project_revenue'
+
+download_url = 'http://downloads.tryton.org/%s.%s/' % (
+ major_version, minor_version)
+if minor_version % 2:
+ version = '%s.%s.dev0' % (major_version, minor_version)
+ download_url = (
+ 'hg+http://hg.tryton.org/modules/%s#egg=%s-%s' % (
+ name[8:], name, version))
+local_version = []
+if os.environ.get('CI_JOB_ID'):
+ local_version.append(os.environ['CI_JOB_ID'])
+else:
+ for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:
+ if os.environ.get(build):
+ local_version.append(os.environ[build])
+ else:
+ local_version = []
+ break
+if local_version:
+ version += '+' + '.'.join(local_version)
+
+requires = ['python-sql']
+for dep in info.get('depends', []):
+ if not re.match(r'(ir|res)(\W|$)', dep):
+ requires.append(get_require_version('trytond_%s' % dep))
+requires.append(get_require_version('trytond'))
+
+tests_require = [get_require_version('proteus'),
+ get_require_version('trytond_purchase')]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='Tryton module to add revenue on project',
+ long_description=read('README.rst'),
+ author='Tryton',
+ author_email='bugs@tryton.org',
+ url='http://www.tryton.org/',
+ download_url=download_url,
+ project_urls={
+ "Bug Tracker": 'https://bugs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/project_revenue',
+ },
+ keywords='tryton project revenue',
+ package_dir={'trytond.modules.project_revenue': '.'},
+ packages=(
+ ['trytond.modules.project_revenue']
+ + ['trytond.modules.project_revenue.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.project_revenue': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', 'tests/*.rst']),
+ },
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Plugins',
+ 'Framework :: Tryton',
+ 'Intended Audience :: Developers',
+ 'Intended Audience :: Financial and Insurance Industry',
+ 'Intended Audience :: Legal Industry',
+ 'Intended Audience :: Manufacturing',
+ 'License :: OSI Approved :: '
+ 'GNU General Public License v3 or later (GPLv3+)',
+ 'Natural Language :: Bulgarian',
+ 'Natural Language :: Catalan',
+ 'Natural Language :: Chinese (Simplified)',
+ 'Natural Language :: Czech',
+ 'Natural Language :: Dutch',
+ 'Natural Language :: English',
+ 'Natural Language :: Finnish',
+ 'Natural Language :: French',
+ 'Natural Language :: German',
+ 'Natural Language :: Hungarian',
+ 'Natural Language :: Indonesian',
+ 'Natural Language :: Italian',
+ 'Natural Language :: Persian',
+ 'Natural Language :: Polish',
+ 'Natural Language :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.6',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ project_revenue = trytond.modules.project_revenue
+ """,
+ test_suite='tests',
+ test_loader='trytond.test_loader:Loader',
+ tests_require=tests_require,
+ )
diff --git a/modules/project_revenue/tests/__init__.py b/modules/project_revenue/tests/__init__.py
new file mode 100644
index 0000000000..037a995a67
--- /dev/null
+++ b/modules/project_revenue/tests/__init__.py
@@ -0,0 +1,9 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+try:
+ from trytond.modules.project_revenue.tests.test_project_revenue import suite # noqa: E501
+except ImportError:
+ from .test_project_revenue import suite
+
+__all__ = ['suite']
diff --git a/modules/project_revenue/tests/scenario_project_revenue.rst b/modules/project_revenue/tests/scenario_project_revenue.rst
new file mode 100644
index 0000000000..f02dbda26b
--- /dev/null
+++ b/modules/project_revenue/tests/scenario_project_revenue.rst
@@ -0,0 +1,139 @@
+========================
+Project Revenue Scenario
+========================
+
+Imports::
+
+ >>> import datetime
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules, set_user
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+
+Activate modules::
+
+ >>> config = activate_modules('project_revenue')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create employee::
+
+ >>> Employee = Model.get('company.employee')
+ >>> employee = Employee()
+ >>> party = Party(name='Employee')
+ >>> party.save()
+ >>> employee.party = party
+ >>> employee.company = company
+ >>> _ = employee.cost_prices.new(cost_price=Decimal('10.00'))
+ >>> employee.save()
+ >>> employee.cost_price
+ Decimal('10.00')
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> hour, = ProductUom.find([('name', '=', 'Hour')])
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Service'
+ >>> template.default_uom = hour
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('20')
+ >>> template.save()
+ >>> product, = template.products
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Service'
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('80')
+ >>> template.save()
+ >>> package, = template.products
+
+Create a Project::
+
+ >>> Project = Model.get('project.work')
+ >>> project = Project()
+ >>> project.name = 'Test effort'
+ >>> project.type = 'project'
+ >>> project.party = customer
+ >>> project.timesheet_available = True
+ >>> project.product = product
+ >>> project.list_price
+ Decimal('20.0000')
+ >>> project.effort_duration = datetime.timedelta(hours=1)
+ >>> task = project.children.new()
+ >>> task.name = 'Task 1'
+ >>> task.type = 'task'
+ >>> task.timesheet_available = True
+ >>> task.product = product
+ >>> task.list_price
+ Decimal('20.0000')
+ >>> task.effort_duration = datetime.timedelta(hours=5)
+ >>> task_no_effort = project.children.new()
+ >>> task_no_effort.name = "Task 2"
+ >>> task_no_effort.type = 'task'
+ >>> task_no_effort.effort_duration = None
+ >>> task_no_effort.product = package
+ >>> task_no_effort.list_price
+ Decimal('80.0000')
+ >>> project.save()
+ >>> task, task_no_effort = project.children
+
+Check project revenue and cost::
+
+ >>> project.revenue
+ Decimal('200.00')
+ >>> task.revenue
+ Decimal('100.00')
+ >>> task_no_effort.revenue
+ Decimal('80.00')
+ >>> project.cost
+ Decimal('0.00')
+ >>> task.cost
+ Decimal('0.00')
+ >>> task_no_effort.cost
+ Decimal('0.00')
+
+Create timesheets::
+
+ >>> TimesheetLine = Model.get('timesheet.line')
+ >>> line = TimesheetLine()
+ >>> line.employee = employee
+ >>> line.duration = datetime.timedelta(hours=3)
+ >>> line.work, = task.timesheet_works
+ >>> line.save()
+ >>> line = TimesheetLine()
+ >>> line.employee = employee
+ >>> line.duration = datetime.timedelta(hours=2)
+ >>> line.work, = project.timesheet_works
+ >>> line.save()
+
+Cost should take in account timesheet lines::
+
+ >>> project.reload()
+ >>> task, task_no_effort = project.children
+ >>> project.revenue
+ Decimal('200.00')
+ >>> task.revenue
+ Decimal('100.00')
+ >>> task_no_effort.revenue
+ Decimal('80.00')
+ >>> project.cost
+ Decimal('50.00')
+ >>> task.cost
+ Decimal('30.00')
+ >>> task_no_effort.cost
+ Decimal('0.00')
diff --git a/modules/project_revenue/tests/test_project_revenue.py b/modules/project_revenue/tests/test_project_revenue.py
new file mode 100644
index 0000000000..cf80485d1f
--- /dev/null
+++ b/modules/project_revenue/tests/test_project_revenue.py
@@ -0,0 +1,28 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+import unittest
+import doctest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import ModuleTestCase
+from trytond.tests.test_tryton import doctest_teardown
+from trytond.tests.test_tryton import doctest_checker
+
+from trytond.modules.company.tests import CompanyTestMixin
+
+
+class ProjectRevenueTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test ProjectRevenue module'
+ module = 'project_revenue'
+ extras = ['purchase']
+
+
+def suite():
+ suite = trytond.tests.test_tryton.suite()
+ suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+ ProjectRevenueTestCase))
+ suite.addTests(doctest.DocFileSuite(
+ 'scenario_project_revenue.rst',
+ tearDown=doctest_teardown, encoding='utf-8',
+ checker=doctest_checker,
+ optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
+ return suite
diff --git a/modules/project_revenue/tox.ini b/modules/project_revenue/tox.ini
new file mode 100644
index 0000000000..197496c0cb
--- /dev/null
+++ b/modules/project_revenue/tox.ini
@@ -0,0 +1,15 @@
+[tox]
+envlist = {py36,py37,py38,py39}-{sqlite,postgresql},pypy3-{sqlite,postgresql}
+
+[testenv]
+commands = {envpython} setup.py test
+deps =
+ {py36,py37,py38,py39}-postgresql: psycopg2 >= 2.5
+ pypy3-postgresql: psycopg2cffi >= 2.5
+ py36-sqlite: sqlitebck
+setenv =
+ sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}
+ postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}
+ sqlite: DB_NAME={env:SQLITE_NAME::memory:}
+ postgresql: DB_NAME={env:POSTGRESQL_NAME:test}
+install_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER}.{env:CI_JOB_NUMBER}} {opts} {packages}
diff --git a/modules/project_revenue/tryton.cfg b/modules/project_revenue/tryton.cfg
new file mode 100644
index 0000000000..1b794e4212
--- /dev/null
+++ b/modules/project_revenue/tryton.cfg
@@ -0,0 +1,14 @@
+[tryton]
+version=6.0.2
+depends:
+ ir
+ project
+ timesheet
+ timesheet_cost
+ company
+ product
+extras_depend:
+ purchase
+xml:
+ work.xml
+ purchase.xml
diff --git a/modules/project_revenue/view/purchase_line_form.xml b/modules/project_revenue/view/purchase_line_form.xml
new file mode 100644
index 0000000000..a612efa0ac
--- /dev/null
+++ b/modules/project_revenue/view/purchase_line_form.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/project_revenue/view/work_form.xml b/modules/project_revenue/view/work_form.xml
new file mode 100644
index 0000000000..6b70ad0a46
--- /dev/null
+++ b/modules/project_revenue/view/work_form.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/project_revenue/view/work_form_purchase.xml b/modules/project_revenue/view/work_form_purchase.xml
new file mode 100644
index 0000000000..177893586e
--- /dev/null
+++ b/modules/project_revenue/view/work_form_purchase.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/project_revenue/view/work_list.xml b/modules/project_revenue/view/work_list.xml
new file mode 100644
index 0000000000..af98395d6b
--- /dev/null
+++ b/modules/project_revenue/view/work_list.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/project_revenue/view/work_list_children.xml b/modules/project_revenue/view/work_list_children.xml
new file mode 100644
index 0000000000..830bc6e13b
--- /dev/null
+++ b/modules/project_revenue/view/work_list_children.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/project_revenue/view/work_tree.xml b/modules/project_revenue/view/work_tree.xml
new file mode 100644
index 0000000000..af98395d6b
--- /dev/null
+++ b/modules/project_revenue/view/work_tree.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/project_revenue/work.py b/modules/project_revenue/work.py
new file mode 100644
index 0000000000..b2e34e0e58
--- /dev/null
+++ b/modules/project_revenue/work.py
@@ -0,0 +1,239 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from decimal import Decimal
+from collections import defaultdict
+
+from sql.aggregate import Sum
+from sql.operators import Concat
+
+from trytond.model import fields
+from trytond.pyson import Eval
+from trytond.transaction import Transaction
+from trytond.pool import Pool, PoolMeta
+from trytond.tools import reduce_ids, grouped_slice
+
+from trytond.modules.product import price_digits, round_price
+
+
+class Work(metaclass=PoolMeta):
+ __name__ = 'project.work'
+ product = fields.Many2One('product.product', 'Product',
+ domain=[
+ ('type', '=', 'service'),
+ ],
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends=['company'])
+ list_price = fields.Numeric('List Price', digits=price_digits)
+ revenue = fields.Function(fields.Numeric('Revenue',
+ digits=(16, Eval('currency_digits', 2)),
+ depends=['currency_digits']), 'get_total')
+ cost = fields.Function(fields.Numeric('Cost',
+ digits=(16, Eval('currency_digits', 2)),
+ depends=['currency_digits']), 'get_total')
+ currency = fields.Function(fields.Many2One('currency.currency',
+ 'Currency'), 'on_change_with_currency')
+ currency_digits = fields.Function(fields.Integer('Currency Digits'),
+ 'on_change_with_currency_digits')
+
+ @classmethod
+ def __setup__(cls):
+ pool = Pool()
+
+ super(Work, cls).__setup__()
+
+ try:
+ pool.get('purchase.line')
+ except KeyError:
+ pass
+ else:
+ # Add purchase lines if purchase is activated
+ cls.purchase_lines = fields.One2Many('purchase.line', 'work',
+ 'Purchase Lines', domain=[
+ ('purchase.company', '=', Eval('company', -1)),
+ ('type', '=', 'line'),
+ ],
+ depends=['company'])
+
+ @classmethod
+ def _get_cost(cls, works):
+ pool = Pool()
+ Line = pool.get('timesheet.line')
+ Work = pool.get('timesheet.work')
+ transaction = Transaction()
+ cursor = transaction.connection.cursor()
+
+ costs = dict.fromkeys([w.id for w in works], 0)
+
+ table = cls.__table__()
+ work = Work.__table__()
+ line = Line.__table__()
+
+ # Timesheet cost
+ work_ids = [w.id for w in works]
+ for sub_ids in grouped_slice(work_ids):
+ red_sql = reduce_ids(table.id, sub_ids)
+ cursor.execute(*table.join(work,
+ condition=(
+ Concat(cls.__name__ + ',', table.id) == work.origin)
+ ).join(line, condition=line.work == work.id
+ ).select(table.id, Sum(line.cost_price * line.duration),
+ where=red_sql,
+ group_by=[table.id]))
+ for work_id, cost in cursor:
+ # SQLite stores timedelta as float
+ if not isinstance(cost, float):
+ cost = cost.total_seconds()
+ # Convert from seconds
+ cost /= 60 * 60
+ costs[work_id] += Decimal(str(cost))
+
+ # Purchase cost
+ if hasattr(cls, 'purchase_lines'):
+ for work_id, cost in cls._purchase_cost(works).items():
+ costs[work_id] += cost
+
+ for work in works:
+ costs[work.id] = work.company.currency.round(costs[work.id])
+ return costs
+
+ @classmethod
+ def _purchase_cost(cls, works):
+ 'Compute direct purchase cost'
+ pool = Pool()
+ Currency = pool.get('currency.currency')
+ PurchaseLine = pool.get('purchase.line')
+ InvoiceLine = pool.get('account.invoice.line')
+ Invoice = pool.get('account.invoice')
+ Company = pool.get('company.company')
+
+ cursor = Transaction().connection.cursor()
+ table = cls.__table__()
+ purchase_line = PurchaseLine.__table__()
+ invoice_line = InvoiceLine.__table__()
+ invoice = Invoice.__table__()
+ company = Company.__table__()
+
+ amounts = defaultdict(Decimal)
+ work_ids = [w.id for w in works]
+ work2currency = {}
+ iline2work = {}
+ for sub_ids in grouped_slice(work_ids):
+ where = reduce_ids(table.id, sub_ids)
+ cursor.execute(*table.join(purchase_line,
+ condition=purchase_line.work == table.id
+ ).join(invoice_line,
+ condition=invoice_line.origin == Concat(
+ 'purchase.line,', purchase_line.id)
+ ).join(invoice,
+ condition=invoice_line.invoice == invoice.id
+ ).select(invoice_line.id, table.id,
+ where=where & ~invoice.state.in_(['draft', 'cancelled'])))
+ iline2work.update(cursor)
+
+ cursor.execute(*table.join(company,
+ condition=table.company == company.id
+ ).select(table.id, company.currency,
+ where=where))
+ work2currency.update(cursor)
+
+ currencies = Currency.browse(set(work2currency.values()))
+ id2currency = {c.id: c for c in currencies}
+
+ invoice_lines = InvoiceLine.browse(list(iline2work.keys()))
+ for invoice_line in invoice_lines:
+ invoice = invoice_line.invoice
+ work_id = iline2work[invoice_line.id]
+ currency_id = work2currency[work_id]
+ currency = id2currency[currency_id]
+ if currency != invoice.currency:
+ with Transaction().set_context(date=invoice.currency_date):
+ amount = Currency.compute(invoice.currency,
+ invoice_line.amount, currency)
+ else:
+ amount = invoice_line.amount
+ amounts[work_id] += amount
+ return amounts
+
+ @classmethod
+ def _get_revenue(cls, works):
+ revenues = dict.fromkeys(map(int, works), Decimal(0))
+ for work in works:
+ if not work.list_price:
+ continue
+ if work.price_list_hour:
+ revenue = work.company.currency.round(
+ work.list_price * Decimal(str(work.effort_hours)))
+ else:
+ revenue = work.list_price
+ revenues[work.id] = work.company.currency.round(revenue)
+ return revenues
+
+ @fields.depends('company')
+ def on_change_with_currency(self, name=None):
+ if self.company:
+ return self.company.currency.id
+
+ @fields.depends('currency')
+ def on_change_with_currency_digits(self, name=None):
+ if self.currency:
+ return self.currency.digits
+ return 2
+
+ @staticmethod
+ def default_currency_digits():
+ Company = Pool().get('company.company')
+ company = Transaction().context.get('company')
+ if company:
+ company = Company(company)
+ return company.currency.digits
+ return 2
+
+ @fields.depends('product', 'company')
+ def on_change_product(self):
+ pool = Pool()
+ User = pool.get('res.user')
+ ModelData = pool.get('ir.model.data')
+ Uom = pool.get('product.uom')
+ Currency = pool.get('currency.currency')
+
+ if not self.product:
+ return
+
+ if self.price_list_hour:
+ hour_uom = Uom(ModelData.get_id('product', 'uom_hour'))
+ self.list_price = Uom.compute_price(
+ self.product.default_uom, self.product.list_price, hour_uom)
+ else:
+ self.list_price = self.product.list_price
+
+ if self.company:
+ user = User(Transaction().user)
+ if user.company != self.company:
+ if user.company.currency != self.company.currency:
+ self.list_price = Currency.compute(user.company.currency,
+ self.list_price, self.company.currency, round=False)
+
+ self.list_price = round_price(self.list_price)
+
+ @property
+ def price_list_hour(self):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ Category = pool.get('product.uom.category')
+ if not self.product:
+ return
+ time = Category(ModelData.get_id('product', 'uom_cat_time'))
+ return self.product.default_uom_category == time
+
+ @classmethod
+ def copy(cls, records, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ if hasattr(cls, 'purchase_lines'):
+ # Do not copy purchase lines if purchase is activated
+ default.setdefault('purchase_lines', None)
+ return super().copy(records, default=default)
diff --git a/modules/project_revenue/work.xml b/modules/project_revenue/work.xml
new file mode 100644
index 0000000000..413c34c52a
--- /dev/null
+++ b/modules/project_revenue/work.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+ project.work
+
+ work_form
+
+
+
+ project.work
+
+ work_tree
+
+
+
+ project.work
+
+ work_list
+
+
+
+ project.work
+
+ work_list_children
+
+
+
+
+
+
+ project.work
+
+ work_form_purchase
+
+
+
+
diff --git a/modules/purchase/.drone.yml b/modules/purchase/.drone.yml
new file mode 100644
index 0000000000..2049d30a49
--- /dev/null
+++ b/modules/purchase/.drone.yml
@@ -0,0 +1,68 @@
+clone:
+ hg:
+ image: plugins/hg
+ environment:
+ - HG_SHARE_POOL=/root/.cache/hg
+ volumes:
+ - cache:/root/.cache
+
+pipeline:
+ tox:
+ image: ${IMAGE}
+ environment:
+ - CFLAGS=-O0
+ - DB_CACHE=/cache
+ - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ commands:
+ - echo "[extensions]" >> /root/.hgrc
+ - echo "hgext.share =" >> /root/.hgrc
+ - echo "[share]" >> /root/.hgrc
+ - echo "pool = /root/.cache/hg" >> /root/.hgrc
+ - pip install tox
+ - tox -e "${TOXENV}-${DATABASE}"
+ volumes:
+ - cache:/root/.cache
+ check_dist:
+ image: ${IMAGE}
+ commands:
+ - pip install twine
+ - python setup.py sdist
+ - twine check dist/*
+
+services:
+ postgresql:
+ image: postgres
+ environment:
+ - POSTGRES_HOST_AUTH_METHOD=trust
+ command: "-c fsync=off -c synchronous_commit=off -c full_page_writes=off"
+ when:
+ matrix:
+ DATABASE: postgresql
+
+matrix:
+ include:
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: sqlite
+ - IMAGE: python:3.6
+ TOXENV: py36
+ DATABASE: postgresql
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: sqlite
+ - IMAGE: python:3.7
+ TOXENV: py37
+ DATABASE: postgresql
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: sqlite
+ - IMAGE: python:3.8
+ TOXENV: py38
+ DATABASE: postgresql
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: sqlite
+ - IMAGE: python:3.9
+ TOXENV: py39
+ DATABASE: postgresql
diff --git a/modules/purchase/.flake8 b/modules/purchase/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/purchase/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/purchase/CHANGELOG b/modules/purchase/CHANGELOG
new file mode 100644
index 0000000000..9cc42080c9
--- /dev/null
+++ b/modules/purchase/CHANGELOG
@@ -0,0 +1,170 @@
+Version 6.0.9 - 2022-10-17
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.8 - 2022-08-03
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.7 - 2022-06-03
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.6 - 2022-03-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.5 - 2022-02-16
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.4 - 2021-11-04
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.3 - 2021-09-16
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.2 - 2021-08-05
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.1 - 2021-06-17
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+* Add origin and set on returned purchase
+* Add default lead time to supplier
+* Allow product supplier to be deactivated
+* Add summary to purchase line list
+* Set payment term and invoice method from last party's purchases
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+* Rename purchase state from cancel to cancelled
+* Add window tab for exception states
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+* Add actual quantity on line
+* Add return wizard
+* Add employee on purchases for some states
+* Add contact and invoice party on purchase
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+* Add customer code for supplier on party
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+* Remove purchase fields from stock move
+* Remove starting wildcard when searching on codes and numbers
+* Allow product supplier to be defined on variants
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Add configured delay for processing purchase
+* Allow to reset to draft confirmed but not processed purchase
+* Show number and reference in purchase rec_name
+* Remove support for Python 2.7
+* Invoice purchased product instead of received product
+* Prevent delete lines if purchase is not draft or canceled
+* Use today as fallback for purchase date report
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+* Check pending purchase to erase party
+* Add wizard to modify purchase header after filling lines
+* Make description on purchase line optional
+* Add product supplier on purchase line
+* Invoice received product instead of purchased product
+
+Version 4.6.0 - 2017-10-30
+* Bug fixes (see mercurial logs for details)
+* Do not plan backorder moves
+* Add cron task to process confirmed purchase
+* Add report_address property on purchase
+
+Version 4.4.0 - 2017-05-01
+* Bug fixes (see mercurial logs for details)
+* Add purchase price on product view from line
+* Allow to edit delivery date on purchase line
+
+Version 4.2.0 - 2016-11-28
+* Bug fixes (see mercurial logs for details)
+* Manage readonly state on Purchase Line
+* Allow purchase without payment term
+
+Version 4.0.0 - 2016-05-02
+* Bug fixes (see mercurial logs for details)
+* Rename Purchase reference into number and supplier reference into reference
+* Add return location on warehouse
+* Add Python3 support
+* Replace Delivery Time by Lead Time on Product Template
+* New workflow do() for purchase
+
+Version 3.8.0 - 2015-11-02
+* Bug fixes (see mercurial logs for details)
+* Delivery Date of Line shows effective date if possible
+
+Version 3.6.0 - 2015-04-20
+* Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+* Support mixed invoice type by line in invoiced quantity calculation
+* Use TaxableMixin
+
+Version 3.4.0 - 2014-10-20
+* Bug fixes (see mercurial logs for details)
+* Confirmed state split into Confirmed and Processing
+* Use MatchMixin for ProductSupplier
+
+Version 3.2.0 - 2014-04-21
+* Bug fixes (see mercurial logs for details)
+* Add link between stock moves and invoice lines
+* Add warning for supplier moves without origin
+
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+* Replace reference copying by relate
+
+Version 2.8.0 - 2013-04-22
+* Bug fixes (see mercurial logs for details)
+* Use origin Reference on Invoice Line and Stock Move
+* Allow no delivery time on product supplier
+
+Version 2.6.0 - 2012-10-22
+* Bug fixes (see mercurial logs for details)
+* Manage negative amount in purchase
+
+Version 2.4.0 - 2012-04-24
+* Bug fixes (see mercurial logs for details)
+* Add cache on amount fields in readonly states
+* Use the most used currency by party on the 10 last records as default value
+ for purchase and product_supplier
+* Add currency on product_supplier
+* Add a Function field delivery_date to purchase line
+* Purchase date is required only at confirmation
+* compute_supply_date returns only one date
+* warehouse is not always required
+
+Version 2.2.0 - 2011-10-25
+* Bug fixes (see mercurial logs for details)
+
+Version 2.0.0 - 2011-04-27
+* Bug fixes (see mercurial logs for details)
+
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
+Version 1.6.0 - 2010-05-13
+* Bug fixes (see mercurial logs for details)
+* Use model singleton to define which purchase sequence to use
+* Add default search value on purchase
+
+Version 1.4.0 - 2009-10-19
+* Bug fixes (see mercurial logs for details)
+* Migrate packing* objects and tables to shipment*
+
+Version 1.2.0 - 2009-04-20
+* Bug fixes (see mercurial logs for details)
+* Use the purchase uom to compute purchase price from product supplier
+* Add buttons to handle invoice and packing exceptions
+* Allow egg installation
+
+Version 1.0.0 - 2008-11-17
+* Initial release
diff --git a/modules/purchase/COPYRIGHT b/modules/purchase/COPYRIGHT
new file mode 100644
index 0000000000..f66a9e26c1
--- /dev/null
+++ b/modules/purchase/COPYRIGHT
@@ -0,0 +1,17 @@
+Copyright (C) 2008-2022 Cédric Krier.
+Copyright (C) 2008-2013 Bertrand Chenal.
+Copyright (C) 2008-2022 B2CK SPRL.
+Copyright (C) 2004-2008 Tiny SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/modules/purchase/LICENSE b/modules/purchase/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/purchase/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/modules/purchase/MANIFEST.in b/modules/purchase/MANIFEST.in
new file mode 100644
index 0000000000..94499680c6
--- /dev/null
+++ b/modules/purchase/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include doc/*
+include icons/LICENSE
diff --git a/modules/purchase/README.rst b/modules/purchase/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/purchase/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/purchase/__init__.py b/modules/purchase/__init__.py
new file mode 100644
index 0000000000..fbd0bb7d92
--- /dev/null
+++ b/modules/purchase/__init__.py
@@ -0,0 +1,53 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.pool import Pool
+from . import purchase
+from . import product
+from . import stock
+from . import configuration
+from . import invoice
+from . import party
+
+
+def register():
+ Pool.register(
+ stock.Move,
+ purchase.Purchase,
+ purchase.PurchaseIgnoredInvoice,
+ purchase.PurchaseRecreatedInvoice,
+ purchase.Line,
+ purchase.LineTax,
+ purchase.LineIgnoredMove,
+ purchase.LineRecreatedMove,
+ product.Template,
+ product.Product,
+ product.ProductSupplier,
+ product.ProductSupplierPrice,
+ stock.ShipmentIn,
+ stock.ShipmentInReturn,
+ purchase.HandleShipmentExceptionAsk,
+ purchase.HandleInvoiceExceptionAsk,
+ configuration.Configuration,
+ configuration.ConfigurationSequence,
+ configuration.ConfigurationPurchaseMethod,
+ invoice.Invoice,
+ invoice.InvoiceLine,
+ stock.Location,
+ party.Party,
+ party.CustomerCode,
+ party.SupplierLeadTime,
+ purchase.ReturnPurchaseStart,
+ module='purchase', type_='model')
+ Pool.register(
+ purchase.PurchaseReport,
+ module='purchase', type_='report')
+ Pool.register(
+ purchase.OpenSupplier,
+ purchase.HandleShipmentException,
+ purchase.HandleInvoiceException,
+ party.PartyReplace,
+ party.PartyErase,
+ purchase.ModifyHeader,
+ purchase.ReturnPurchase,
+ module='purchase', type_='wizard')
diff --git a/modules/purchase/configuration.py b/modules/purchase/configuration.py
new file mode 100644
index 0000000000..e6b1e54e50
--- /dev/null
+++ b/modules/purchase/configuration.py
@@ -0,0 +1,129 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond import backend
+from trytond.model import (ModelView, ModelSQL, ModelSingleton, ValueMixin,
+ fields)
+from trytond.pool import Pool
+from trytond.pyson import Eval, Id
+from trytond.tools.multivalue import migrate_property
+from trytond.modules.company.model import (
+ CompanyMultiValueMixin, CompanyValueMixin)
+
+purchase_invoice_method = fields.Selection(
+ 'get_purchase_invoice_method', "Invoice Method")
+
+
+def get_purchase_methods(field_name):
+ @classmethod
+ def func(cls):
+ pool = Pool()
+ Purchase = pool.get('purchase.purchase')
+ return Purchase.fields_get([field_name])[field_name]['selection']
+ return func
+
+
+class Configuration(
+ ModelSingleton, ModelSQL, ModelView, CompanyMultiValueMixin):
+ 'Purchase Configuration'
+ __name__ = 'purchase.configuration'
+ purchase_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Purchase Sequence", required=True,
+ domain=[
+ ('company', 'in',
+ [Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('purchase', 'sequence_type_purchase')),
+ ]))
+ purchase_invoice_method = fields.MultiValue(purchase_invoice_method)
+ get_purchase_invoice_method = get_purchase_methods('invoice_method')
+ purchase_process_after = fields.TimeDelta("Process Purchase after",
+ help="The grace period during which confirmed purchase "
+ "can still be reset to draft.\n"
+ "Applied only if a worker queue is activated.")
+
+ @classmethod
+ def multivalue_model(cls, field):
+ pool = Pool()
+ if field == 'purchase_invoice_method':
+ return pool.get('purchase.configuration.purchase_method')
+ if field == 'purchase_sequence':
+ return pool.get('purchase.configuration.sequence')
+ return super(Configuration, cls).multivalue_model(field)
+
+ @classmethod
+ def default_purchase_sequence(cls, **pattern):
+ return cls.multivalue_model(
+ 'purchase_sequence').default_purchase_sequence()
+
+ @classmethod
+ def default_purchase_invoice_method(cls, **pattern):
+ return cls.multivalue_model(
+ 'purchase_invoice_method').default_purchase_invoice_method()
+
+
+class ConfigurationSequence(ModelSQL, CompanyValueMixin):
+ "Purchase Configuration Sequence"
+ __name__ = 'purchase.configuration.sequence'
+ purchase_sequence = fields.Many2One(
+ 'ir.sequence', "Purchase Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('purchase', 'sequence_type_purchase')),
+ ],
+ depends=['company'])
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+
+ super(ConfigurationSequence, cls).__register__(module_name)
+
+ if not exist:
+ cls._migrate_property([], [], [])
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.append('purchase_sequence')
+ value_names.append('purchase_sequence')
+ fields.append('company')
+ migrate_property(
+ 'purchase.configuration', field_names, cls, value_names,
+ fields=fields)
+
+ @classmethod
+ def default_purchase_sequence(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id('purchase', 'sequence_purchase')
+ except KeyError:
+ return None
+
+
+class ConfigurationPurchaseMethod(ModelSQL, ValueMixin):
+ "Purchase Configuration Purchase Method"
+ __name__ = 'purchase.configuration.purchase_method'
+ purchase_invoice_method = purchase_invoice_method
+ get_purchase_invoice_method = get_purchase_methods('invoice_method')
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+
+ super(ConfigurationPurchaseMethod, cls).__register__(module_name)
+
+ if not exist:
+ cls._migrate_property([], [], [])
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.append('purchase_invoice_method')
+ value_names.append('purchase_invoice_method')
+ migrate_property(
+ 'purchase.configuration', field_names, cls, value_names,
+ fields=fields)
+
+ @classmethod
+ def default_purchase_invoice_method(cls):
+ return 'order'
diff --git a/modules/purchase/configuration.xml b/modules/purchase/configuration.xml
new file mode 100644
index 0000000000..92b103500c
--- /dev/null
+++ b/modules/purchase/configuration.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ purchase.configuration
+ form
+ configuration_form
+
+
+ Configuration
+ purchase.configuration
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/purchase/doc/conf.py b/modules/purchase/doc/conf.py
new file mode 100644
index 0000000000..8513b72dd2
--- /dev/null
+++ b/modules/purchase/doc/conf.py
@@ -0,0 +1,61 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+modules_url = 'https://docs.tryton.org/projects/modules-{module}/en/{series}/'
+trytond_url = 'https://docs.tryton.org/projects/server/en/{series}/'
+
+
+def get_info():
+ import configparser
+ import os
+ import subprocess
+ import sys
+
+ module_dir = os.path.dirname(os.path.dirname(__file__))
+
+ config = configparser.ConfigParser()
+ config.read_file(open(os.path.join(module_dir, 'tryton.cfg')))
+ info = dict(config.items('tryton'))
+
+ result = subprocess.run(
+ [sys.executable, 'setup.py', '--name'],
+ stdout=subprocess.PIPE, check=True, cwd=module_dir)
+ info['name'] = result.stdout.decode('utf-8').strip()
+
+ result = subprocess.run(
+ [sys.executable, 'setup.py', '--version'],
+ stdout=subprocess.PIPE, check=True, cwd=module_dir)
+ version = result.stdout.decode('utf-8').strip()
+ if 'dev' in version:
+ info['series'] = 'latest'
+ else:
+ info['series'] = '.'.join(version.split('.', 2)[:2])
+
+ for key in {'depends', 'extras_depend'}:
+ info[key] = info.get(key, '').strip().splitlines()
+ info['modules'] = set(info['depends'] + info['extras_depend'])
+ info['modules'] -= {'ir', 'res'}
+
+ return info
+
+
+info = get_info()
+
+master_doc = 'index'
+project = info['name']
+release = version = info['series']
+default_role = 'ref'
+highlight_language = 'none'
+extensions = [
+ 'sphinx.ext.intersphinx',
+ ]
+intersphinx_mapping = {
+ 'trytond': (trytond_url.format(series=version), None),
+ }
+intersphinx_mapping.update({
+ m: (modules_url.format(
+ module=m.replace('_', '-'), series=version), None)
+ for m in info['modules']
+ })
+
+del get_info, info, modules_url, trytond_url
diff --git a/modules/purchase/doc/design.rst b/modules/purchase/doc/design.rst
new file mode 100644
index 0000000000..8a1cdd75a6
--- /dev/null
+++ b/modules/purchase/doc/design.rst
@@ -0,0 +1,168 @@
+******
+Design
+******
+
+The *Purchase Module* introduces some new concepts and updates existing
+concepts to make them work seamlessly with purchases.
+
+.. _model-purchase.purchase:
+
+Purchase
+========
+
+The *Purchase* is used to manage the purchasing process.
+Each purchase, at any time, can be in one of several different states.
+A purchase progresses through these states until eventually it is either done
+or gets cancelled.
+When some of these state changes happen the
+`Employee ` that triggered the state change is
+also recorded.
+
+Details are stored about the `Company ` making
+the purchase and any other `Parties `,
+`Contact Mechanisms ` and
+`Addresses ` that relate to it, such as the
+supplier, the contact at the supplier or the party that is sending the
+`Invoice `.
+
+A purchase is identified by a unique number that is generated automatically
+from the configured `Sequence ` and may also have
+other general information such as the purchase date, a description, or a
+reference provided by the supplier.
+
+Each purchase is made up from one or more lines.
+These lines can be put into a particular order if desired.
+Normally most lines on a purchase provide information about which
+`Products ` or items are required.
+Informational lines can also be added for things like titles, comments or
+subtotals.
+
+The total, untaxed, and tax amounts for a purchase are derived from the
+amounts, prices and `Taxes ` of the purchase's
+lines.
+
+A destination `Warehouse ` is required
+for purchases of physical items such as goods or assets.
+The purchase will automatically create `Stock Moves `
+for these products.
+These stock moves are linked to the purchase's lines and must be
+recreated or ignored if they get cancelled.
+
+`Invoices ` relating to the purchase
+may be created, depending on which invoice method is selected.
+These invoices are based on the details from the purchase, and must be
+recreated or ignored if they get cancelled.
+
+.. seealso::
+
+ Purchases can be found by opening the main menu item:
+
+ |Purchase --> Purchases|__ menu item.
+
+ .. |Purchase --> Purchases| replace:: :menuselection:`Purchase --> Purchases`
+ __ https://demo.tryton.org/model/purchase.purchase
+
+Reports
+-------
+
+.. _report-purchase.purchase:
+
+Purchase Report
+^^^^^^^^^^^^^^^
+
+The *Purchase Report* provides a purchase order that can be sent to the
+supplier when making a purchase.
+It includes all the relevant information from the selected purchases.
+
+Wizards
+-------
+
+.. _wizard-purchase.handle.shipment.exception:
+
+Handle Shipment Exception
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The *Handle Shipment Exception* wizard helps the user ensure the purchase
+has the correct `Stock Moves ` associated with it.
+For stock moves that have been cancelled, it lets the user decide which
+should be re-created, and which should be ignored.
+
+.. _wizard-purchase.handle.invoice.exception:
+
+Handle Invoice Exception
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+The *Handle Invoice Exception* wizard helps the user make sure the purchase
+only has the appropriate `Invoices `
+associated with it.
+If any of the purchase's invoices get cancelled this wizard provides the user
+with the option to re-create or ignore the cancelled invoice.
+
+.. _wizard-purchase.modify_header:
+
+Modify Header
+^^^^^^^^^^^^^
+
+Some fields on a draft purchase become read-only when lines are added to it.
+The *Modify Header* wizard allows the values in these fields to be safely
+updated.
+
+.. _wizard-purchase.return_purchase:
+
+Return Purchase
+^^^^^^^^^^^^^^^
+
+The *Return Purchase* wizard is used when a purchase needs to be sent back.
+It creates new draft purchases that match any selected purchases, but with
+all the quantities negated.
+
+.. _model-purchase.product_supplier:
+
+Product Supplier
+================
+
+The *Product Supplier* concept links together a
+`Product ` with a `Party `
+that acts as a supplier.
+The product can be either a `Product Template `
+or one of its `Variants `.
+Each `Company ` has their own list of product
+suppliers.
+
+A supplier's product name and code, and a lead time can be defined for each
+combination of products and suppliers.
+Also different purchase prices can be set for different minimum order
+quantities.
+
+.. seealso::
+
+ A list of products and their suppliers can be found by opening the main
+ menu item:
+
+ |Product --> Product Suppliers|__
+
+ .. |Product --> Product Suppliers| replace:: :menuselection:`Product --> Product Suppliers`
+ __ https://demo.tryton.org/model/purchase.product_supplier
+
+.. _model-purchase.configuration:
+
+Configuration
+=============
+
+The *Purchase Configuration* concept is used to store the settings that affect
+the general behaviour and default values for purchase related activities.
+
+.. note::
+
+ Some of the purchase configuration options have no effect unless the
+ :doc:`Task Queue ` has been setup and some
+ workers are running.
+
+.. seealso::
+
+ Purchase configuration settings are found by opening the main menu item:
+
+ |Purchase --> Configuration --> Purchase Configuration|__
+
+ .. |Purchase --> Configuration --> Purchase Configuration| replace:: :menuselection:`Purchase --> Configuration --> Purchase Configuration`
+ __ https://demo.tryton.org/model/purchase.configuration/1
diff --git a/modules/purchase/doc/index.rst b/modules/purchase/doc/index.rst
new file mode 100644
index 0000000000..a4fa11be45
--- /dev/null
+++ b/modules/purchase/doc/index.rst
@@ -0,0 +1,16 @@
+###############
+Purchase Module
+###############
+
+The *Purchase Module* provides everything that is required to create and
+manage purchases made by the company.
+It adds the idea of a purchase to Tryton, and allows it to be tracked as it
+moves through various states from draft to done.
+It makes it easy to create supplier shipments for the purchase, and includes
+the ability to automatically create related supplier invoices.
+
+.. toctree::
+ :maxdepth: 2
+
+ usage/index
+ design
diff --git a/modules/purchase/doc/usage/index.rst b/modules/purchase/doc/usage/index.rst
new file mode 100644
index 0000000000..e093ef71f9
--- /dev/null
+++ b/modules/purchase/doc/usage/index.rst
@@ -0,0 +1,13 @@
+*****
+Usage
+*****
+
+Settings, information and tasks relating to purchases can be found under the
+[:menuselection:`Purchase`] main menu item.
+
+.. toctree::
+ :maxdepth: 1
+
+ prepurchase
+ process
+ returns
diff --git a/modules/purchase/doc/usage/prepurchase.rst b/modules/purchase/doc/usage/prepurchase.rst
new file mode 100644
index 0000000000..ed0bf6c461
--- /dev/null
+++ b/modules/purchase/doc/usage/prepurchase.rst
@@ -0,0 +1,56 @@
+.. _Listing Suppliers:
+
+Listing Suppliers
+=================
+
+In Tryton, by definition, the `Parties ` that your
+`Company ` has bought from are its suppliers.
+The *Purchase Module* lets you list these when you open the
+[:menuselection:`Party --> Parties --> Parties associated to Purchases`]
+main menu item.
+
+.. tip::
+
+ For some companies it is important to know which parties are, or may
+ eventually be, suppliers before you have bought anything from them.
+ One way of doing this is to create a ``Supplier``
+ `Category `, and add all the appropriate
+ parties to it.
+
+.. _Making products purchasable:
+
+Making products purchasable
+===========================
+
+Before you can add a `Product ` to a
+`Purchase ` it must be marked as purchasable.
+When you do this you will also be able to set some additional properties such
+as the `Unit of Measure ` the product is normally
+bought in, and which suppliers are used and their details about the product.
+
+.. _Setting bulk prices:
+
+Setting bulk prices
+===================
+
+Suppliers may offer different prices depending on how much of a
+`Product ` is purchased.
+In Tryton you can record these prices using the
+`Product Supplier ` concept.
+
+.. tip::
+
+ You can set these prices by opening one of the :guilabel:`Suppliers`
+ lines shown when viewing a product's details.
+
+.. note::
+
+ To ensure the correct price is chosen when entering in a
+ `Purchase ` you must ensure that the prices are
+ ordered correctly.
+ The lowest quantity must appear first, going up to the largest quantity
+ last.
+
+ This is because Tryton searches through the price lines in
+ :guilabel:`Sequence` order, and uses the last price it finds where the
+ ordered quantity is equal to, or more than, the price line's quantity.
diff --git a/modules/purchase/doc/usage/process.rst b/modules/purchase/doc/usage/process.rst
new file mode 100644
index 0000000000..5a95405dfa
--- /dev/null
+++ b/modules/purchase/doc/usage/process.rst
@@ -0,0 +1,125 @@
+.. _Creating a purchase order:
+
+Creating a purchase order
+=========================
+
+Creating a new purchase order is simply a matter of creating a new
+`Purchase ` and adding the lines that are
+required.
+Most of the fields are optional or have sensible default values.
+
+.. tip::
+
+ Product prices are automatically converted to the
+ `Currency ` used on the purchase.
+ To keep the prices fixed when ordering in a foreign currency set the
+ currency and prices in the `Product's ` list of
+ `Product Suppliers `.
+
+.. tip::
+
+ The purchase's reference field is intended to be used to keep track of
+ the supplier's reference for the purchase.
+ This can be filled in at any time, even when the purchase is done.
+
+.. _Changing a purchase order:
+
+Changing a purchase order
+=========================
+
+To be able to change most of the values in the fields on a
+`Purchase ` the purchase must be in a draft state.
+
+There are also a few fields, such as the `Party ` and
+`Currency `, which become read-only when any
+lines are added to the order.
+To be able to change these without needing to remove the lines from the
+purchase you can use the :guilabel:`Modify Header` button to start the
+`Modify Header ` wizard.
+
+.. _Receiving a shipment:
+
+Receiving a shipment
+====================
+
+Goods that are bought as part of a `Purchase ` are
+`received from the supplier ` using a
+`Supplier Shipment `.
+
+Suppliers sometimes send a single order on multiple different shipments, or
+group several orders together into a single shipment.
+As it is not possible to know how a supplier will ship products the
+*Purchase Module* does not automatically create any supplier shipments for you.
+
+A purchase does, however, create draft `Stock Moves `
+for any goods or assets that have been purchased.
+Once you receive the information about what's been shipped you create a new
+supplier shipment and add these moves to it.
+
+If not all the stock has been sent, then new stock moves are automatically
+created for any remaining quantities when the shipment is received, or the
+purchase gets processed again.
+These can be added to later shipments, split up further, or cancelled.
+
+.. tip::
+
+ The supplier shipments that are related to the purchase can be found using
+ the purchase's :guilabel:`Shipments` link.
+
+ The :guilabel:`Shipments` and stock :guilabel:`Moves` related to a purchase
+ can also be found using the items in the purchase's
+ :guilabel:`Open related records` menu.
+
+.. _Getting invoiced:
+
+Getting invoiced
+================
+
+The `Purchase's ` invoice method determines whether
+the purchase will automatically generate draft
+`Invoices `.
+
+When you receive the invoice from the supplier you can then find the draft
+supplier invoice and check it for any discrepancies, before validating or
+posting it.
+
+.. tip::
+
+ The supplier invoices that are related to the purchase can be found using
+ the purchase's :guilabel:`Invoices` link, or the :guilabel:`Invoices`
+ item found in the sale's :guilabel:`Open related records` menu.
+
+.. _Handling shipment and invoice exceptions:
+
+Handling shipment and invoice exceptions
+========================================
+
+Sometimes you may cancel `Stock Moves ` or
+`Invoices ` that are related to a
+`Purchase `.
+You may have done this because you no longer need these items, or you may
+now need to recreate them.
+As Tryton does not know if a cancelled item needs to be recreated, or not,
+it shows this as an exception in the purchase's shipment or invoice state.
+
+For purchases that have a shipment or invoice exception you can use the
+`Handle Shipment Exception ` or
+`Handle Invoice Exception ` wizards
+to recreate the items that need recreating, and ignore the rest.
+
+.. tip::
+
+ When using the wizard the moves and invoices to recreate will, by default,
+ already be selected.
+ This means you will need to deselect any that you do not want to recreate.
+
+.. _Finishing a purchase:
+
+Finishing a purchase
+====================
+
+In Tryton once a `Purchase ` is being processed there
+is no button that moves the purchase into a done state.
+This will happen automatically once the purchase's
+`Shipments ` and
+`Invoices ` are completed.
diff --git a/modules/purchase/doc/usage/returns.rst b/modules/purchase/doc/usage/returns.rst
new file mode 100644
index 0000000000..2e11f2dd6d
--- /dev/null
+++ b/modules/purchase/doc/usage/returns.rst
@@ -0,0 +1,52 @@
+.. _Cancelling purchases:
+
+Cancelling purchases
+====================
+
+You can easily cancel `Purchases ` that are not yet
+confirmed using the :guilabel:`Cancel` button.
+
+Confirmed purchases cannot be cancelled, but you can put them back to a state
+where they can be cancelled.
+However, as soon as a confirmed purchase starts to be processed it can no
+longer be cancelled.
+This may happen immediately when it is confirmed, or after a delay if one has
+been correctly `Configured `.
+
+Once a purchase has started to be processed, to effectively cancel the
+purchase, you must cancel its `Stock Moves ` and
+`Invoices `.
+Once you have done this you must
+`handle the exceptions `,
+ensuring that none of the moves or invoices are selected for
+recreation.
+
+.. _Returning purchases:
+
+Returning purchases
+===================
+
+There may be times when you need to send a
+`Purchase `, or part of a purchase, back to the
+supplier.
+In Tryton this is represented by a purchase that has negative quantities.
+
+One way of creating a supplier return is to select the purchases that you want
+to return and then use the `Return Purchase `
+wizard.
+This creates a draft return purchase for the whole of the selected purchase.
+
+If only part of the purchase is being returned, then the return purchase can
+be altered as required.
+When it gets processed it will automatically create
+`Credit Notes ` and
+`Supplier Return Shipments ` where
+required.
+
+.. note::
+
+ When processing the return shipment, if the
+ `Warehouse ` has a supplier return
+ `Location ` the returned stock will be taken
+ from that location.
+ Otherwise the stock will be picked from the warehouse's storage location.
diff --git a/modules/purchase/exceptions.py b/modules/purchase/exceptions.py
new file mode 100644
index 0000000000..0ec373886c
--- /dev/null
+++ b/modules/purchase/exceptions.py
@@ -0,0 +1,17 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from trytond.exceptions import UserError, UserWarning
+from trytond.model.exceptions import ValidationError
+
+
+class PurchaseUOMWarning(UserWarning):
+ pass
+
+
+class PurchaseQuotationError(ValidationError):
+ pass
+
+
+class PartyLocationError(UserError):
+ pass
diff --git a/modules/purchase/icons/LICENSE b/modules/purchase/icons/LICENSE
new file mode 100644
index 0000000000..7a4a3ea242
--- /dev/null
+++ b/modules/purchase/icons/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/modules/purchase/icons/tryton-purchase.svg b/modules/purchase/icons/tryton-purchase.svg
new file mode 100644
index 0000000000..81a3cf0977
--- /dev/null
+++ b/modules/purchase/icons/tryton-purchase.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/purchase/invoice.py b/modules/purchase/invoice.py
new file mode 100644
index 0000000000..55d463c102
--- /dev/null
+++ b/modules/purchase/invoice.py
@@ -0,0 +1,146 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from functools import wraps
+
+from trytond.i18n import gettext
+from trytond.model import ModelView, Workflow, fields
+from trytond.model.exceptions import AccessError
+from trytond.pool import Pool, PoolMeta
+from trytond.transaction import Transaction
+
+
+def process_purchase(func):
+ @wraps(func)
+ def wrapper(cls, invoices):
+ pool = Pool()
+ Purchase = pool.get('purchase.purchase')
+ with Transaction().set_context(_check_access=False):
+ purchases = set(
+ p for i in cls.browse(invoices) for p in i.purchases)
+ func(cls, invoices)
+ if purchases:
+ Purchase.__queue__.process(purchases)
+ return wrapper
+
+
+class Invoice(metaclass=PoolMeta):
+ __name__ = 'account.invoice'
+ purchase_exception_state = fields.Function(fields.Selection([
+ ('', ''),
+ ('ignored', 'Ignored'),
+ ('recreated', 'Recreated'),
+ ], 'Exception State'), 'get_purchase_exception_state')
+ purchases = fields.Function(fields.Many2Many(
+ 'purchase.purchase', None, None, "Purchases"),
+ 'get_purchases', searcher='search_purchases')
+
+ def get_purchase_exception_state(self, name):
+ purchases = self.purchases
+
+ recreated = tuple(i for p in purchases for i in p.invoices_recreated)
+ ignored = tuple(i for p in purchases for i in p.invoices_ignored)
+
+ if self in recreated:
+ return 'recreated'
+ elif self in ignored:
+ return 'ignored'
+ return ''
+
+ def get_purchases(self, name):
+ pool = Pool()
+ PurchaseLine = pool.get('purchase.line')
+ purchases = set()
+ for line in self.lines:
+ if isinstance(line.origin, PurchaseLine):
+ purchases.add(line.origin.purchase.id)
+ return list(purchases)
+
+ @classmethod
+ def search_purchases(cls, name, clause):
+ return [('lines.origin.purchase' + clause[0].lstrip(name),)
+ + tuple(clause[1:3]) + ('purchase.line',) + tuple(clause[3:])]
+
+ @classmethod
+ @process_purchase
+ def delete(cls, invoices):
+ super(Invoice, cls).delete(invoices)
+
+ @classmethod
+ def copy(cls, invoices, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('purchases', None)
+ return super(Invoice, cls).copy(invoices, default=default)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, invoices):
+ for invoice in invoices:
+ if invoice.purchases and invoice.state == 'cancelled':
+ raise AccessError(
+ gettext('purchase.msg_purchase_invoice_reset_draft',
+ invoice=invoice.rec_name))
+
+ return super(Invoice, cls).draft(invoices)
+
+ @classmethod
+ @process_purchase
+ def _post(cls, invoices):
+ super()._post(invoices)
+
+ @classmethod
+ @process_purchase
+ def paid(cls, invoices):
+ super(Invoice, cls).paid(invoices)
+
+ @classmethod
+ @process_purchase
+ def cancel(cls, invoices):
+ super(Invoice, cls).cancel(invoices)
+
+
+class InvoiceLine(metaclass=PoolMeta):
+ __name__ = 'account.invoice.line'
+
+ @fields.depends('origin')
+ def on_change_with_product_uom_category(self, name=None):
+ pool = Pool()
+ PurchaseLine = pool.get('purchase.line')
+ category = super().on_change_with_product_uom_category(name=name)
+ # Enforce the same unit category as they are used to compute the
+ # remaining quantity to invoice and the quantity to receive.
+ # Use getattr as reference field can have negative id
+ if (isinstance(self.origin, PurchaseLine)
+ and getattr(self.origin, 'unit', None)):
+ category = self.origin.unit.category.id
+ return category
+
+ @property
+ def origin_name(self):
+ pool = Pool()
+ PurchaseLine = pool.get('purchase.line')
+ name = super(InvoiceLine, self).origin_name
+ if isinstance(self.origin, PurchaseLine):
+ name = self.origin.purchase.rec_name
+ return name
+
+ @classmethod
+ def _get_origin(cls):
+ models = super(InvoiceLine, cls)._get_origin()
+ models.append('purchase.line')
+ return models
+
+ @classmethod
+ def delete(cls, lines):
+ pool = Pool()
+ Purchase = pool.get('purchase.purchase')
+ with Transaction().set_context(_check_access=False):
+ invoices = (l.invoice for l in cls.browse(lines)
+ if l.type == 'line' and l.invoice)
+ purchases = set(p for i in invoices for p in i.purchases)
+ super(InvoiceLine, cls).delete(lines)
+ if purchases:
+ Purchase.__queue__.process(purchases)
diff --git a/modules/purchase/locale/bg.po b/modules/purchase/locale/bg.po
new file mode 100644
index 0000000000..7e0386f6c4
--- /dev/null
+++ b/modules/purchase/locale/bg.po
@@ -0,0 +1,1181 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Състояние на грешка"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Покупки"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Партньор"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Партньор"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Доставчици"
+
+#, fuzzy
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Купуваем"
+
+#, fuzzy
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Ред от покупка"
+
+#, fuzzy
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Мер. ед. на покупка"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Доставчици"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Купуваем"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Мер. ед. на покупка"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+#, fuzzy
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Фактури на домейн"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Наново създаване на фактури"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Движение на домейн"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Наново създаване на движения"
+
+#, fuzzy
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Количество"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Сума"
+
+#, fuzzy
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Валута"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Дата на доставка"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Дата на доставка"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "От местонахождение"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Редове от фактура"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Направени движения"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Грешка при движение"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Игнорирани движения"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Наново създаване на движения"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Бележка"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Категория мер. ед. на продукт"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Покупка"
+
+#, fuzzy
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Дата на покупка"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Данъци"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Към местонахождение"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Вид"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Единица"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Десетични единици"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Единична цена"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Данък"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Движение"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Движение"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Код"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Валута"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Цени"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Валута"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Единична цена"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Коментар"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Потвърден"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Валута"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Цифри за валута"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Дата на доставка"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Адрес за фактура"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Начин на фактуриране"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Състояние на фактура"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Състояние на фактура"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Фактури"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Игнорирани фактури"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Наново създадени на фактури"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Партньор"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Език на партньор"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Условие за плащане"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Дата на покупка"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Отпратка"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Върнати доставки"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Състояние на пратка"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Изпращания"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Данък"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Данък в брой"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Общо"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Общо налични"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Необложен с данък"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Наличност преди данъци"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Фактура"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Фактура"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr ""
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Състояние на грешка"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Избраните фактури ще бъдат наново създадени. Останалите ще бъдат игнорирани."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"Избраните движение ще бъдат наново създадени, Останалите ще бъдат "
+"игнорирани."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Минимално количество"
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr ""
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Доставчици"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Цени"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Покупки"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Връщане"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Покупка"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Потвърден"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Грешка"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Обработване"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Запитване"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Доставчици"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Покупки"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Доставчик"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Конфигуриране на покупка"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Обработване на грешка в фактура"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Обработване за грешка при пратка"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Ред от покупка"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Ред от покупка - Данък"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Ред от покупка - Игнорирано движение"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Ред от покупка - Игнорирано движение"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Доставчик на продукт"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Цена на доставчик на продукт"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Покупка - Игнорирана фактура"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Покупка - Наново създаване на фактури"
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Покупка"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Purchase Administrator"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Сума"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Дата:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Описание:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Проект на поръчка за покупка"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Поръчка за покупка N°:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Количество"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Отпратка"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Заявки за запитване N°:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Данъци"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Данъци:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Общо (без данъци):"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Общо:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Единична цена"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Игнорирано"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Създаден наново"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Коментар"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Ред"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Междинна сума"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Заглавие"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Въз основа на поръчка"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Въз основа на изпращане"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Ръчно"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Грешка"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Платен"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "Изчакващ"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Грешка"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Получен"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "Изчакващ"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Потвърден"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Обработване"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Запитване"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Игнорирано"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Създаден наново"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Доставчици"
+
+#, fuzzy
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Избор на фактури за ново създаване"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Избор на движение за ново създаване"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Дата на доставка"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Основен"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Бележки"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Данъци"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Друга информация"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Покупка"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "Добре"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "Добре"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Връщане"
diff --git a/modules/purchase/locale/ca.po b/modules/purchase/locale/ca.po
new file mode 100644
index 0000000000..7312b61e89
--- /dev/null
+++ b/modules/purchase/locale/ca.po
@@ -0,0 +1,1137 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estat excepció"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr "Codi client"
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr "Codis de client"
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Temps d'espera"
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "Temps d'espera"
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr "Codi de client"
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Tercer"
+
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Tercer"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Temps d'espera"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Proveïdors"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Comprable"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Preu de compra"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UdM de compra"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Proveïdors"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Comprable"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UdM de compra"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Mètode de facturació"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr "Processa les compres desprès de"
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Seqüència de compra"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Mètode de facturació"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Seqüència de compra"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Domini de les factures"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Refer factures"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Domini dels moviments"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Refer moviments"
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Quantitat actual"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Import"
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Data lliurament"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Modificar data de lliurament"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Data lliurament"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Des de la ubicació"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Línies de factura"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Moviments finalitzats"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Moviments en excepció"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Moviments ignorats"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Moviments recreats"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "Producte proveïdor"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoria UdM del producte"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Estat de compra"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr "Resum"
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Impostos"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "A la ubicació"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Tipus"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígits de la unitat"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Impost"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Codi"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "Temps d'espera"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Preus"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Comentari"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmada per"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr "Contacte"
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Decimals de la moneda"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Data lliurament"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Adreça de facturació"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Mètode de facturació"
+
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Tercer de la factura"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Estat de la factura"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Factures ignorades"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Factures recreades"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr "Origen"
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Tercer"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Idioma del tercer"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Termini de pagament"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Data compra"
+
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Pressupostada per"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Albarans de devolució"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Estat enviament"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Albarans"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Impost"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Impostos precalculats"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Total precalculat"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Base imposable"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Base imposable precalculada"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Devolució proveïdor"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estat excepció"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+"El codi que el tercer com a proveïdor ha assignat a l'empresa com a client."
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+"El temps que es tarda a rebre els béns després de la confirmació de l'oferta quan el tercer s'utilitza com a proveïdor:\n"
+"Utilitzat quan no hi ha temps d'espera al producte de proveïdor."
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+"El període durant el qual una compra confirmada es pot tornar a passar a esborrany.\n"
+"Aplica només si la cua de treballs està activada."
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr "La factura seleccionada serà recreada. Les altres seran ignorades."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr "Els moviments seleccionats es refaran. Els altres s'ignoraran."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "Marca per modificar la data de lliurament."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+"El temps desde la confirmació de la comanda fins a la recepció dels productes:\n"
+"Si es deixa en blanc s'utilitza el temps d'espera del proveïdor."
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Quantitat mínima."
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "La unitat en que s'especifica la quantitat."
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "La data de lliurament per defecte de cada línia."
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "Si es deixa buit s'utilitzarà la ubicació d'emmagatzematge."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Tercers amb compres"
+
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Proveïdors"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Preus"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Albarans de devolució"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Albarans"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gestiona l'excepció de factura"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modificar capçalera"
+
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Retorna la compra"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gestiona l'excepció d'enviament"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Excepció"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "En procés"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Pressupost"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+"Esteu intentar modificar la UdM de compra en la que es basen els preus de "
+"compra."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+"No podeu eliminar el tercer \"%(party)s\" mentre tingui compres pendents amb"
+" l'empresa \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr "Per eliminar la compra \"%(purchase)s\" l'heu de cancel·lar."
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+"No podeu restaurar a esborrany la factura \"%(invoice)s\" perquè ha estat "
+"generada per una compra."
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+"Per eliminar la línia de compra \"%(line)s\" heu de cancel·lar o restablir a"
+" esborrany la compra \"%(purchase)s\"."
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+"Per facturar la compra \"%(purchase)\" heu de configurar un compte de "
+"despeses per defecte."
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+"Per modificar la capçalera de la compra \"%(purchase)s\", ha d'estar en "
+"estat esborrany."
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+"No podeu restaurar a esborrany el moviment \"%(move)s\" perquè ha estat "
+"generat per una compra."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+"Per facturar la compra \"%(purchase)s\" heu de definir un compte de despeses"
+" pel producte \"%(product)s\"."
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+"Per procesar la compra \"%(purchase)s\" heu de definir una ubicació de "
+"proveïdor pel tercer \"%(party)s\"."
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+"Per obtenir un pressupost per la compra \"%(purchase)s\" de béns o actius, "
+"heu d'introduir un magatzem."
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirma"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Gestiona excepció de factura"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Gestiona excepció d'enviament"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modificar capçalera"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Processa"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Pressupost"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Compres"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Compres"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Proveïdors"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Amb compres"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr "Codi client tercer"
+
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Temps d'espera del proveïdor"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Configuració de les compres"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "Configuració dels mètodes de compra"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "Configuració de seqüencies de compra"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Gestiona excepció de factura"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Gestiona excepció d'enviament"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Línia de compra"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Línia de compra - Impost"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línia de compra - Moviment ignorat"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línia de compra - Moviment ignorat"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Proveïdor de producte"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Preu del proveïdor del producte"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Compra - Factura ignorada"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Compra - Factura recreada"
+
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Retorna la compra"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Compres"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Administració de compres"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Import"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr "Codi client:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Adreça enviament:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Descripció:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Compra esborrany"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Comanda de compra número:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Referència:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Sol·licitud de pressupost Núm.:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Impostos"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Impostos:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Base imposable:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignorat"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Recreada"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Comentari"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Línia"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Títol"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Basat en la comanda"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Basat en l'enviament"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Excepció"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Pagada"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Excepció"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Rebuda"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Cancel·lada"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Finalitzada"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "En procés"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Pressupost"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignorat"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Recreat"
+
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Proveïdors"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Seleccioneu les factures a recrear:"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Seleccioneu els moviments a recrear:"
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Data lliurament:"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Notes"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Impostos"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr "Esteu segurs que voleu retornar aquesta/es compra/es?"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "D'acord"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "D'acord"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr "Modifica"
+
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Retorna"
diff --git a/modules/purchase/locale/cs.po b/modules/purchase/locale/cs.po
new file mode 100644
index 0000000000..95573e4f09
--- /dev/null
+++ b/modules/purchase/locale/cs.po
@@ -0,0 +1,1156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr ""
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr ""
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr ""
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr ""
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr ""
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Prices"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmed"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Invoices"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr ""
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Shipments"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr ""
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Product Suppliers"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Prices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Returns"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmed"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Processing"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Product Suppliers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Product Suppliers"
+
+#, fuzzy
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Purchase Configuration"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+#, fuzzy
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr ""
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Product Suppliers"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Purchase Administrator"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirm"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Processing"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Product Suppliers"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Returns"
diff --git a/modules/purchase/locale/de.po b/modules/purchase/locale/de.po
new file mode 100644
index 0000000000..27892fe7e3
--- /dev/null
+++ b/modules/purchase/locale/de.po
@@ -0,0 +1,1143 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Status Vorbehalt"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr "Kundennummer"
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr "Kundennummern"
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Beschaffungszeit"
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "Beschaffungszeiten"
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr "Kundennummer"
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Partei"
+
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Partei"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Beschaffungszeit"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Käuflich"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Einkaufspreis"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Maßeinheit Einkauf"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Käuflich"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Maßeinheit Einkauf"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Rechnungsstellung Einkauf"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr "Einkauf ausführen nach"
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Nummernkreis Einkauf"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Rechnungsstellung Einkauf"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Nummernkreis Einkauf"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Wertebereich Rechnungen (Domain)"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Rechnungen neu erstellen"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Wertebereich Lagerbewegungen (Domain)"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Lagerbewegungen neu erstellen"
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Tatsächliche Menge"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Betrag"
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Lieferdatum"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Lieferdatum geändert"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Lieferdatum"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Von Lagerort"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Rechnungspositionen"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Erledigte Lagerbewegungen"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Lagerbewegungen Vorbehalt"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Lagerbewegungen"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Ignorierte Lagerbewegungen"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Neu erstellte Lagerbewegungen"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Notiz"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "Artikel des Lieferanten"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Maßeinheitenkategorie"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Einkaufsstatus"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr "Kurzbeschreibung"
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Steuern"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Zu Lagerort"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Nachkommastellen"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Einkaufsposition"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Steuer"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Lagerbewegung"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Einkaufsposition"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Lagerbewegung"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Einkaufsposition"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Artikelnummer Lieferant"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Lieferfirma"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "Beschaffungszeit"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Preise"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr "Maßeinheit"
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr "Maßeinheit"
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Kommentar"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Bestellt von"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr "Kontakt"
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Nachkommastellen Währung"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Lieferdatum"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Rechnungsadresse"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Rechnungsstellung"
+
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Rechnungsaussteller"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Rechnungsstatus"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Rechnungen"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Ignorierte Rechnungen"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Neu erstellte Rechnungen"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Lagerbewegungen"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr "Herkunft"
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Partei"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Sprache Partei"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Zahlungsbedingung"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Bestelldatum"
+
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Angefragt von"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Referenz"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Lieferposten Rückgaben"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Lieferstatus"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Lieferposten"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Steuer"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Steuer Cache"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Gesamt"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Gesamt Cache"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Netto"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Netto Cache"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Warenlager"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Rechnung"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Rechnung"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Rückgabe Lieferant"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Status Vorbehalt"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+"Nummer die diese Partei als Lieferant dem Unternehmen als ihr Kunde "
+"zugewiesen hat."
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+"Die Zeit zwischen der Bestellbestätigung und dem Erhalt der Ware bei Nutzung der Partei als Lieferant.\n"
+"Wird genutzt sofern auf dem Lieferantendatensatz keine Beschaffungszeit erfasst wurde."
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+"Frist innerhalb der eine Bestellung noch auf Entwurf zurückgesetzt werden kann.\n"
+"Wird nur angewandt, wenn die Warteschlange aktiviert ist."
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Die ausgewählten Rechnungen werden neu erstellt. Alle anderen werden "
+"ignoriert."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"Die ausgewählten Lagerbewegungen werden neu erstellt. Alle anderen werden "
+"ignoriert."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "Aktivieren um das Lieferdatum zu ändern."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+"Die Zeit zwischen der Bestellbestätigung und dem Erhalt der Ware.\n"
+"Wenn leer wird die Standardbeschaffungszeit des Lieferanten genutzt."
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Minimale Menge."
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "Die Maßheit in der die Menge angegeben ist."
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "Das Standard-Lieferdatum für jede Position."
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "Wenn kein Wert eingetragen ist, wird die Lagerzone verwendet."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Rechnungen"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parteien mit Einkäufen"
+
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Preise"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Lagerbewegungen"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Warenrücknahmen"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Lieferungen"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Rechnungsvorbehalt bearbeiten"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Kopfdaten bearbeiten"
+
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Einkauf Rückgabe"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Liefervorbehalt bearbeiten"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Bestellt"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Vorbehalt"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "In Ausführung"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Anfrage"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+"Sie versuchen die Maßeinheit Einkauf zu ändern, auf der die Einkaufspreise "
+"basieren."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+"Partei \"%(party)s\" kann nicht gelöscht werden, solange noch unerledigte "
+"Einkäufe bei Unternehmen \"%(company)s\" bestehen."
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr "Um Einkauf \"%(purchase)s\" zu löschen, muss er zuerst annulliert werden."
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+"Rechnung \"%(invoice)s\" kann nicht auf den Entwurfsstatus\" zurückgesetzt "
+"werden, weil sie durch einen Einkauf erzeugt wurde."
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+"Um Einkaufsposition \"%(line)s\" zu löschen, muss zuerst der Einkauf "
+"\"%(purchase)s\" annulliert oder zurück auf den Entwurfsstatus gesetzt "
+"werden."
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+"Damit die Rechnung für Einkauf \"%(purchase)s\" erstellt werden kann, muss "
+"zuerst ein Standardaufwandskonto konfiguriert werden."
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+"Damit die Kopfdaten von Einkauf \"%(purchase)s\" bearbeitet werden können, "
+"muss der Einkauf im Entwurfsstatus sein."
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+"Lagerbewegung \"%(move)s\" kann nicht in den Entwurfsstatus zurückgesetzt "
+"werden, weil sie durch einen Einkauf erzeugt wurde."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+"Damit die Rechnung für Einkauf \"%(purchase)s\" erstellt werden kann, muss "
+"ein Aufwandskonto auf Artikel \"%(product)s\" definiert werden."
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+"Damit der Einkauf \"%(purchase)s\" ausgeführt werden kann, muss Lagerort "
+"Lieferant auf Partei \"%(party)s\" konfiguriert werden."
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+"Um eine Anfrage für Einkauf \"%(purchase)s\" erstellen zu können, muss "
+"zuerst ein Warenlager erfasst werden."
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Bestellen"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Rechnungsvorbehalt bearbeiten"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Liefervorbehalt bearbeiten"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Kopfdaten bearbeiten"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Ausführen"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Anfrage"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Einkauf"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Auswertungen"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Parteien mit Einkäufen"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr "Partei Kundennummer"
+
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Lieferant Beschaffungszeit"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Einstellungen Einkauf"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "Einstellungen Einkauf Methode"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "Einstellungen Einkauf Nummernkreis"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Nachfrage Rechnungsvorbehalt"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Nachfrage Liefervorbehalt"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Einkaufsposition"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Einkaufsposition - Steuer"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Einkaufsposition - Ignorierte Lagerbewegung"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Einkaufsposition - Ignorierte Lagerbewegung"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Lieferant"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Einkaufspreis"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Einkauf - Rechnung Ignoriert"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Einkauf - Neu erstellte Rechnung"
+
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Einkauf Rückgabe"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Einkauf Administration"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Betrag"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr "Kundennummer:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Datum:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Lieferadresse:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Beschreibung:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Auftrag (Entwurf)"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Auftrag Nr.:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Referenz:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Anfrage Nr.:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Steuern"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Steuern:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Netto:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Gesamt:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignoriert"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Neu erstellt"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Kommentar"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Position"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Zwischensumme"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Überschrift"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Bei Beauftragung"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Bei Lieferung"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Manuell"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Vorbehalt"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Kein"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Bezahlt"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Vorbehalt"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Kein"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Erhalten"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Bestellt"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "In Ausführung"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Anfrage"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignoriert"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Neu erstellt"
+
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Lieferanten"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Rechnungen zur Neuerstellung auswählen:"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Lagerbewegungen zur Neuerstellung auswählen:"
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Lieferdatum:"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Notizen"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Steuern"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Einkauf"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr "Rückgabe für diese(n) Einkauf/Einkäufe auslösen?"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr "Ändern"
+
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Rückgabe"
diff --git a/modules/purchase/locale/es.po b/modules/purchase/locale/es.po
new file mode 100644
index 0000000000..9855034101
--- /dev/null
+++ b/modules/purchase/locale/es.po
@@ -0,0 +1,1140 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estado excepción"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr "Código de cliente"
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr "Códigos de cliente"
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Tiempo de espera"
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "Tiempos de espera"
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr "Código de cliente"
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Tercero"
+
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Tercero"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Tiempo de espera"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Comprable"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Precio de compra"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UdM de compra"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Comprable"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UdM de compra"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr "Procesar las compras después de"
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Secuencia de compra"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Secuencia de compra"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Dominio de facturas"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Recrear facturas"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Dominio de movimientos"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Recrear movimientos"
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Cantidad actual"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Importe"
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Fecha de entrega"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Modificar la fecha de entrega"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Fecha entrega"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Desde ubicación"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Líneas de factura"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Movimientos finalizados"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Movimientos en excepción"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Movimientos ignorados"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Movimientos recreados"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "Producto proveedor"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoría UdM del producto"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Estado de la compra"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos de la unidad"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Impuesto"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "Tiempo de espera"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Precios"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmada por"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr "Contacto"
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Decimales de la moneda"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Fecha de entrega"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Dirección de facturación"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Método de facturación"
+
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Tercero de la factura"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Estado de la factura"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Facturas ignoradas"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Facturas recreadas"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr "Origen"
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Tercero"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Idioma del tercero"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Plazo de pago"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Fecha de compra"
+
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Presupuestada por"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Albaranes de devolución"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Estado envío"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Albaranes"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Impuestos"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Impuestos precalculados"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Total precalculado"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Base imponible"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Base imponible precalculada"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Factura"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Devolución proveedor"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estado excepción"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+"El código que el tercero como proveedor ha asignado a la empresa como "
+"cliente."
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+"El tiempo desde que se ha confirmado el pedido de compra hasta recibir los bienes del tercero se utiliza como proveedor.\n"
+"Usado si no hay tiempo de espera establecido en el proveedor del producto."
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+"El periodo durante el cual una compra confirmada se puede volver a estado borrador.\n"
+"Solo aplica si la cola de trabajos está activada."
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Las facturas seleccionadas serán recreadas. Las otras serán ignoradas."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"Los movimientos seleccionados serán recreados. Los otros serán ignorados."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "Marcar para modificar la fecha de entrega."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+"El tiempo desde que se ha confirmado el pedido de compra hasta recibir los productos.\n"
+"Si está vacío se usa el tiempo de espera del proveedor."
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Cantidad mínima."
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "La unidad en que se especifica la cantidad."
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "La fecha de entrega por defecto de cada línea."
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "Si se deja vacío se usará la ubicación de almacenaje."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Terceros con compras"
+
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Precios"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Albaranes de devolución"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Albaranes"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepción de factura"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modificar cabecera"
+
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Devolver la compra"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envío"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "En proceso"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+"Está intentando modificar la UdM de compra en la que se basan los precios de"
+" compra."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+"No puede eliminar el tercero \"%(party)s\" mientras tenga compras pendientes"
+" con la empresa \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr "Para eliminar la compra \"%(purchase)s\" debe cancelarla."
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+"No puede restaurar a borrador la factura \"%(invoice)s\" porque se generó "
+"por una compra."
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+"Para eliminar la línea \"%(line)s\" debe cancelar o restablecer a borrador "
+"la compra \"%(purchase)s\"."
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+"Para facturar la compra \"%(purchase)s\" debe configurar una cuenta de "
+"gastos por defecto."
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+"Para modificar la cabecera de la compra \"%(purchase)s\", debe estar en "
+"estado borrador."
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+"No puede restaurar a borrador el movimiento \"%(move)s\" porque se generó en"
+" una compra."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+"Para facturar la compra \"%(purchase)s\" debe definir una cuenta de gasto "
+"para el producto \"%(product)s\"."
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+"Para procesar la compra \"%(purchase)s\" debe definir una ubicación de "
+"proveedor en el tercero \"%(party)s\"."
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+"Para obtener un presupuesto de la compra \"%(purchase)s\" de bienes o "
+"activos, debe establecer un almacén."
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepción de factura"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envío"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modificar cabecera"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Procesar"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Presupuesto"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Compras"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Compras"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Con compras"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr "Codigo cliente tercero"
+
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Tiempo de espera del proveedor"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Configuración de compras"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "Configuración de los métodos de compra"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "Configuración de las secuencias de compra"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Gestionar excepción de factura"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Gestionar excepción de envío"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Línea de compra"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Línea de compra - Impuesto"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línea de compra - Movimiento ignorado"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Línea de compra - Movimiento ignorado"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Proveedor de producto"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Precio del proveedor del producto"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Compra - Factura ignorada"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Compra - Factura recreada"
+
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Devolver la compra"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Compras"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Administración de compras"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Importe"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr "Código cliente:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Fecha:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Dirección de envío:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Descripción:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Compra borrador"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Pedido de compra Nº:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Referencia:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Solicitud de presupuesto Nº:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Impuestos:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Base imponible:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Recreada"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Comentario"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Título"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Basado en el pedido"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Basado en el envío"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Pagada"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Excepción"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Recibida"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Cancelada"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Finalizada"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "En proceso"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Recreado"
+
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Proveedores"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Seleccione las facturas a recrear:"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Seleccione los movimientos a recrear:"
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Fecha de entrega:"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Notas"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Impuestos"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr "¿Estás seguro de querer devolver este/os pedido/s de compra?"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr "Modificar"
+
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Devolver"
diff --git a/modules/purchase/locale/es_419.po b/modules/purchase/locale/es_419.po
new file mode 100644
index 0000000000..22deda9f9a
--- /dev/null
+++ b/modules/purchase/locale/es_419.po
@@ -0,0 +1,1125 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estado de excepción"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr ""
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Subtotal"
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Fecha de entrega"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Fecha de entrega"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Líneas de factura"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr ""
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr ""
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr ""
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Fecha de entrega"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Líneas de factura"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr ""
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Cotizar"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Devolución"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Estado de envío"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Base sin impuesto"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Cache base sin impuesto"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Devolución a proveedor"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estado de excepción"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "Si se deja vacío se utilizará la ubicación de almacenamiento"
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Devolución a proveedor"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Envíos"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Estado de excepción"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Cotizar"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Devolución a proveedor"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr ""
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Devolución a proveedor"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr ""
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Proveedores de producto"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr ""
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr ""
+
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr ""
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Subtotal"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Orden de compra en borrador"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Orden de compra Nº:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Solicitud de cotización Nº:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Total (sin impuestos):"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Basado en la orden"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Devolución a proveedor"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Fecha de entrega"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr ""
diff --git a/modules/purchase/locale/et.po b/modules/purchase/locale/et.po
new file mode 100644
index 0000000000..3a43b108ff
--- /dev/null
+++ b/modules/purchase/locale/et.po
@@ -0,0 +1,1141 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Erandi olek"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Ostud"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Osapool"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Osapool"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Hankijad"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Ostetav"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Ostuhind"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Ostuühik"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Hankijad"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Ostetav"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Ostuühik"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Arveldusmeetod"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Ostu järjestus"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Arveldusmeetod"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Ostu järjestus"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Domeeni arved"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Taasloo arved"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Domeeni liikumised"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Taasloo liikumised"
+
+#, fuzzy
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Kogus"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Kogus"
+
+#, fuzzy
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Valuuta"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Tarne kuupäev"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Muuda tarnekuupäeva"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Tarne kuupäev"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Kirjeldus"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Asukohast"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Arveread"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Lõpetatud liikumised"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Liikumiste erand"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Ignoreeritud liikumised"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Taasloodud liikumised"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Märkus"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "Hankija toode"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Toote mõõtühiku kategooria"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Ost"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Ostu olek"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Maksud"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Asukohta"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Tüüp"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Ühik"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Ühiku hind"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Ostu rida"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Maks"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Liikumine"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Ostu rida"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Liikumine"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Ostu rida"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Kood"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Valuuta"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Nimi"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Hinnad"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Valuuta"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Ühiku hind"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Kommentaar"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Kinnitatud"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Valuuta"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Tarne kuupäev"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Kirjeldus"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Arve aadress"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Arve meetod"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Arve olek"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Arve olek"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Arved"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Ignoreeritud arved"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Taasloo arved"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Read"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Osapool"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Osaplloe keel"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Maksetingimus"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Ostu kuupäev"
+
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr ""
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Viide"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Tagastused"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Lähetuse olek"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Lähetused"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Maks"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Kokku"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Maksuvaba"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Arve"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Ost"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Arve"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Ost"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Hankija tagastus"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Ost"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Erandi olek"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr "Valitud arved taasluuakse. Teisi ignoreeritakse."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr "Valitud liikumised taasluuakse. Teisi ignoreeritakse."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "Vali, et muuta tarnekuupäeva."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Miinimumkogus"
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "Vaikimisi tarnekuupäev igale reale."
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Arved"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Ostuga seotud osapooled"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Hankijad"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Hinnad"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Ostud"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Ostud"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Ostud"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Ostud"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Ostud"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Tagastused"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Lähetused"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Ost"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Käsitle arve erandit"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Muuda päist"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Ost"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Käsitle lähetuse erandit"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Kinnitatud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Erand"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Käitluses"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Pakkumine"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Kinnita"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Käsitle arve erandit"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Käsitle lähetuse erandit"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Muuda päistMuuda päist"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Töötle"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Ost"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Ost"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Seadistus"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Hankijad"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Ostud"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Ostud"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Aruandlus"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Ostuga seotud osapooled"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Hankija"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Ostu seadistus"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "Ostu seadistuse järjestus"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Käsitle arve erandeid"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Käsitle saadetise erandit"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Ostu rida"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Ostu rida - maks"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Toote hankija"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Toote hankija hind"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Ost"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Ost - tühistatud arved"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Ost - taasloodud arved"
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Ost"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Ost"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Ostujuht"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Kogus"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Kuupäev:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Tarneaadress:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Kirjeldus"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Kirjeldus:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Ostutellimuse mustand"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Ostutellimus N°:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Viide:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Maksud"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Maksud:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Kokku (maksuvaba):"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Kokku:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Ühiku hind"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Tühistatud"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Taasloodud"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Kommentaar"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Rida"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Vahekokkuvõte"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Pealkiri"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Põhineb tellimusel"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Põhineb tarnel"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Käsitsi"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Erand"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Mitte"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Tasutud"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Erand"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Mitte"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Saabunud"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "Ootel"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Kinnitatud"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Käitluses"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Pakkumine"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignoreeritud"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Taasloodud"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Hankijad"
+
+#, fuzzy
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Vali taasloodavad arved"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Vali taasloodavad liikumised"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Tarne kuupäev"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Üldine"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Märkused"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Maksud"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Muu info"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Ost"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr "Muuda"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Tagastused"
diff --git a/modules/purchase/locale/fa.po b/modules/purchase/locale/fa.po
new file mode 100644
index 0000000000..c0557aec5a
--- /dev/null
+++ b/modules/purchase/locale/fa.po
@@ -0,0 +1,1167 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "حالت اعتراضی"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "خریدها"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "زمان پیشبرد"
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "زمان پیشبرد"
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "نهاد/سازمان"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "شرکت"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "نهاد/سازمان"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "زمان پیشبرد"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "تأمین کنندگان"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "قابل خرید"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "قیمت خرید"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "واحد اندازی گیری خرید"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "تأمین کنندگان"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "قابل خرید"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "واحد اندازی گیری خرید"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "سبک صورتحساب"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr "پس از فرایند خرید"
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "ادامه خرید"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "سبک صورتحساب"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "ادامه خرید"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "دامنه صورتحساب ها"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "ایجاد دوباره صورتحساب ها"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "دامنه جابجایی ها"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "ایجاد دوباره جابجایی ها"
+
+#, fuzzy
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "مقدار"
+
+#, fuzzy
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "شرکت"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "واحد پول"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "تاریخ تحویل"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "تصحیح تاریخ تحویل"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "تاریخ تحویل"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "شرح"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "از مکان"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "خطوط صورتحساب"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "جابجایی ها انجام شد"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "جابجایی های اعتراضی"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "جابجایی های نادیده گرفته شده"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "جابجایی های دوباره انجام شده"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "توجه"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "تامین کنندگان محصول"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "دسته بندی واحد اندازه گیری محصول"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "خرید"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "وضعیت خرید"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "مالیات ها"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "به مکان"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "نوع"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "واحد"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "ارقام واحد"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "قیمت واحد"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "خط خرید"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "مالیات"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "جابجایی"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "خط خرید"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "جابجایی"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "خط خرید"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "کد"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "واحد پول"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "زمان پیشبرد"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "تامین کننده"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "قیمت ها"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "واحد پول"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "تامین کننده"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "قیمت واحد"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "اظهار نظر"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "شرکت"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "تایید شده"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "واحد پول"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "رقم های واحد پول"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "تاریخ تحویل"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "شرح"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "آدرس صورتحساب"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "سبک صورتحساب"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "وضعیت صورت حساب"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "وضعیت صورت حساب"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "صورتحساب ها"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "صورتحساب های نادیده گرفته شده"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "صورتحساب های دوباره ایجاد شده"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "خطوط"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "نهاد/سازمان"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "زبان نهاد/سازمان"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "شرایط پرداخت"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "تاریخ خرید"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "مرجع"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "محموله های برگشتی"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "وضعیت حمل و نقل محموله"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "محموله ها"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "مالیات"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "مالیات نقدی"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "مجموع"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "مجموع نقدی"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "بدون اعمال مالیات"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "نقدی بدون اعمال مالیات"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "صورت حساب"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "خرید"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "صورت حساب"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "خرید"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "برگشتی به تامین کننده"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "خرید"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "حالت اعتراضی"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "تامین کننده"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+"دوره فصلی که در آن تأیید خرید هنوز می تواند به پیش نویس مجدد تنظیم مجدد "
+"شود.فقط اگر یک کارگر فعال باشد اعمال می شود."
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"صورتحساب های انتخاب شده دوباره ایجاد خواهند شد، مابقی نادیده گرفته میشوند."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"جابجایی های انتخاب شده دوباره ایجاد خواهند شد، مابقی نادیده گرفته میشوند."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "برای اصلاح تاریخ تحویل کادر را تیک بزنید."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "حداقل مقدار"
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "تاریخ تحویل پیشفرض هر خط."
+
+#, fuzzy
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "اگر محل انبار خالی است میتواند مورد استفاده قرار گیرد"
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "صورتحساب ها"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "نهادها/سازمان های مرتبط با خریدها"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "تأمین کنندگان"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "قیمت"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "خریدها"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "خریدها"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "خریدها"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "برگشتی ها"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "محموله ها"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "خرید"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "رسیدگی به صورتحساب های اعتراضی"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "خرید"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "رسیدگی به محموله های اعتراضی"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "تایید شده"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "اعتراض"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "در حال پردازش"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "نقل قول"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+"شما در حال تلاش برای تغییرواحد قیمت خرید هستید، که قیمت خرید بر مبنای آن "
+"متکی است."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+"شما نمیتوانید نهاد/سازمان: \"%(party)s\"را هنگامی که خریدهای معوقه با شرکت :"
+" \"%(company)s\"دارد را حذف کنید."
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr "برای حذف خرید : \"%(purchase)s\"شما باید ابتدا آنرا لغو کنید."
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+"شما نمیتوانید حالت صورتحساب: \"%(invoice)s\"را به پیش نویس تغیر دهید چراکه "
+"بوسیله یک خرید تولید شده است."
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+"برای حذف سطر: \"%(line)s\" شما باید خرید : \"%(purchase)s\" را لغو یا به "
+"حالت پیش نویس تغیر دهید."
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+"برای صورتحساب خرید : \"%(purchase)s\" شما باید یک حساب هزینه پیش فرض "
+"پیکربندی کنید."
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr "برای تغییر عنوان خرید:\"%(purchase)s\" باید در حالت پیش نویس باشد."
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+"شمانمیتوانید جابجایی :\"%s\" را که توسط یک خرید تولید شده است بعنوان پیش "
+"نویس بازنشانی کنید."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+"برای صورتحساب خرید :\"%(purchase)s\" شما باید یک حساب هزینه برای محصول: "
+"\"%(product)s\" تعریف کنید."
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+"برای پردازش خرید: \"%(purchase)s\" شما باید مکان عرضه کننده را در "
+"نهاد/سازمان : \"%(party)s\" تنظیم کنید."
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+"برای دریافت یک نقل قول برای خرید : \"%(purchase)s\" کالاها یا دارایی ها، شما"
+" باید یک انبار وارد کنید."
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "خرید"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "خرید"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "تأمین کنندگان"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "خریدها"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "خریدها"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "گزارش گیری"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "نهادها/سازمان های مرتبط با خریدها"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "زمان پیشبرد"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "پیکربندی خریدها"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "پیکربندی خرید ؛ شیوه خرید"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "ادامه پیکربندی خرید"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "رسیدگی به صورتحساب های اعتراضی"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "رسیدگی به محموله های اعتراضی"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "خط خرید"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "خط خرید - مالیات"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "خرید خط - جابجایی نادیده گرفته شده"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "خرید خط - جابجایی نادیده گرفته شده"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "تامین کننده محصول"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "قیمت تامین کننده محصول"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "خرید"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "خرید - صورتحساب نادیده گرفته شده"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "خرید - صورتحساب دوباره ایجاد شده"
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "خرید"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "خرید"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "مدیریت خرید"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "مقدار"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "تاریخ :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "آدرس تحویل :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "شرح"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "توضیحات :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "پیش نویس دستور خرید"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "دستور خرید N° :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "ارجاع :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "درخواست نقل قول N°:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "مالیات ها"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "مالیات ها :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "مجموع (بدون احتساب مالیات) :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "مجموع :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "قیمت واحد"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "نادیده گرفته شده"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "دوباره ایجاد شده"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "اظهار نظر"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "خط"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "زیرمجموع"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "عنوان"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "بر اساس دستور"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "براساس محموله"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "دستی"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "اعتراض"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "هیجکدام"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "پرداخت شده"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "در انتظار"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "اعتراض"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "هیجکدام"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "دریافت شده"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "در انتظار"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "تایید شده"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "در حال پردازش"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "نقل قول"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "نادیده گرفته شده"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "دوباره ایجاد شده"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "تامین کننده"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "تأمین کنندگان"
+
+#, fuzzy
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "انتخاب صورتحساب ها برای ایجاد دوباره"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "انتخاب جابجایی برای ایجاد دوباره"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "تاریخ تحویل"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "عمومی"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "یادداشت ها"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "مالیات ها"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "سایر اطلاعات"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "خرید"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "انصراف"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "قبول"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "انصراف"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "قبول"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "انصراف"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr "تغییر"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "برگشتی ها"
diff --git a/modules/purchase/locale/fi.po b/modules/purchase/locale/fi.po
new file mode 100644
index 0000000000..3981402900
--- /dev/null
+++ b/modules/purchase/locale/fi.po
@@ -0,0 +1,1155 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr ""
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr ""
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr ""
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr ""
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr ""
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Prices"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmed"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Invoices"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr ""
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Shipments"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr ""
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Product Suppliers"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Prices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Returns"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmed"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Processing"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Product Suppliers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Product Suppliers"
+
+#, fuzzy
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Purchase Configuration"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+#, fuzzy
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr ""
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Product Suppliers"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Purchase Administrator"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirm"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Processing"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Product Suppliers"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Returns"
diff --git a/modules/purchase/locale/fr.po b/modules/purchase/locale/fr.po
new file mode 100644
index 0000000000..a5f3b53330
--- /dev/null
+++ b/modules/purchase/locale/fr.po
@@ -0,0 +1,1139 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "État d'exception"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr "Code client"
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr "Codes client"
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Délai de livraison"
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "Délais de livraison"
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr "Code client"
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Tiers"
+
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Tiers"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Délai de livraison"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Fournisseurs"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Achetable"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Prix d'achat"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UDM d'achat"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Fournisseurs"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Achetable"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UDM d'achat"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Méthode de facturation"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr "Traiter les achats après"
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Séquence d'achat"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Méthode de facturation"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Séquence d'achat"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Domaine des factures"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Recréer les factures"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Domaine des mouvements"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Recréer des mouvements"
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Quantité réelle"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Montant"
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Date de livraison"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Date de livraison éditée"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Date de livraison"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Emplacement d'origine"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Lignes de facture"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Mouvements effectués"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Mouvements en exception"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Mouvements ignorés"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Mouvements recréés"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Note"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "Produit du fournisseur"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "État de l'achat"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr "Résumé"
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Taxes"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Emplacement de destination"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Décimales de l'unité"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Taxe"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "Délai de livraison"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Prix"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr "UDM"
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr "UDM"
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Commentaire"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmé par"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr "Contact"
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Décimales de la devise"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Date de livraison"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Adresse de facturation"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Méthode de facturation"
+
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Tiers de facturation"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "État de la facture"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Factures ignorées"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Factures recréées"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr "Origine"
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Tiers"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Langue du tiers"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Conditions de paiement"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Date d'achat"
+
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Devis fait par"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Retours d'expédition"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "État de l'expédition"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Taxe"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Cache des taxes"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Cache du total"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Hors taxe"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Cache hors taxe"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Facture"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Facture"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Retour fournisseur"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "État d'exception"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+"Le code que le tiers en tant que fournisseur a attribué à la société en tant"
+" que client."
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+"Le temps entre la confirmation de l'achat et la réception des biens dutiers lorsqu'il est utilisée en tant que fournisseur.\n"
+"Utilisé si aucun délai de livraison n'est défini sur le fournisseur du produit."
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+"La période de grâce pendant laquelle un achat confirmé peut toujours être réinitialiser à l'état brouillon.\n"
+"S'applique si une fille d'attente de travailleurs est activée."
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Les factures sélectionnées seront recréés. Les autres seront ignorées."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"Les mouvements sélectionnés seront recréés. Les autres seront ignorés."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "Cocher pour éditer la date de livraison."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+"Le temps entre la confirmation du l'achat et la réception des produits.\n"
+"S'il est vide, le délai de livraison du fournisseur est utilisé."
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Quantité minimale."
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "L'unité dans laquelle la quantité est spécifiée."
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "La date de livraison par défaut pour chaque ligne."
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "Si vide l'emplacement magasin est utilisé."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Tiers associés à des achats"
+
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Fournisseurs"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Prix"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Retours"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modifier l'entête"
+
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Retourner l'achat"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Tous"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmés"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Exception"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "En traitements"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+"Vous essayez de changer l'UDM d'achat sur laquelle le prix d'achat est basé."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+"Vous ne pouvez pas effacer le tiers « %(party)s » tant qu'il a des achats en"
+" cours avec la société « %(company)s »."
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr "Pour supprimer l'achat « %(purchase)s », vous devez l'annuler."
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+"Vous ne pouvez réinitialiser la facture « %(invoice)s » à l'état brouillon "
+"car elle a été générée par un achat."
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+"Pour supprimer la ligne « %(line)s », vous devez annuler ou réinitialiser à "
+"l'état brouillon l'achat « %(purchase)s »."
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+"Pour facturer l'achat « %(purchase)s », vous devez configurer un compte de "
+"charge par défaut."
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+"Pour modifier l'entête de l'achat « %(purchase)s », il doit être dans l'état"
+" brouillon."
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+"Vous ne pouvez réinitialiser le mouvement « %(move)s » à l'état brouillon "
+"car il a été généré par un achat."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+"Pour facture l'achat « %(purchase)s », vous devez définir un compte de "
+"charge sur le produit « %(product)s »."
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+"Pour traiter l'achat « %(purchase)s », vous devez définir un emplacement "
+"fournisseur sur le tiers « %(party)s »."
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+"Pour avoir un devis pour l'achat « %(purchase)s » de biens ou d'actifs, vous"
+" devez entrer un entrepôt."
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirmer"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Gérer l'exception de facture"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Gérer l'exception d'expédition"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modifier l'entête"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Traiter"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Devis"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Fournisseurs"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapports"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Associés à des achats"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr "Code client tiers"
+
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Délai de livraison fournisseur"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Configuration des achats"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "Configuration d'achat Méthode d'achat"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "Configuration d'achat Séquence"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Exception de facture - Demande"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Exception d'expédition - Demande"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Ligne d'achat"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Ligne d'achat - Taxe"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Ligne d'achat - Mouvement ignoré"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Ligne d'achat - Mouvement ignoré"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Produit Fournisseur"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Produit Prix Fournisseur"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Achat - Facture ignorée"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Achat - Facture recréée"
+
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Retourner l'achat"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Achats"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Administrateur des achats"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Montant"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr "Code client :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Date :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Adresse de livraison :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Description :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Commande d'achat"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Commande d'achat n° :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Référence :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Demande pour le devis n° :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Taxes"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Taxes :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Total (hors taxes) :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Total :"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignoré"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Recréé"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Commentaire"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Ligne"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Sous-total"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Titre"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Basé sur la commande"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Basé sur l'expédition"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Manuel"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Exception"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Aucun"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Payé"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Exception"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Aucun"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Reçu"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Terminé"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "En traitement"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignoré"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Recréé"
+
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Fournisseurs"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Choisissez les factures à recréer :"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Choisissez les mouvements à recréer :"
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Date de livraison :"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Notes"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Taxes"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Achat"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr "Êtes-vous sûr de retourner ces/cet achat(s) ?"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr "Modifier"
+
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Retourner"
diff --git a/modules/purchase/locale/hu.po b/modules/purchase/locale/hu.po
new file mode 100644
index 0000000000..1f3a5689db
--- /dev/null
+++ b/modules/purchase/locale/hu.po
@@ -0,0 +1,1126 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Visszautasítás kezelése"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Beszerzési rendelések"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr "Szállító vevői száma"
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Beszerzési átfutási idő"
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr "Szállító vevői száma"
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Ügyfél"
+
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Ügyfél"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Átfutási idő"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Beszállítók"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Beszerezhető"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr ""
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Beszerzési ME"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Beszállítók"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Beszerezhető"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Beszerzési ME"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Számlázás módja"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Beszerzési rendelés sorszámozása"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Számlázás módja"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Beszerzési rendelés sorszámozása"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Részösszeg"
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Pénznem"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Leszállítás dátuma"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Leszállítás dátuma"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Leírás"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Induló tárhely"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Számlasorok"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Mozgások"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Jegyzetek"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "Szállító termékadatai"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Mértékegység kategória"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Beszerzési rendelés"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr ""
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr "Leírás"
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Adók"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Cél tárhely"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Típus"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Mértékegység"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Tizedes vessző utáni számjegy"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Egységár"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Beszerzési rendelés sora"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Adó"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Tétel"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Beszerzési rendelés sora"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Tétel"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Beszerzési rendelés sora"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Cikkszám"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Pénznem"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "Átfutási idő"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Szállító"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Árak"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr "Változat"
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr "Mértékegység"
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Pénznem"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Szállító"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Egységár"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr "Mértékegység"
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Megjegyzés"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Jóváhagyta"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr "Kapcsolattartó"
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Pénznem"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Leszállítás dátuma"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Leírás"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Számlázási cím"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Számlázás módja"
+
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Számlázó ügyfél"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Számlázás állapota"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Számlák"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Sorok"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Készletmozgások"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr "Eredet"
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Ügyfél"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Ügyfél nyelve"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Fizetési feltétel"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Rendelés dátuma"
+
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Ajánlatkérést létrehozta"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Hivatkozás"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Szállítmányok állapota"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Szállítmányok"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Állapot"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Adó"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Összesen"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Nettó"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Számla"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Beszerzési rendelés"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Számla"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Beszerzési rendelés"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Visszaküldés beszállítóhoz"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Beszerzési rendelés"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Visszautasítás kezelése"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Szállító"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr "A saját cégünk vevői száma a szállító rendszerében."
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+"Az átfutási idő a beszerzési rendelés jóváhagyásától az áru átvételéig, ha ettől a szállítótól rendelünk.\n"
+"Akkor használja a rendszer, ha nincs más megadva a termékspecifikus szállítói információnál."
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"A kiválasztott számlákat újra létrehozza a rendszer. A többi figyelmen kívül"
+" hagyja."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"A kiválasztott készletmozgásokat újra létrehozza a rendszer. A többi "
+"figyelmen kívül hagyja."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "Jelölje be egyedi szállítási dátum megadásához."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+"Az átfutási idő a beszerzési rendelés jóváhagyásától az áru átvételéig.\n"
+"Ha üres, a szállítónál megadott átfutási időt használja a rendszer."
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "A megadott egységárhoz szükséges legkisebb rendelési mennyiség."
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "Ebben a mértékegységben van a mennyiség megadva."
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "A rendeléssorok alapértelmezett leszállítási dátuma."
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "Ha üres, a tárolóteret használja a rendszer."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Számlák"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Szállítók beszerzési rendeléssel"
+
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Beszállítók"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Árak"
+
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Beállítások"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Beszerzési rendelések"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Beszerzési rendelések"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Beszerzési rendelések"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Készletmozgások"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Beszerzési rendelések"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Beszerzési rendelések"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Visszaküldött áru"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Szállítmányok"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Beszerzési rendelés"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Visszautasított számla kezelése"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Fejléc módosítása"
+
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Beszerzési rendelés visszaküldése"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Visszautasított szállítmány kezelése"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "összes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "jóváhagyott"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "visszautasítva"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "folyamatban"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "ajánlatkérés"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Érvénytelenítés"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Jóváhagyás"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Újra vázlatba"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Visszautasított számla kezelése"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Visszautasított szállítmány kezelése"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Fejléc módosítása"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Raktárba/pénzügybe"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Ajánlatkérés"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Beszerzési rendelés"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Beszerzési rendelés"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Beállítások"
+
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Beszállítók"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Beszerzés"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Beállítások"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Beszerzési rendelések"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Jelentések"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Beszerzési rendeléssel"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Beszállítók"
+
+#, fuzzy
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Purchase Configuration"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Visszautasított számla kezelése"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Visszautasított szállítmány kezelése"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Beszerzési rendelés sora"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr ""
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Product Suppliers"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr ""
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Beszerzési rendelés"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr ""
+
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Beszerzési rendelés visszaküldése"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Beszerzési rendelés"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Purchase Administrator"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Összeg"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr "Vevő száma:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Dátum:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Leírás"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Leírás"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Hivatkozás:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Adók"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Adók:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Összesen:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Egységár"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "figyelmen kívül hagyva"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "újra létrehozva"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Megjegyzés"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Sor"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Részösszeg"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Címsor"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "rendelésből"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "szállítmányról"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "kézzel"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "visszautasítva"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "nincs"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Fizetve"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "várakozik"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "visszautasítva"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "nincs"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "átvett"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "várakozik"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "érvénytelen"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "jóváhagyott"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Folyamatban"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Ajánlatkérés"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "figyelmen kívül hagyva"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "újra létrehozva"
+
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Szállító"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Beszerzés"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Válassza ki a számlákat, amiket újra létre szeretne hozni:"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Válassza ki a készletmozgásokat, amiket újra létre szeretne hozni:"
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Leszállítás dátuma:"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Általános"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Jegyzetek"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Adók"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Egyéb info"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Beszerzési rendelés"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+"Biztos, hogy vissza akarja küldeni a szállítónak ez(eke)t a rendelés(eke)t?"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Mégse"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Mégse"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Mégse"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr "Módosítás"
+
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Mégse"
+
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Visszaküldés"
diff --git a/modules/purchase/locale/id.po b/modules/purchase/locale/id.po
new file mode 100644
index 0000000000..a31f25a7a5
--- /dev/null
+++ b/modules/purchase/locale/id.po
@@ -0,0 +1,1131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Pihak"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Pihak"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr ""
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Jumlah"
+
+#, fuzzy
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Mata uang"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Deskripsi"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Baris Faktur"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Perpindahan Selesai"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Catatan"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Pembelian"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr ""
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Baris Pembelian"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Pajak"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Perpindahan"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Baris Pembelian"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Perpindahan"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Baris Pembelian"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Kode"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Mata uang"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Mata uang"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Komentar"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Konfirmasi"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Mata uang"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Deskripsi"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Status Faktur"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Status Faktur"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Faktur-faktur"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Faktur-faktur yang Diabaikan"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Baris"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Pihak"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr ""
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Masa Pembayaran"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Tanggal Pembelian"
+
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Dikutip Oleh"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Referensi"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Pajak"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Faktur"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Pembelian"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Faktur"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Pembelian"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr ""
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Pembelian"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr ""
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Faktur-faktur"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Pemasok"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Pembelian"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Pembelian"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Pembelian"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Konfirmasi"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Rancangan"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Proses"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Pembelian"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Pembelian"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Pemasok"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Pembelian"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Pembelian"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Pelaporan"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Pihak terkait dengan Pembelian"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Pemasok"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Konfigurasi Pembelian"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "Konfigurasi Pembelian Metode Pembelian"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "Urutan Konfigurasi Pembelian"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Baris Pembelian"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Baris Pembelian - Pajak"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Baris Pembelian - Perpindahan Diabaikan"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Baris Pembelian - Perpindahan Diabaikan"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Pemasok Produk"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Harga Pemasok Produk"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Pembelian"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Pembelian - Faktur yang Diabaikan"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Pembelian"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Pembelian"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Administrator Pembelian"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Jumlah"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Tanggal:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Deskripsi"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Deskripsi:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Draf Pesanan Pembelian"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Pesanan Pembelian N°:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Total (di luar pajak):"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Komentar"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Tidak ada"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Tidak ada"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Batal"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Umum"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Info Lain"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Pembelian"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr ""
diff --git a/modules/purchase/locale/it.po b/modules/purchase/locale/it.po
new file mode 100644
index 0000000000..41cd7fee09
--- /dev/null
+++ b/modules/purchase/locale/it.po
@@ -0,0 +1,1155 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Stato di eccezione"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Acquisti"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr "Codice Cliente"
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr "Codici Cliente"
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Lead time"
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "Lead time"
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr "Codice Cliente"
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Controparte"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Controparte"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Lead time"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Fornitori"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Acquistabile"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Prezzo d'acquisto"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UDM acquisto"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Fornitori"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Acquistabile"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Udm acquisto"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Metodo di fatturazione"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr "Processa l'acquisto dopo"
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Sequenza di acquisto"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Metodo di fatturazione"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Sequenza di acquisto"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Dominio fatture"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Ricrea fatture"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Dominio movimenti"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Ricrea movimenti"
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Quantità effettiva"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Importo"
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Data di consegna"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Modifica data consegna"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Data di consegna"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Descrizione"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Da locazione"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Righe fattura"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Movimenti eseguiti"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "eccezione movimenti"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Movimenti non considerati"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Movimenti ricreati"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Nota"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "Prodotto del fornitore"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoria unità di misura prodotto"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Acquisto"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Stato ordine di acquisto"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Imposte"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "a locazione"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Unità"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Posizioni Unità"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Prezzo unitario"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Riga ordine di acquisto"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Imposta"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Movimento"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Riga ordine di acquisto"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Movimento"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Riga ordine di acquisto"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Codice"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "Lead time"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Prezzi"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Prezzo unitario"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Commento"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmed"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr "Contatto"
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "posizioni valuta"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Data di consegna"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Descrizione"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Indirizzo di fatturazione"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Metodo di fatturazione"
+
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Controparte di fatturazione"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Stato fattura"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Fatture"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Fatture non considerate"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Fatture ricreate"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Righe"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Numero"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Controparte"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Lingua Controparte"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Termine di pagamento"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Data acquisto"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Riferimento"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Resi su spedizioni"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Stato spedizione"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Spedizioni"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Imposta"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "ripostiglio fiscale "
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Totale"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr " "
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Ante imposta"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Fattura"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Acquisto"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Fattura"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Acquisto"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Reso a fornitore"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Acquisto"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Stato eccezione"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+"Il codice che la controparte come fornitore ha assegnato alla società come "
+"cliente."
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+"Il periodo di tolleranza durante il quale l'acquisto confermato può ancora essere resettato in bozza.\n"
+"Applicato solo se è attivata una coda di lavoro."
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Le fatture selezionate verranno ricreate. Le altre non verranno considerate."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"I movimenti selezionati verranno ricreati. Gli altri non verranno "
+"considerati."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "Spunta per modificare la data di consegna."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Quantità minima."
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "La data di consegna predefinita per ogni riga."
+
+#, fuzzy
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "Se vuoto viene usata la locazione di immagazzinamento"
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Fatture"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Controparti associate con gli acquisti"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Fornitori"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Prezzi"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Acquisti"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Acquisti"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Acquisti"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Acquisti"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Acquisti"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Resi"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Spedizioni"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Acquisto"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Acquisto"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confermato"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Eccezione"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Processing"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Preventivo"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+"Non è possibile riportare a bozza il movimento \"%s\" perché è stato "
+"generato da un ordine di acquisto."
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+"Non è possibile riportare a bozza il movimento \"%s\" perché è stato "
+"generato da un ordine di acquisto."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "Utente in azienda"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "Utente in azienda"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Acquisto"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Acquisto"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configurazione"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Fornitori"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Acquisti"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Acquisti"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Controparti associate con gli acquisti"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr "Codice cliente della controparte"
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Lead time"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Configurazione acquisti"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Gestire eccezione in fattura"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Gestore eccezione su spedizione"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Riga acquisto"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Riga acquisto - Imposta"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Riga acquisto - Movimento non considerato"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Riga acquisto - movimento non considerato"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Fornitore prodotto"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Prezzo fornitore prodotto"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Acquisto"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Acquisto - fattura non considerata"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Acquisto - fattura ricreata"
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Reso Acquisto"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Acquisto"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Amministratore acquisti"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Importo"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr "Codice Cliente:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Indirizzo di spedizione:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Descrizione"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Descrizione:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Bozza ordine di acquisto"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Ordine acquisto n."
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Riferimento"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Richiesta offerta n."
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Imposte"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Imposte:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Totale (escluse tasse):"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Totale:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Prezzo unitario"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "non considerati"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Ricreati"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Commento"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Riga"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Subtotale"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Titolo"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Basato su ordine"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Basato su spedizione"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Manuale"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Eccezione"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Nessuno"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Pagato"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "In attesa"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Eccezione"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Nessuno"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Ricevuto"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "In attesa"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confermato"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Fatto"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "In esecuzione"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Preventivo"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "non considerati"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Ricreato"
+
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Fornitori"
+
+#, fuzzy
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Scegliere le fatture da ricreare"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Scegliere il movimento da ricreare"
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Data di consegna:"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Generale"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Note"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Imposte"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Altre informazioni"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Acquisto"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Reso"
diff --git a/modules/purchase/locale/lo.po b/modules/purchase/locale/lo.po
new file mode 100644
index 0000000000..657beca14c
--- /dev/null
+++ b/modules/purchase/locale/lo.po
@@ -0,0 +1,1234 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "ສະຖານະຍົກເວັ້ນ"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "ການຈັດຊື້"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "ພາກສ່ວນ"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "ພາກສ່ວນ"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "ວັນທີຈັດຊື້"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "ມູນຄ່າ"
+
+#, fuzzy
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "ສະກຸນເງິນ"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "ເນື້ອໃນລາຍການ"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "ລາຍການເກັບເງິນ"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "ໝາຍເຫດ"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "ສັ່ງຊື້"
+
+#, fuzzy
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "ວັນທີຈັດຊື້"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "ອາກອນ"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "ຮູບແບບ"
+
+#, fuzzy
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "ໜ່ວຍ"
+
+#, fuzzy
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "ຫົວໜ່ວຍເສດ"
+
+#, fuzzy
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "ລາຄາຫົວໜ່ວຍ"
+
+#, fuzzy
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "ວັນທີຈັດຊື້"
+
+#, fuzzy
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "ອາກອນ"
+
+#, fuzzy
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "ເຄື່ອນໄຫວ"
+
+#, fuzzy
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "ວັນທີຈັດຊື້"
+
+#, fuzzy
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "ເຄື່ອນໄຫວ"
+
+#, fuzzy
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "ວັນທີຈັດຊື້"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "ລະຫັດແຂວງ"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "ສະກຸນເງິນ"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Prices"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "ສະກຸນເງິນ"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "ລາຄາຫົວໜ່ວຍ"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "ຄຳເຫັນ"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmed"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "ສະກຸນເງິນ"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "ໂຕເລກສະກຸນເງິນ"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "ເນື້ອໃນລາຍການ"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "ທີ່ຢູ່"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "ໃບເກັບເງິນ"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "ໃບເກັບເງິນ"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "ຮ່ວງ"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "ພາກສ່ວນ"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "ພາສາ"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "ວິທີການຈ່າຍ"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "ວັນທີຈັດຊື້"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "ເອກະສານອ້າງອີງ"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Shipments"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "ອາກອນ"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "ລວມທັງໝົດ"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "ມູນຄ່າບໍ່ລວມອາກອນ"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "ໃບເກັບເງິນ"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "ສັ່ງຊື້"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "ໃບເກັບເງິນ"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "ສັ່ງຊື້"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "ສັ່ງຊື້"
+
+#, fuzzy
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "ສະຖານະຍົກເວັ້ນ"
+
+#, fuzzy
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr ""
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "ໃບເກັບເງິນ"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Prices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "ການຈັດຊື້"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "ການຈັດຊື້"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "ການຈັດຊື້"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Returns"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "ສັ່ງຊື້"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "ສະຖານະຍົກເວັ້ນ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "ກຳລັງດຳເນີນການ"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "ສັ່ງຊື້"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "ສັ່ງຊື້"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "ຜູ້ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "ການຈັດຊື້"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "ການຈັດຊື້"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "ກຳລັງລາຍງາຍ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "ຕັ້ງຄ່າການຈັດຊື້"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+#, fuzzy
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+#, fuzzy
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "ວັນທີຈັດຊື້"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr ""
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Product Suppliers"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr ""
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "ຈັດຊື້"
+
+#, fuzzy
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "ຊື້ - ສ້າງໃບເກັບເງິນໃໝ່"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "ຊື້ - ສ້າງໃບເກັບເງິນໃໝ່"
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "ສັ່ງຊື້"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "ສັ່ງຊື້"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Purchase Administrator"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "ມູນຄ່າ"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "ວັນທີ:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "ເນື້ອໃນລາຍການ"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "ເນື້ອໃນລາຍການ"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "ໃບສັ່ງຊື້ຊົ່ວຄາວ ເລກທີ:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "ໃບສັ່ງຊື້ເລກທີ:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "ເອກະສານອ້າງອີງ"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "ອາກອນ"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "ອາກອນ"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "ລວມເງິນ (ບໍ່ລວມອາກອນ):"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "ລວມເງິນ:"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "ລາຄາຫົວໜ່ວຍ"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "ບໍ່ແຕະຕ້ອງ"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "ສ້າງຂຶ້ນໃໝ່"
+
+#, fuzzy
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "ຄຳເຫັນ"
+
+#, fuzzy
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "ຮ່ວງ"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "ໃສ່ເອົາເອງ"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "ບໍ່ມີ"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "ຈ່າຍແລ້ວ"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "ບໍ່ມີ"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກແລ້ວ"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirm"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "ກຳລັງດຳເນີນການ"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "ບໍ່ແຕະຕ້ອງ"
+
+#, fuzzy
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "ສ້າງຂຶ້ນໃໝ່"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "ທົ່ວໄປ"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "ໝາຍເຫດ"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "ອາກອນ"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "ຂໍ້ມູນອື່ນໆ"
+
+#, fuzzy
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "ສັ່ງຊື້"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "ຍົກເລີກ"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "ຕົກລົງ"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "ຍົກເລີກ"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "ຕົກລົງ"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "ຍົກເລີກ"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Returns"
diff --git a/modules/purchase/locale/lt.po b/modules/purchase/locale/lt.po
new file mode 100644
index 0000000000..202dcff237
--- /dev/null
+++ b/modules/purchase/locale/lt.po
@@ -0,0 +1,1147 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Išimtinė būsena"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Pirkimai"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Tiekimo laikas"
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "Tiekimo laikas"
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Kontrahentas"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Kontrahentas"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Tiekimo laikas"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Tiekėjai"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Perkama"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Pirkimo kaina"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Pirkimo mato vienetas"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Tiekėjai"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Perkama"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Pirkimo mato vienetas"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Sąskaita faktūra išrašoma"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Sąskaita faktūra išrašoma"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Pirkimo numeruotė"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Sąskaitų faktūrų domenas"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Atkurti sąskaitas faktūras"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Operacijų domenas"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Atkurti operacijas"
+
+#, fuzzy
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Kiekis"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Suma"
+
+#, fuzzy
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Valiuta"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Pristatymo data"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Taisyti pristatymo datą"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Pristatymo data"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Aprašymas"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Išsiuntimo vieta"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Sąskaitos faktūros eilutės"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Atliktos operacijos"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Operacijų išimtys"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Ignoruotos operacijos"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Atkurtos operacijos"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Pastaba"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "Tiekėjo produktas"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Prekės mato vieneto kategorija"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Pirkimas"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Pirkimo būsena"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Mokesčiai"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Gavimo vieta"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Tipas"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Mato vienetas"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Mato vieneto skaitmenų po kablelio skaičius"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Kaina"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Pirkimo eilutė"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "PVM"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Operacija"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Pirkimo eilutė"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Operacija"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Pirkimo eilutė"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Kodas"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Valiuta"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "Tiekimo laikas"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Pavadinimas"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Tiekėjas"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Kainos"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr "Variantas"
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Valiuta"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Tiekėjas"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Kaina"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Komentaras"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Patvirtinti"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Valiuta"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Valiutos skaitmenų po kablelio skaičius"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Pristatymo data"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Aprašymas"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Juridinis adresas"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Sąskaita faktūra išrašoma"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Sąskaitos faktūros būsena"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Sąskaitos faktūros būsena"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Sąskaitos faktūros"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Ignoruotos sąskaitos faktūros"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Atkurtos sąskaitos faktūros"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Eilutės"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Numeris"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Kontrahentas"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Kontrahento kalba"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Mokėjimo sąlyga"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Pirkimo data"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Pasiūlymas"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Nuoroda"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Grąžinimas"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Siuntimo būsena"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Siuntimai"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Būsena"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "PVM"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Išsaugota PVM vertė"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Viso su PVM"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Išsaugota suma su PVM"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Viso"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Išsaugota suma"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Sąskaita faktūra"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Pirkimas"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Sąskaita faktūra"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Pirkimas"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Tiekėjo grąžinimas"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Pirkimas"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Išimtinė būsena"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Tiekėjas"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Minimalus kiekis"
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr ""
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Sąskaitos faktūros"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Su pirkimais susieti kontrahentai"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Tiekėjai"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Kainos"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Pirkimai"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Pirkimai"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Pirkimai"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Pirkimai"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Pirkimai"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Grąžinimai"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Siuntimai"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Pirkimas"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Tvarkyti sąskaitos faktūros išimtinę situaciją"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Taisyti antraštės duomenis"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Pirkimas"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Tvarkyti siuntimo išimtinę situaciją"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Visi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Patvirtinti"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Juodraštis"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Išimtis"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Vykdomi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Pasiūlymas"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Patvirtinti"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Taisyti"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Tvarkyti sąskaitos faktūros išimtinę situaciją"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Tvarkyti siuntimo išimtinę situaciją"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Taisyti antraštės duomenis"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Vykdyti"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Pasiūlymas"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Pirkimas"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Pirkimas"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Tiekėjai"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Pirkimai"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Pirkimai"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Ataskaitos"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Su pirkimais susieti kontrahentai"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Tiekimo laikas"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Pirkimų nuostatos"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "Pirkimo nuostatų pirkimo būdas"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "Pirkimo nuostatų numeruotė"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Tvarkyti sąskaitos faktūros išimtinę situaciją"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Tvarkyti siuntimo išimtinę situaciją"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Pirkimo eilutė"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Pirkimo eilutė - PVM"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Pirkimo eilutė - ignoruotos operacijos"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Pirkimo eilutė - ignoruotos operacijos"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Prekės tiekėjai"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Prekės tiekėjo kaina"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Pirkimas"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Pirkimai - ignoruotos sąskaitos faktūros"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Pirkimai - atkurtos sąskaitos faktūros"
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Pirkimas"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Pirkimas"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Pirkimo valdymas"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Suma"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Siuntimo adresas:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Aprašymas"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Aprašymas:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Pirkimo juodraštis"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Pirkimo užsakymas Nr:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Nuoroda:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Užklausa pasiūlymui Nr.:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Mokesčiai"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "PVM:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Viso:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Viso su PVM:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Kaina"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignoruota"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Atkurta"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Komentaras"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Eilutė"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Tarpinė suma"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Antraštė"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Pagal užsakymą"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Pagal siuntimą"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Rankiniu būdu"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Išimtis"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Jokia"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Apmokėta"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "Laukianti apmokėjimo"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Išimtis"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Jokia"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Gauta"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "Laukianti apmokėjimo"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Anuliuota"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Patvirtinta"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Pabaigta"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Vykdoma"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Pasiūlymas"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignoruota"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Atkurta"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Tiekėjas"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Tiekėjai"
+
+#, fuzzy
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Pasirinkite sąskaitas faktūras atkūrimui"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Pasirinkite sąskaitas faktūras atkūrimui"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Pristatymo data"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Pagrindinis"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Pastabos"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Mokesčiai"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Kita informacija"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Pirkimas"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "Gerai"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "Gerai"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr "Taisyti"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Grąžinimai"
diff --git a/modules/purchase/locale/nl.po b/modules/purchase/locale/nl.po
new file mode 100644
index 0000000000..8a5e2edc7f
--- /dev/null
+++ b/modules/purchase/locale/nl.po
@@ -0,0 +1,1150 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Uitzonderingstoestand"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Inkoop"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr "Klantencode"
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr "Klantencodes"
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Doorlooptijd"
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "Doorlooptijden"
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr "Klantencode"
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Relatiie"
+
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Relatiie"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Doorlooptijd"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Leverancier"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Koopbaar"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Aankoopprijs"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "aankoop maateenheid"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Leverancier"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Koopbaar"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "aankoop maateenheid"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Factuur afhandeling"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr "Proces na aankoop"
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Volgorde aankoopnummer"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Factuur afhandeling"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Volgorde aankoopnummer"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Domein facturen"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Facturen opnieuw aanmaken"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Domein boekingen"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Boekingen opnieuw aanmaken"
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Werkelijke hoeveelheid"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Bedrag"
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Bezorgdatum"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Bewerk leverdatum"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "leverdatum"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Specificatie"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Van locatie"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Factuurregels"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Boekingen klaar"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Boekingen uitzondering"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Boekingen"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Genegeerde boekingen"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Opnieuw aangemaakte boekingen"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Aantekening"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "Product van de leverancier"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "product maateenheid categorie"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Inkoop"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Aankoopstaat"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr "Samenvatting"
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Belastingen"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Naar locatie"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalen eenheid"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Eenheidsprijs"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "aankooplijnen"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Belasting"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Boeking"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "aankooplijnen"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Boeking"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "aankooplijnen"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "Doorlooptijd"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "prijzen"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr "maateenheid"
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Eenheidsprijs"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr "maateenheid"
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Opmerking"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Bevestigd door"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr "Contact"
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Valuta decimalen"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Bezorgdatum"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Specificatie"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Factuuradres"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Factuur afhandeling"
+
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Factuur relatie (Invoice Party)"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Factuur status"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Verkoopfacturen"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Genegeerde facturen"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Opnieuw aangemaakte facturen"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Regels"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Boekingen"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Relatiie"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Taal relatie"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Betalingsvoorwaarden"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Aankoopdatum"
+
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Offerte gemaakt door"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Retourzendingen"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Levering status"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Leveringen"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Belasting"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Belastingcache"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Totaal"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "totaal contanten"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Onbelast"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "onbelaste contanten"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Verkoopfactuur"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Inkoop"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Verkoopfactuur"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Inkoop"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Leveranciersretour"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Inkoop"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Uitzonderingstoestand"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+"De code die de relatie als leverancier heeft toegewezen aan het bedrijf "
+"(klant)."
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+"De tijd vanaf de bevesting van get inkooporder tot het ontvangen van de goederen van de relatie waanner gebruikt als leverancier.\n"
+"Wordt gebruikt als er geen doorlooptijd is ingesteld op de productleverancier."
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+"De respijtperiode waarin bevestigde aankoop nog steeds kan worden gereset naar concept.\n"
+"Alleen toegepast als een wachtrij voor werknemers is geactiveerd."
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"De geselecteerde facturen worden opnieuw aangemaakt. De rest wordt "
+"genegeerd."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"De geselecteerde boekingen worden opnieuw aangemaakt. De rest wordt "
+"genegeerd."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "Vink aan om de leverdatum te bewerken."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+"De tijd tussen het bevestigen van de bestelling en het ontvangen van de producten.\n"
+"Indien leeg wordt de doorlooptijd van de leverancier gehanteerd."
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Minimale hoeveelheid."
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "De eenheid waarin de hoeveelheid is opgegeven."
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "De standaard leverdatum voor elke regel."
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "Indien leeg wordt de opslaglocatie gebruikt."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Facturen"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Relaties geassocieerd met aankopen"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Leverancier"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "prijzen"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Inkoop"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Inkoop"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Inkoop"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Boekingen"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Aankopen"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Aankopen"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Retours"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Leveringen"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Inkoop"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Uitzondering factuur afhandeling"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Wijzig koptekst"
+
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Aankoop retourneren"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "uitzondering verzendings afhandeling"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Uitzondering"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Verwerking"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Offerte"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+"U probeert de inkoop-maateenheid te wijzigen waarop de inkoopprijzen zijn "
+"gebaseerd."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+"U kunt de relatie \"%(party)s\" niet verwijderen terwijl ze aankopen in "
+"behandeling hebben bij bedrijf \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr "Om aankoop \"%(purchase)s\" te verwijderen, moet u deze annuleren."
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+"U kunt de factuur \"%(invoice)s\" niet terug naar concept zetten omdat ze "
+"gegenereerd is door een aankoop."
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+"Om regel \"%(line)s\" te verwijderen, moet u de aankoop \"%(purchase)s\" "
+"annuleren ,resetten of terugzetten naar consept."
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+"Om inkoop \"%(purchase)s\" te factureren, moet u een standaard "
+"kostenrekening configureren."
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+"Als u de hoofding van de aankoop \"% (purchase)s\" wilt wijzigen, moet deze "
+"in conceptstatus staan."
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+"U kunt boeking \"%(move)s\" niet terug zetten naar concept omdat deze is "
+"gegenereerd door een aankoop."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+"Om de aankoopfactuur \"%(purchase)s\" aan te maken , moet een kostenrekening"
+" gedefinieerd worden voor artikel \"%(product)s\"."
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+"Om de aankoop \"%(purchase)s\" uit te voeren , moet de opslaglocatie van de "
+"leverancier worden geconfigureerd op relatie \"%(party)s\"."
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+"Om een offerte te krijven voor aankoop \"%(purchase)s\", moet eerst een "
+"magazijn ingevoerd worden."
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Bevestigen"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Factuur uitzondering aanvragen"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Afleveren uitzondering aanvragen"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Wijzig koptekst"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "offerte"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Inkoop"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Inkoop"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Leverancier"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Inkoop"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Inkoop"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapporten"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Relaties geassocieerd met aankopen"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr "Relatie klant code"
+
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Doorlooptijd leverancier"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Aankoopconfiguratie"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "Aankoopconfiguratie Aankoopmethode"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "Aankoopconfiguratievolgorde"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Factuur uitzondering aanvragen"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Afleveren uitzondering aanvragen"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "aankooplijnen"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Inkooplijn -taks"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "aankooplijn - beweging genegeerd"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "aankooplijn - beweging genegeerd"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Productleverancier"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Product Leverancier Prijs"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Inkoop"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Aankoop - Genegeerde factuur"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Aankoop - opnieuw aangemaakte factuur(recreated invoice)"
+
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Aankoop retourneren"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Inkoop"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Aankoopbeheerder"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Bedrag"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr "Klantencode:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Datum:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Leveringsadres:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Specificatie"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Betreft:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Ontwerp inkooporder"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Bestelnummer:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Referentie:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Offerte-aanvraagnummer:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Belastingen"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Belastingen:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Totaal (excl. belasting):"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Totaal:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Eenheidsprijs"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Genegeerd"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Opnieuw aangemaakt"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Opmerking"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Regel"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Subtotaal"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Titel"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Op basis van bestelling"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Op basis van verzending"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Handmatig"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Uitzondering"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Betaald"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Uitzondering"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Ontvangen"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Verwerking"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Offerte"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Genegeerd"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Opnieuw aangemaakt"
+
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Leverancier"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Kies facturen om opnieuw aan te maken:"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Kies boeking om opnieuw aan te maken:"
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "leverdatum:"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Aantekeningen"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Belastingen"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Aanvullende informatie"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Inkoop"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr "Weet u zeker dat u deze aanko(o)p(en) wilt retourneren?"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "Ok"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "Ok"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr "Wijzigen"
+
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Retours"
diff --git a/modules/purchase/locale/pl.po b/modules/purchase/locale/pl.po
new file mode 100644
index 0000000000..a0b4270460
--- /dev/null
+++ b/modules/purchase/locale/pl.po
@@ -0,0 +1,1167 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Zakupy"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Strona"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Firma"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Strona"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Dostawcy"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Cena zakupu"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Jm zakupu"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Dostawcy"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Jm zakupu"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Sekwencja zakupu"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Sekwencja zakupu"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Ilość"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Firma"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Waluta"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Data dostawy"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Edytuj datę dostawy"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Data dostawy"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Z lokalizacji"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Wiersze faktury"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Notatka"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Kategoria jm produktu"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Zakup"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Stan zakupu"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Podatki"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Do lokalizacji"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Jednostka"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Cyfry jednostki"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Cena jednostkowa"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Wiersz zakupu"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Podatek"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Ruch"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Wiersz zakupu"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Ruch"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Wiersz zakupu"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Kod"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Waluta"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Dostawca"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Ceny"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Waluta"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Dostawca"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Cena jednostkowa"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Komentarz"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Firma"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmed"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Waluta"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Cyfry waluty"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Data dostawy"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Adres faktury"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Faktura"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Faktury"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Wiersze"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Strona"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Język strony"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Termin płatności"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Data zakupu"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Referencja"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Zwroty wysyłki"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Stan wysyłki"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Wysyłki"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Podatek"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Razem"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Faktura"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Zakup"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Faktura"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Zakup"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Zwrot do dostawcy"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Zakup"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Dostawca"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Minimalna ilość"
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "Domyślna data dostawy dla każdego wiersza."
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Dostawcy"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Prices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Returns"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Zakup"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Wyjątek"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Processing"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Dostawcy"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Zakupy"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Dostawca"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Konfiguracja zakupu"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+#, fuzzy
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Wiersz zakupu"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Wiersz zakupu - Podatek"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Wiersz zakupu - Zignorowany ruch"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Wiersz zakupu - Zignorowany ruch"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Dostawca produktów"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Ceny dostawcy produktów"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Zakup"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Zakup - Zignorowana faktura"
+
+#, fuzzy
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Zakup - Zignorowana faktura"
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Zakup"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Purchase Administrator"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Adres dostawy:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Opis:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Referencja:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Podatki"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Podatki:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Razem netto:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Razem:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Cena jednostkowa"
+
+#, fuzzy
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Zignorowano"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Komentarz"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Wiersz"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Tytuł"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Wyjątek"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Brak"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Wyjątek"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Brak"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Odebrano"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Potwierdzono"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Processing"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Zignorowano"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Dostawca"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Dostawcy"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Data dostawy"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Ogólne"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Notatki"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Podatki"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Inne informacje"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Zakup"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Anuluj"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Anuluj"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Anuluj"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Returns"
diff --git a/modules/purchase/locale/pt.po b/modules/purchase/locale/pt.po
new file mode 100644
index 0000000000..b71c41cf7e
--- /dev/null
+++ b/modules/purchase/locale/pt.po
@@ -0,0 +1,1177 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estado da exceção"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Tempo de Espera"
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "Tempo de Espera"
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Parceiro"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Empresa"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Parceiro"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Tempo de Espera"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Fornecedores"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Comprável"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Preço de Compra"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UDM de compra"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Fornecedores"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Comprável"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "UM de compra"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Método da fatura"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Sequência de Compra"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Método da fatura"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Sequência de Compra"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Faturas do domínio"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Recriar faturas"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Movimentações no domínio"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Recriar movimentações"
+
+#, fuzzy
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Quantidade"
+
+#, fuzzy
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Empresa"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Moeda"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Data de entrega"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Editar Data de Entrega"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Data de entrega"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Descrição"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Origem"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Linhas da fatura"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Movimentações feitas"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Exceção nas movimentações"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Movimentações ignoradas"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Recriar movimentações"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Observação"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoria de UDM do produto"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Estado da Compra"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Impostos"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Destino"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Unidade"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Dígitos da unidade"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Preço unitário"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Linha da compra"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Impostos"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Movimentação"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Linha da compra"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Movimentação"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Linha da compra"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Moeda"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "Tempo de Espera"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Fornecedor"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Preços"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Moeda"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Fornecedor"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Preço unitário"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Comentário"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Empresa"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmed"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Moeda"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Dígitos da moeda"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Data de entrega"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Descrição"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Endereço para faturamento"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Método da fatura"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Estado da fatura"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Estado da fatura"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Faturas"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Faturas ignoradas"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Faturas Recriadas"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Linhas"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Parceiro"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Língua do parceiro"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Prazo de pagamento"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Data da compra"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Referência"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Retornos de Remessas"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Estado da Remessa"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Remessas"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Impostos"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Tributos pré-calculados"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Total"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Total pré-calculado"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Não tributado"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Base pré-calculada isenta"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Fatura"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Fatura"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Retorno do Forenecedor"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Estado da exceção"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Fornecedor"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"As faturas escolhidas serão recriadas. As demais faturas serão ignoradas"
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"As movimentações selecionadas serão recriadas. As demais serão ignoradas."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "Marque para editar a data de entrega."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Quantidade mínima"
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "A data de entrega padrão para cada linha."
+
+#, fuzzy
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "Se vazio, a localização de Armazenamento será usada"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Fornecedores"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Prices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Returns"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Compra"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Exceção"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Processing"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+"Não é possível restaurar para rascunho o movimento \"%s\" porque ele foi "
+"gerado por uma compra."
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+"Não é possível restaurar para rascunho o movimento \"%s\" porque ele foi "
+"gerado por uma compra."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Fornecedores"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Compras"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Tempo de Espera"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Configuração da compra"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "Configurações de Compra Método de Compra"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "Configurações de Compra Sequẽncia"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Exceção da fatura do punho"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Manejar Exceção da Remessa"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Linha da compra"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Linha da compra - imposto"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Linha da compra - movimento ignorado"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Linha da compra - movimento ignorado"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Fornecedor do produto"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Preço do fornecedor do produto"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Compra - fatura ignorada"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Compra - fatura recriada"
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Compra"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Purchase Administrator"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Quantidade"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Endereço de Entrega:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Descrição"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Descrição:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Rascunho de Ordem de Compra"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Ordem de Compra nº:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Referência:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Pedido de Cotação n°:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Impostos"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Tributos:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Total (sem tributos):"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Total:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Preço unitário"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Recriado"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Comentário"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Linha"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Subtotal"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Título"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Baseado na ordem"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Baseado Na Remessa"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Manual"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Exceção"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Nenhum"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Pago"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "Espera"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Exceção"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Nenhum"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Recebido"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "Espera"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Processando"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Cotação"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Ignorado"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Recriado"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Fornecedor"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Fornecedores"
+
+#, fuzzy
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Escolha as faturas a recriar"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Escolha a movimentação a recriar"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Data de entrega"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Geral"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Observações"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Impostos"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Outras Informações"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Compra"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "OK"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Returns"
diff --git a/modules/purchase/locale/ro.po b/modules/purchase/locale/ro.po
new file mode 100644
index 0000000000..91e1bc5ef8
--- /dev/null
+++ b/modules/purchase/locale/ro.po
@@ -0,0 +1,1119 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Parte"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Companie"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Parte"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr ""
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Suma"
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Data de livrare"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Descriere"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr ""
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr ""
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr ""
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Impozit"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Mișcare"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Cod"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Valută"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Furnizor"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr ""
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Valută"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Zecimale valută"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Data de livrare"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Descriere"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Parte Facturata"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Stare Factura"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Facturi"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Facturi ignorate"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Rânduri"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Mișcări"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Număr"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Parte"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Limba Părții"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Termen de plata"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr ""
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Impozit"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr ""
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr ""
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr ""
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Facturi"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Furnizor"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configurație"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Retururi"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Transporturi"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Gestionare Excepție Factura"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modificați antetul"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Returnări"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Gestioneaza Excepție de expediere"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configurare"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Furnizor"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Achiziții"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configurare"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Raportare"
+
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr ""
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Furnizor"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr ""
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr ""
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr ""
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr ""
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr ""
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr ""
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Returnări"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Suma"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Descriere"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Descriere:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr ""
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Returnări"
diff --git a/modules/purchase/locale/ru.po b/modules/purchase/locale/ru.po
new file mode 100644
index 0000000000..819f79b9d5
--- /dev/null
+++ b/modules/purchase/locale/ru.po
@@ -0,0 +1,1186 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Состояние ситуации"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Покупки"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Контрагент"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Организация"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Контрагент"
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Поставщики"
+
+#, fuzzy
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Для покупки"
+
+#, fuzzy
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Строка покупки"
+
+#, fuzzy
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Покупка, ед. измерения"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Поставщики"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Для покупки"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Покупка, ед. измерения"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Метод инвойса"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Метод инвойса"
+
+#, fuzzy
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Домен инвойсов"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Создать заново инвойсы"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Домен проводок"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Создать заново проводки"
+
+#, fuzzy
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Сумма"
+
+#, fuzzy
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Организация"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Валюта"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Дата доставки"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Дата доставки"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Из местоположения"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Строки инвойса"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Перемещения выполнены"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Особые ситуации перемещения"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Игнорированные проводки"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Созданные заново проводки"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Комментарий"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Категория ед. измерения продукции"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Покупки"
+
+#, fuzzy
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Дата покупки"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Налоги"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "В местоположение"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Тип"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "Единица измерения"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Кол-во цифр после запятой"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Цена за единицу"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Строка покупки"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Налог"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Перемещение"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Строка покупки"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Перемещение"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Строка покупки"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Код"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Валюта"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Поставщик"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Цены"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Валюта"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Поставщик"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Цена за единицу"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Комментарии"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Организация"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmed"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Валюта"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Кол-во цифр валюты"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Дата доставки"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Адрес для инвойса"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Метод инвойса"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Состояние инвойса"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Состояние инвойса"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Инвойсы"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Игнорированные инвойсы"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Созданные заново инвойсы"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Строки"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Контрагент"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Язык контрагента"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Правило оплаты"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Дата покупки"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Ссылка"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Возврат"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Состояние доставки"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Доставка"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Состояние"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Налог"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Облагаемые налогом"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Итого"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Итого"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Необлагаемые"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Необлагаемые налогом"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Инвойс"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Покупки"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Инвойс"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Покупки"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr ""
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Покупки"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Состояние ситуации"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Поставщик"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+"Выбранные инвойсы будут созданы заново. Остальные будут проигнорированы."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+"Выбранные перемещения будут созданы заново. Остальные будут проигнорированы."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Минимальное кол-во"
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr ""
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Поставщики"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Цены"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Покупки"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Returns"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Покупки"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Особая ситуация"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Обслуживание"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+"Вы не можете сбросить в черновик перемещение \"%s\" так как оно создано из "
+"покупки."
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+"Вы не можете сбросить в черновик перемещение \"%s\" так как оно создано из "
+"покупки."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Поставщики"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Покупки"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Поставщик"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Конфигурация покупок"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Обработка особых ситуаций инвойса"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Обработка особых ситуаций доставки"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Строка покупки"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Строка покупки - Налоги"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Строка покупки - Игнорированные перемещения"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Строка покупки - Игнорированные перемещения"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Поставщик продукции"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Цена поставщика продукции"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Покупки"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Покупки - Игнорированные инвойсы"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Покупки - Созданные заново инвойсы"
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Покупки"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Purchase Administrator"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Сумма"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Дата:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Описание:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Черновой заказ на покупку"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Заказ на покупку №:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Ссылка"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Запрос на Котировку №:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Налоги"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Налоги:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Итого (без налогов):"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Итого:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Цена за единицу"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Игнорируется"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Создано заново"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Комментарии"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Строка"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Подитог"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Заголовок"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Основанные на заказе"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Основанные на доставке"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Ручной"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Особая ситуация"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Оплачен"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "Ожидание"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Особая ситуация"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Поступило"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "Ожидание"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Отменено"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Подтвержденно"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Обслуживание"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Котировка"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Игнорируется"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Создано заново"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Поставщик"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Поставщики"
+
+#, fuzzy
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Выберите инвойсы для пересоздания"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Выберите проводки для пересоздания"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Дата доставки"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Основной"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Комментарии"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Налоги"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Другая информация"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Покупки"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Отменить"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "Ок"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Отменить"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "Ок"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Отменить"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Returns"
diff --git a/modules/purchase/locale/sl.po b/modules/purchase/locale/sl.po
new file mode 100644
index 0000000000..eeb723429b
--- /dev/null
+++ b/modules/purchase/locale/sl.po
@@ -0,0 +1,1175 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Pridržano"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Nabavni nalogi"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Dobavni rok"
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "Dobavni rok"
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "Partner"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "Družba"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "Partner"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "Dobavni rok"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "Dobavitelji"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "Za nabavo"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "Nabavna cena"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Nabavna ME"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "Dobavitelji"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "Za nabavo"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "Nabavna ME"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Način obračuna"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Štetje nabavnih nalogov"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "Način obračuna"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "Štetje nabavnih nalogov"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "Vključeni računi"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "Ponovno izdelani računi"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "Vključen promet"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "Ponovno izdelan promet"
+
+#, fuzzy
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "Količina"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "Znesek"
+
+#, fuzzy
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "Družba"
+
+#, fuzzy
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "Datum dostave"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "Popravek datuma dostave"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "Datum dostave"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "Iz lokacije"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "Postavke računa"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "Zaključen promet"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "Pridržani promet"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "Prezrt promet"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "Ponovno izdelan promet"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "Opomba"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Katerogija EM izdelka"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Nabavni nalog"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "Stanje nabave"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "Davki"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "Na lokacijo"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "enota"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "Decimalke"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "Cena"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "Nabavna postavka"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "Davek"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "Promet"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Nabavna postavka"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "Promet"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "Nabavna postavka"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "Šifra"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "Dobavni rok"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "Dobavitelj"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Cene"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "Dobavitelj"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "Cena"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "Opomba"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "Družba"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmed"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "Decimalke"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "Datum dostave"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "Plačnik"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "Način obračuna"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Stanje računa"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "Stanje računa"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Računi"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "Prezrti računi"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "Ponovno izdelani računi"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "Postavke"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "Partner"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "Jezik partnerja"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "Plačilni rok"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "Nabavljeno"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "Sklic"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "Vrnjene prevzemnice"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "Stanje pošiljke"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Pošiljke"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "Davek"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "Davek predpomnjen"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "Skupaj"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "Skupaj predpomnjeno"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "Neobdavčeno"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "Neobdavčeno predpomnjeno"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Račun"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Nabavni nalog"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Račun"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Nabavni nalog"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "Vrnjen prevzem"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Nabavni nalog"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "Pridržano"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "Dobavitelj"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr "Izbrani računi bodo ponovno izdelani, ostali bodo prezrti."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr "Izbran promet bo ponovno izdelan, ostalo bo prezrto."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "Označite, če popravljate datum dostave."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "Minimalna količina"
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "Privzet datum dostave za postavko."
+
+#, fuzzy
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "Če je prazno, se uporablja lokacija shrambe"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Dobavitelji"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Prices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Returns"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Nabavni nalog"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "Pridržano"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Processing"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+"Prometa \"%s\", izdelanega iz nabavnega naloga, ni možno prestaviti v stanje"
+" priprave."
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+"Prometa \"%s\", izdelanega iz nabavnega naloga, ni možno prestaviti v stanje"
+" priprave."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Dobavitelji"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Nabavni nalogi"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Dobavni rok"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Nabavna konfiguracija"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "Konfiguracija načina nabave"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "Konfiguacija štetja nabavnih nalogov"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Obravnava pridržanih računov"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Obravnava pridržanih prevzemnic"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "Nabavna postavka"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "Nabavna postavka - Davek"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Nabavna postavka - Prezrt promet"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "Nabavna postavka - Obnovljen promet"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Dobavitelj izdelkov"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "Dobaviteljeva cena"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Nabavni nalog"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "Nabavni nalog - Prezrt račun"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "Nabavni nalog - Ponovno izdelan račun"
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Nabavni nalog"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Purchase Administrator"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "Znesek"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "Datum:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "Prejemnik"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "Opis:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "Osnutek nabavnega naloga"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "Nabavni nalog št.:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "Sklic:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "Zahtevek za ponudbo št.:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "Davki"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "Davki:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "Skupaj (brez davkov):"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "Skupaj:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "Cena"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Prezrto"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Ponovno izdelano"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "Opomba"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "Postavka"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "Vmesna vsota"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "Napis"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "Na podlagi naloga"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "Na podlagi pošiljke"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "Ročno"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "Pridržano"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "Brez"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "Plačano"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "Čakajoče"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "Pridržano"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "Brez"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "Prejeto"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "Čakajoče"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Potrjeno"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Obdelava"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Ponudba"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "Prezrto"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "Ponovno izdelano"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Dobavitelj"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "Dobavitelji"
+
+#, fuzzy
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "Izbor računov za ponovno izdelavo"
+
+#, fuzzy
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "Izbor prometa za ponovno izdelavo"
+
+#, fuzzy
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "Datum dostave"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "Splošno"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "Opombe"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "Davki"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "Drugo"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Nabavni nalog"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Prekliči"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "V redu"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Prekliči"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "V redu"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Prekliči"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Returns"
diff --git a/modules/purchase/locale/tr.po b/modules/purchase/locale/tr.po
new file mode 100644
index 0000000000..cc4df55283
--- /dev/null
+++ b/modules/purchase/locale/tr.po
@@ -0,0 +1,1154 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr ""
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr ""
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr ""
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr ""
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr ""
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr ""
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr ""
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr ""
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr ""
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr ""
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr ""
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr ""
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr ""
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr ""
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "Prices"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "Confirmed"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr ""
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "Invoices"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr ""
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr ""
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr ""
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "Shipments"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr ""
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr ""
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr ""
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr ""
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "Invoices"
+
+#, fuzzy
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr ""
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr ""
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr ""
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr ""
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "Invoices"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "Product Suppliers"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "Prices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "Returns"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "Confirmed"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "Processing"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "Modify Header"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "Process"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "Product Suppliers"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "Parties associated to Purchases"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "Product Suppliers"
+
+#, fuzzy
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "Purchase Configuration"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr ""
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "Handle Invoice Exception"
+
+#, fuzzy
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "Handle Shipment Exception"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr ""
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr ""
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "Product Suppliers"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr ""
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "Purchase"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "Purchase Administrator"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr ""
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr ""
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "Confirm"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "Processing"
+
+#, fuzzy
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr ""
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "Product Suppliers"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr ""
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr ""
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr ""
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "Purchases"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "Returns"
diff --git a/modules/purchase/locale/zh_CN.po b/modules/purchase/locale/zh_CN.po
new file mode 100644
index 0000000000..6f78ec0904
--- /dev/null
+++ b/modules/purchase/locale/zh_CN.po
@@ -0,0 +1,1126 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:account.invoice,purchase_exception_state:"
+msgid "Exception State"
+msgstr "异常状态"
+
+msgctxt "field:account.invoice,purchases:"
+msgid "Purchases"
+msgstr "采购"
+
+msgctxt "field:party.party,customer_code:"
+msgid "Customer Code"
+msgstr "客户代码"
+
+msgctxt "field:party.party,customer_codes:"
+msgid "Customer Codes"
+msgstr "客户代码"
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "交付时间"
+
+#, fuzzy
+msgctxt "field:party.party,supplier_lead_times:"
+msgid "Lead Times"
+msgstr "交付时间"
+
+msgctxt "field:party.party.customer_code,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:party.party.customer_code,customer_code:"
+msgid "Customer Code"
+msgstr "客户代码"
+
+msgctxt "field:party.party.customer_code,party:"
+msgid "Party"
+msgstr "参与者"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,company:"
+msgid "Company"
+msgstr "公司"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,party:"
+msgid "Party"
+msgstr "参与者"
+
+#, fuzzy
+msgctxt "field:party.party.supplier_lead_time,supplier_lead_time:"
+msgid "Lead Time"
+msgstr "交付时间"
+
+msgctxt "field:product.product,product_suppliers:"
+msgid "Suppliers"
+msgstr "供应商"
+
+msgctxt "field:product.product,purchasable:"
+msgid "Purchasable"
+msgstr "可采购"
+
+msgctxt "field:product.product,purchase_price_uom:"
+msgid "Purchase Price"
+msgstr "买价"
+
+msgctxt "field:product.product,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "采购计量单位"
+
+msgctxt "field:product.template,product_suppliers:"
+msgid "Suppliers"
+msgstr "供应商"
+
+msgctxt "field:product.template,purchasable:"
+msgid "Purchasable"
+msgstr "可采购"
+
+msgctxt "field:product.template,purchase_uom:"
+msgid "Purchase UOM"
+msgstr "采购计量单位"
+
+msgctxt "field:purchase.configuration,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "发票法"
+
+msgctxt "field:purchase.configuration,purchase_process_after:"
+msgid "Process Purchase after"
+msgstr "采购后的流程"
+
+msgctxt "field:purchase.configuration,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "采购序列"
+
+msgctxt ""
+"field:purchase.configuration.purchase_method,purchase_invoice_method:"
+msgid "Invoice Method"
+msgstr "发票法"
+
+msgctxt "field:purchase.configuration.sequence,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:purchase.configuration.sequence,purchase_sequence:"
+msgid "Purchase Sequence"
+msgstr "采购序列"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,domain_invoices:"
+msgid "Domain Invoices"
+msgstr "域发票"
+
+msgctxt "field:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid "Recreate Invoices"
+msgstr "重新创建发票"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,domain_moves:"
+msgid "Domain Moves"
+msgstr "域移动"
+
+msgctxt "field:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "Recreate Moves"
+msgstr "重新创建移动"
+
+msgctxt "field:purchase.line,actual_quantity:"
+msgid "Actual Quantity"
+msgstr "实际数量"
+
+msgctxt "field:purchase.line,amount:"
+msgid "Amount"
+msgstr "合计"
+
+msgctxt "field:purchase.line,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:purchase.line,currency:"
+msgid "Currency"
+msgstr "货币"
+
+msgctxt "field:purchase.line,delivery_date:"
+msgid "Delivery Date"
+msgstr "交货日期"
+
+msgctxt "field:purchase.line,delivery_date_edit:"
+msgid "Edit Delivery Date"
+msgstr "编辑交货日期"
+
+msgctxt "field:purchase.line,delivery_date_store:"
+msgid "Delivery Date"
+msgstr "交货日期"
+
+msgctxt "field:purchase.line,description:"
+msgid "Description"
+msgstr "说明"
+
+msgctxt "field:purchase.line,from_location:"
+msgid "From Location"
+msgstr "从位置"
+
+msgctxt "field:purchase.line,invoice_lines:"
+msgid "Invoice Lines"
+msgstr "发票明细"
+
+msgctxt "field:purchase.line,move_done:"
+msgid "Moves Done"
+msgstr "完成移动"
+
+msgctxt "field:purchase.line,move_exception:"
+msgid "Moves Exception"
+msgstr "移动异常"
+
+msgctxt "field:purchase.line,moves:"
+msgid "Moves"
+msgstr "移动"
+
+msgctxt "field:purchase.line,moves_ignored:"
+msgid "Ignored Moves"
+msgstr "已忽略的移动"
+
+msgctxt "field:purchase.line,moves_recreated:"
+msgid "Recreated Moves"
+msgstr "已经重新创建的移动"
+
+msgctxt "field:purchase.line,note:"
+msgid "Note"
+msgstr "注释"
+
+msgctxt "field:purchase.line,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:purchase.line,product_supplier:"
+msgid "Supplier's Product"
+msgstr "供应商产品"
+
+msgctxt "field:purchase.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "产品计量单位类别"
+
+msgctxt "field:purchase.line,purchase:"
+msgid "Purchase"
+msgstr "采购"
+
+msgctxt "field:purchase.line,purchase_state:"
+msgid "Purchase State"
+msgstr "购买状态"
+
+msgctxt "field:purchase.line,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:purchase.line,summary:"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:purchase.line,taxes:"
+msgid "Taxes"
+msgstr "税"
+
+msgctxt "field:purchase.line,to_location:"
+msgid "To Location"
+msgstr "到位置"
+
+msgctxt "field:purchase.line,type:"
+msgid "Type"
+msgstr "类型"
+
+msgctxt "field:purchase.line,unit:"
+msgid "Unit"
+msgstr "计量单位"
+
+msgctxt "field:purchase.line,unit_digits:"
+msgid "Unit Digits"
+msgstr "计量单位有效数字"
+
+msgctxt "field:purchase.line,unit_price:"
+msgid "Unit Price"
+msgstr "单位价格"
+
+msgctxt "field:purchase.line-account.tax,line:"
+msgid "Purchase Line"
+msgstr "采购明细"
+
+msgctxt "field:purchase.line-account.tax,tax:"
+msgid "Tax"
+msgstr "税款"
+
+msgctxt "field:purchase.line-ignored-stock.move,move:"
+msgid "Move"
+msgstr "移动"
+
+msgctxt "field:purchase.line-ignored-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "采购明细"
+
+msgctxt "field:purchase.line-recreated-stock.move,move:"
+msgid "Move"
+msgstr "移动"
+
+msgctxt "field:purchase.line-recreated-stock.move,purchase_line:"
+msgid "Purchase Line"
+msgstr "采购明细"
+
+msgctxt "field:purchase.product_supplier,code:"
+msgid "Code"
+msgstr "代码"
+
+msgctxt "field:purchase.product_supplier,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:purchase.product_supplier,currency:"
+msgid "Currency"
+msgstr "货币"
+
+msgctxt "field:purchase.product_supplier,lead_time:"
+msgid "Lead Time"
+msgstr "交付时间"
+
+msgctxt "field:purchase.product_supplier,name:"
+msgid "Name"
+msgstr "名称"
+
+msgctxt "field:purchase.product_supplier,party:"
+msgid "Supplier"
+msgstr "供货商"
+
+msgctxt "field:purchase.product_supplier,prices:"
+msgid "Prices"
+msgstr "价格"
+
+msgctxt "field:purchase.product_supplier,product:"
+msgid "Variant"
+msgstr "变体"
+
+msgctxt "field:purchase.product_supplier,template:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:purchase.product_supplier,uom:"
+msgid "UOM"
+msgstr "计量单位"
+
+msgctxt "field:purchase.product_supplier.price,currency:"
+msgid "Currency"
+msgstr "货币"
+
+msgctxt "field:purchase.product_supplier.price,product_supplier:"
+msgid "Supplier"
+msgstr "供货商"
+
+msgctxt "field:purchase.product_supplier.price,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:purchase.product_supplier.price,unit_price:"
+msgid "Unit Price"
+msgstr "单价"
+
+msgctxt "field:purchase.product_supplier.price,uom:"
+msgid "UOM"
+msgstr "计量单位"
+
+msgctxt "field:purchase.purchase,comment:"
+msgid "Comment"
+msgstr "说明"
+
+msgctxt "field:purchase.purchase,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:purchase.purchase,confirmed_by:"
+msgid "Confirmed By"
+msgstr "确认者"
+
+msgctxt "field:purchase.purchase,contact:"
+msgid "Contact"
+msgstr "联系"
+
+msgctxt "field:purchase.purchase,currency:"
+msgid "Currency"
+msgstr "货币"
+
+msgctxt "field:purchase.purchase,currency_digits:"
+msgid "Currency Digits"
+msgstr "货币有效数字"
+
+msgctxt "field:purchase.purchase,delivery_date:"
+msgid "Delivery Date"
+msgstr "交货日期"
+
+msgctxt "field:purchase.purchase,description:"
+msgid "Description"
+msgstr "描述"
+
+msgctxt "field:purchase.purchase,invoice_address:"
+msgid "Invoice Address"
+msgstr "发票地址"
+
+msgctxt "field:purchase.purchase,invoice_method:"
+msgid "Invoice Method"
+msgstr "发票法"
+
+msgctxt "field:purchase.purchase,invoice_party:"
+msgid "Invoice Party"
+msgstr "发票单位"
+
+msgctxt "field:purchase.purchase,invoice_state:"
+msgid "Invoice State"
+msgstr "发票状态"
+
+msgctxt "field:purchase.purchase,invoices:"
+msgid "Invoices"
+msgstr "发票"
+
+msgctxt "field:purchase.purchase,invoices_ignored:"
+msgid "Ignored Invoices"
+msgstr "忽略的发票"
+
+msgctxt "field:purchase.purchase,invoices_recreated:"
+msgid "Recreated Invoices"
+msgstr "重开的发票"
+
+msgctxt "field:purchase.purchase,lines:"
+msgid "Lines"
+msgstr "明细"
+
+msgctxt "field:purchase.purchase,moves:"
+msgid "Moves"
+msgstr "移动"
+
+msgctxt "field:purchase.purchase,number:"
+msgid "Number"
+msgstr "采购编号"
+
+msgctxt "field:purchase.purchase,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:purchase.purchase,party:"
+msgid "Party"
+msgstr "参与者"
+
+msgctxt "field:purchase.purchase,party_lang:"
+msgid "Party Language"
+msgstr "参与者的语言"
+
+msgctxt "field:purchase.purchase,payment_term:"
+msgid "Payment Term"
+msgstr "付款条件"
+
+msgctxt "field:purchase.purchase,purchase_date:"
+msgid "Purchase Date"
+msgstr "采购日期"
+
+msgctxt "field:purchase.purchase,quoted_by:"
+msgid "Quoted By"
+msgstr "报价者"
+
+msgctxt "field:purchase.purchase,reference:"
+msgid "Reference"
+msgstr "参考"
+
+msgctxt "field:purchase.purchase,shipment_returns:"
+msgid "Shipment Returns"
+msgstr "发货退货"
+
+msgctxt "field:purchase.purchase,shipment_state:"
+msgid "Shipment State"
+msgstr "发货状态"
+
+msgctxt "field:purchase.purchase,shipments:"
+msgid "Shipments"
+msgstr "发货"
+
+msgctxt "field:purchase.purchase,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:purchase.purchase,tax_amount:"
+msgid "Tax"
+msgstr "税"
+
+msgctxt "field:purchase.purchase,tax_amount_cache:"
+msgid "Tax Cache"
+msgstr "税收缓存"
+
+msgctxt "field:purchase.purchase,total_amount:"
+msgid "Total"
+msgstr "合计"
+
+msgctxt "field:purchase.purchase,total_amount_cache:"
+msgid "Total Cache"
+msgstr "总缓存"
+
+msgctxt "field:purchase.purchase,untaxed_amount:"
+msgid "Untaxed"
+msgstr "免税"
+
+msgctxt "field:purchase.purchase,untaxed_amount_cache:"
+msgid "Untaxed Cache"
+msgstr "免税缓存"
+
+msgctxt "field:purchase.purchase,warehouse:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "发票"
+
+msgctxt "field:purchase.purchase-ignored-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "采购"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,invoice:"
+msgid "Invoice"
+msgstr "发票"
+
+msgctxt "field:purchase.purchase-recreated-account.invoice,purchase:"
+msgid "Purchase"
+msgstr "采购"
+
+msgctxt "field:stock.location,supplier_return_location:"
+msgid "Supplier Return"
+msgstr "供应商退货"
+
+msgctxt "field:stock.move,purchase:"
+msgid "Purchase"
+msgstr "采购"
+
+msgctxt "field:stock.move,purchase_exception_state:"
+msgid "Exception State"
+msgstr "异常状态"
+
+msgctxt "field:stock.move,supplier:"
+msgid "Supplier"
+msgstr "供应商"
+
+msgctxt "help:party.party,customer_code:"
+msgid ""
+"The code the party as supplier has assigned to the company as customer."
+msgstr "参与者代码已做为客户分配给公司."
+
+msgctxt "help:party.party,supplier_lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the goods from the party when used as a supplier.\n"
+"Used if no lead time is set on the product supplier."
+msgstr ""
+
+msgctxt "help:purchase.configuration,purchase_process_after:"
+msgid ""
+"The grace period during which confirmed purchase can still be reset to draft.\n"
+"Applied only if a worker queue is activated."
+msgstr ""
+"采购项目已确认状态可以重置为草稿状态的宽限期\n"
+"仅在激活工作队列时应用."
+
+msgctxt "help:purchase.handle.invoice.exception.ask,recreate_invoices:"
+msgid ""
+"The selected invoices will be recreated. The other ones will be ignored."
+msgstr "已经选择的发票将重开,忽略其它未选择的发票."
+
+msgctxt "help:purchase.handle.shipment.exception.ask,recreate_moves:"
+msgid "The selected moves will be recreated. The other ones will be ignored."
+msgstr "已经选择的移动将被重新创建,忽略其它未选择的."
+
+msgctxt "help:purchase.line,delivery_date_edit:"
+msgid "Check to edit the delivery date."
+msgstr "选中后编辑交货日期."
+
+msgctxt "help:purchase.product_supplier,lead_time:"
+msgid ""
+"The time from confirming the purchase order to receiving the products.\n"
+"If empty the lead time of the supplier is used."
+msgstr ""
+
+msgctxt "help:purchase.product_supplier.price,quantity:"
+msgid "Minimal quantity."
+msgstr "最小数量."
+
+msgctxt "help:purchase.product_supplier.price,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "指定数量的单位."
+
+msgctxt "help:purchase.purchase,delivery_date:"
+msgid "The default delivery date for each line."
+msgstr "默认交货日期."
+
+msgctxt "help:stock.location,supplier_return_location:"
+msgid "If empty the Storage location is used."
+msgstr "如果为空,则使用存储位置."
+
+msgctxt "model:ir.action,name:act_invoice_form"
+msgid "Invoices"
+msgstr "发票"
+
+msgctxt "model:ir.action,name:act_open_supplier"
+msgid "Parties associated to Purchases"
+msgstr "与采购相关的各个参与者"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_supplier_form"
+msgid "Suppliers"
+msgstr "供应商"
+
+msgctxt "model:ir.action,name:act_product_supplier_price_form"
+msgid "Prices"
+msgstr "价格"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_configuration_form"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.action,name:act_purchase_form"
+msgid "Purchases"
+msgstr "采购"
+
+msgctxt "model:ir.action,name:act_purchase_form2"
+msgid "Purchases"
+msgstr "采购"
+
+msgctxt "model:ir.action,name:act_purchase_invoice_relate"
+msgid "Purchases"
+msgstr "采购"
+
+msgctxt "model:ir.action,name:act_purchase_move_relate"
+msgid "Moves"
+msgstr "移动"
+
+msgctxt "model:ir.action,name:act_purchase_shipment_returns_relate"
+msgid "Purchases"
+msgstr "采购"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "采购"
+
+msgctxt "model:ir.action,name:act_return_form"
+msgid "Returns"
+msgstr "退货"
+
+msgctxt "model:ir.action,name:act_shipment_form"
+msgid "Shipments"
+msgstr "发货"
+
+msgctxt "model:ir.action,name:report_purchase"
+msgid "Purchase"
+msgstr "采购"
+
+msgctxt "model:ir.action,name:wizard_invoice_handle_exception"
+msgid "Handle Invoice Exception"
+msgstr "处理发票异常"
+
+msgctxt "model:ir.action,name:wizard_modify_header"
+msgid "Modify Header"
+msgstr "修改标题"
+
+msgctxt "model:ir.action,name:wizard_return_purchase"
+msgid "Return Purchase"
+msgstr "退货"
+
+msgctxt "model:ir.action,name:wizard_shipment_handle_exception"
+msgid "Handle Shipment Exception"
+msgstr "处理发货异常"
+
+msgctxt "model:ir.action.act_window.domain,name:act_purchase_form_domain_all"
+msgid "All"
+msgstr "全部"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_confirmed"
+msgid "Confirmed"
+msgstr "已确认"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_draft"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_exception"
+msgid "Exception"
+msgstr "异常"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_processing"
+msgid "Processing"
+msgstr "处理中"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_purchase_form_domain_quotation"
+msgid "Quotation"
+msgstr "报价"
+
+msgctxt "model:ir.message,text:msg_change_purchase_uom"
+msgid ""
+"You are trying to change the purchase UoM on which the purchase prices are "
+"based."
+msgstr "您正在试图更改采购价格依赖的采购计量单位."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_purchase"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending purchases with "
+"company \"%(company)s\"."
+msgstr "你不能删除参与者 \"%(party)s\" , 因为它与公司 \"%(company)s\" 有未完成的采购."
+
+msgctxt "model:ir.message,text:msg_purchase_delete_cancel"
+msgid "To delete purchase \"%(purchase)s\" you must cancel it."
+msgstr "如果要删除采购项目 \"%(purchase)s\" ,你必须首先取消它."
+
+msgctxt "model:ir.message,text:msg_purchase_invoice_reset_draft"
+msgid ""
+"You cannot reset invoice \"%(invoice)s\" to draft because it was generated "
+"by a purchase."
+msgstr "无法将发票 \"%(invoice)s\" 重置为草稿状态,因为因为它与某个采购关联。"
+
+msgctxt "model:ir.message,text:msg_purchase_line_delete_cancel_draft"
+msgid ""
+"To delete line \"%(line)s\" you must cancel or reset to draft purchase "
+"\"%(purchase)s\"."
+msgstr "要删除明细 \"%(line)s\" ,你必须将采购 \"%(purchase)s\"取消或者重置为草稿状态."
+
+msgctxt "model:ir.message,text:msg_purchase_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must configure a default account "
+"expense."
+msgstr "要开具采购发票“%(purchase)s”,您必须配置默认帐户费用。"
+
+msgctxt "model:ir.message,text:msg_purchase_modify_header_draft"
+msgid ""
+"To modify the header of purchase \"%(purchase)s\", it must be in draft "
+"state."
+msgstr "状态在草案时,才能修改采购 \"%(purchase)s\" 标题."
+
+msgctxt "model:ir.message,text:msg_purchase_move_reset_draft"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"purchase."
+msgstr "你无法将移动 \"%(move)s\" 重置为草稿状态,因为它关联着一个采购 ."
+
+msgctxt "model:ir.message,text:msg_purchase_product_missing_account_expense"
+msgid ""
+"To invoice purchase \"%(purchase)s\" you must define an account expense for "
+"product \"%(product)s\"."
+msgstr "要给采购 \"%(purchase)s\" 开具发票,您必须为产品 \"%(product)s\" 定义一个费用账户."
+
+msgctxt "model:ir.message,text:msg_purchase_supplier_location_required"
+msgid ""
+"To process purchase \"%(purchase)s\" you must set a supplier location on "
+"party \"%(party)s\"."
+msgstr "要处理采购 \"%(purchase)s\" , 你必须设置参与者\"%(party)s\"对应的供应商位置 ."
+
+msgctxt "model:ir.message,text:msg_warehouse_required_for_quotation"
+msgid ""
+"To get a quote for the purchase \"%(purchase)s\" of goods or assets, you "
+"must enter a warehouse."
+msgstr "要获取资产或货物采购 \"%(purchase)s\"对应的报价,你必须进入仓库."
+
+msgctxt "model:ir.model.button,string:purchase_cancel_button"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "model:ir.model.button,string:purchase_confirm_button"
+msgid "Confirm"
+msgstr "确认"
+
+msgctxt "model:ir.model.button,string:purchase_draft_button"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "model:ir.model.button,string:purchase_hande_invoice_exception_button"
+msgid "Handle Invoice Exception"
+msgstr "处理发票异常"
+
+msgctxt ""
+"model:ir.model.button,string:purchase_hande_shipment_exception_button"
+msgid "Handle Shipment Exception"
+msgstr "处理发货异常"
+
+msgctxt "model:ir.model.button,string:purchase_modify_header_button"
+msgid "Modify Header"
+msgstr "修改标题"
+
+msgctxt "model:ir.model.button,string:purchase_process_button"
+msgid "Process"
+msgstr "处理"
+
+msgctxt "model:ir.model.button,string:purchase_quote_button"
+msgid "Quote"
+msgstr "报价"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_product_supplier_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_purchase_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+msgctxt "model:ir.sequence,name:sequence_purchase"
+msgid "Purchase"
+msgstr "采购"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_purchase"
+msgid "Purchase"
+msgstr "采购"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "设置"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_product_supplier"
+msgid "Suppliers"
+msgstr "供应商"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase"
+msgid "Purchases"
+msgstr "采购"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_purchase_configuration"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.ui.menu,name:menu_purchase_form"
+msgid "Purchases"
+msgstr "采购"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "报表"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_supplier"
+msgid "Associated to Purchases"
+msgstr "与采购相关的各个参与者"
+
+msgctxt "model:party.party.customer_code,name:"
+msgid "Party Customer Code"
+msgstr "客户代码"
+
+#, fuzzy
+msgctxt "model:party.party.supplier_lead_time,name:"
+msgid "Supplier Lead Time"
+msgstr "交付时间"
+
+msgctxt "model:purchase.configuration,name:"
+msgid "Purchase Configuration"
+msgstr "采购配置"
+
+msgctxt "model:purchase.configuration.purchase_method,name:"
+msgid "Purchase Configuration Purchase Method"
+msgstr "采购设置-采购方式"
+
+msgctxt "model:purchase.configuration.sequence,name:"
+msgid "Purchase Configuration Sequence"
+msgstr "采购设置序列"
+
+msgctxt "model:purchase.handle.invoice.exception.ask,name:"
+msgid "Handle Invoice Exception"
+msgstr "处理发票异常"
+
+msgctxt "model:purchase.handle.shipment.exception.ask,name:"
+msgid "Handle Shipment Exception"
+msgstr "处理发货异常"
+
+msgctxt "model:purchase.line,name:"
+msgid "Purchase Line"
+msgstr "采购明细"
+
+msgctxt "model:purchase.line-account.tax,name:"
+msgid "Purchase Line - Tax"
+msgstr "采购明细 - 税"
+
+msgctxt "model:purchase.line-ignored-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "采购明细 - 忽略的移动"
+
+msgctxt "model:purchase.line-recreated-stock.move,name:"
+msgid "Purchase Line - Ignored Move"
+msgstr "采购明细 - 忽略的移动"
+
+msgctxt "model:purchase.product_supplier,name:"
+msgid "Product Supplier"
+msgstr "产品供应商"
+
+msgctxt "model:purchase.product_supplier.price,name:"
+msgid "Product Supplier Price"
+msgstr "产品供应商价格"
+
+msgctxt "model:purchase.purchase,name:"
+msgid "Purchase"
+msgstr "采购"
+
+msgctxt "model:purchase.purchase-ignored-account.invoice,name:"
+msgid "Purchase - Ignored Invoice"
+msgstr "采购 -忽略的发票"
+
+msgctxt "model:purchase.purchase-recreated-account.invoice,name:"
+msgid "Purchase - Recreated Invoice"
+msgstr "采购-重开的发票"
+
+msgctxt "model:purchase.return_purchase.start,name:"
+msgid "Return Purchase"
+msgstr "退货"
+
+msgctxt "model:res.group,name:group_purchase"
+msgid "Purchase"
+msgstr "采购"
+
+msgctxt "model:res.group,name:group_purchase_admin"
+msgid "Purchase Administrator"
+msgstr "采购管理员"
+
+msgctxt "report:purchase.purchase:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:purchase.purchase:"
+msgid "Amount"
+msgstr "数量"
+
+msgctxt "report:purchase.purchase:"
+msgid "Customer Code:"
+msgstr "客户代码:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Date:"
+msgstr "日期:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Delivery Address:"
+msgstr "交货地址:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description"
+msgstr "描述"
+
+msgctxt "report:purchase.purchase:"
+msgid "Description:"
+msgstr "描述:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Draft Purchase Order"
+msgstr "采购订单草案"
+
+msgctxt "report:purchase.purchase:"
+msgid "Purchase Order N°:"
+msgstr "采购订单 N°:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "report:purchase.purchase:"
+msgid "Reference:"
+msgstr "参考:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Request for Quotation N°:"
+msgstr "报价申请 N°:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes"
+msgstr "税"
+
+msgctxt "report:purchase.purchase:"
+msgid "Taxes:"
+msgstr "税:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total (excl. taxes):"
+msgstr "合计(不含税):"
+
+msgctxt "report:purchase.purchase:"
+msgid "Total:"
+msgstr "合计:"
+
+msgctxt "report:purchase.purchase:"
+msgid "Unit Price"
+msgstr "单价"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Ignored"
+msgstr "已忽略"
+
+msgctxt "selection:account.invoice,purchase_exception_state:"
+msgid "Recreated"
+msgstr "已重开"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Comment"
+msgstr "说明"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Line"
+msgstr "明细"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Subtotal"
+msgstr "小计"
+
+msgctxt "selection:purchase.line,type:"
+msgid "Title"
+msgstr "标题"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Order"
+msgstr "基于订单"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Based On Shipment"
+msgstr "基于发货"
+
+msgctxt "selection:purchase.purchase,invoice_method:"
+msgid "Manual"
+msgstr "手工"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Exception"
+msgstr "异常"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "None"
+msgstr "没有"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Paid"
+msgstr "已付费"
+
+msgctxt "selection:purchase.purchase,invoice_state:"
+msgid "Waiting"
+msgstr "正在等待"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Exception"
+msgstr "异常"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "None"
+msgstr "无"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Received"
+msgstr "已收货"
+
+msgctxt "selection:purchase.purchase,shipment_state:"
+msgid "Waiting"
+msgstr "正在等待"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Cancelled"
+msgstr "已取消"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Confirmed"
+msgstr "已确认"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Processing"
+msgstr "处理中"
+
+msgctxt "selection:purchase.purchase,state:"
+msgid "Quotation"
+msgstr "报价"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Ignored"
+msgstr "已忽略"
+
+msgctxt "selection:stock.move,purchase_exception_state:"
+msgid "Recreated"
+msgstr "已重新创建"
+
+msgctxt "view:party.party:"
+msgid "Supplier"
+msgstr "供货商"
+
+msgctxt "view:product.template:"
+msgid "Suppliers"
+msgstr "供应商"
+
+msgctxt "view:purchase.handle.invoice.exception.ask:"
+msgid "Choose invoices to recreate:"
+msgstr "选择要重开的发票:"
+
+msgctxt "view:purchase.handle.shipment.exception.ask:"
+msgid "Choose move to recreate:"
+msgstr "选择要重新创建的移动:"
+
+msgctxt "view:purchase.line:"
+msgid "Delivery Date:"
+msgstr "交货日期:"
+
+msgctxt "view:purchase.line:"
+msgid "General"
+msgstr "基本情况"
+
+msgctxt "view:purchase.line:"
+msgid "Notes"
+msgstr "备注"
+
+msgctxt "view:purchase.line:"
+msgid "Taxes"
+msgstr "税"
+
+msgctxt "view:purchase.purchase:"
+msgid "Other Info"
+msgstr "其它信息"
+
+msgctxt "view:purchase.purchase:"
+msgid "Purchase"
+msgstr "采购"
+
+msgctxt "view:purchase.return_purchase.start:"
+msgid "Are you sure to return these/this purchase(s)?"
+msgstr "你确定要退货?"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,end:"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "wizard_button:purchase.handle.invoice.exception,ask,handle:"
+msgid "OK"
+msgstr "确定"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,end:"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "wizard_button:purchase.handle.shipment.exception,ask,handle:"
+msgid "OK"
+msgstr "确定"
+
+msgctxt "wizard_button:purchase.modify_header,start,end:"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "wizard_button:purchase.modify_header,start,modify:"
+msgid "Modify"
+msgstr "更改"
+
+msgctxt "wizard_button:purchase.return_purchase,start,end:"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "wizard_button:purchase.return_purchase,start,return_:"
+msgid "Return"
+msgstr "返回"
diff --git a/modules/purchase/message.xml b/modules/purchase/message.xml
new file mode 100644
index 0000000000..4ed0b72348
--- /dev/null
+++ b/modules/purchase/message.xml
@@ -0,0 +1,40 @@
+
+
+
+
+