diff --git a/.hgtags b/.hgtags
index 19c16a1de1..a04ddc22f6 100644
--- a/.hgtags
+++ b/.hgtags
@@ -25,3 +25,2085 @@ d2667ef655e3fcd2bce97d45493dd3ca2d39981c sale_subscription_asset-5.8.0
e3838bf193a7b7ecc5bd972d9238af1e64a90e04 sale_subscription_asset-6.4.0
0000000000000000000000000000000000000000 6.6.0
7b7bfdcc1ad2cfcc550a957802114153dae6524b sale_subscription_asset-6.6.0
+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
+e5190aae89d423191f15f500f42a0f35cb21f117 6.2.0
+9af60e26dd79dd30e6ec0609e365344b1250d29c 6.4.0
+6f2ab30e556d71e08663bea79defaf21d54ed5d4 6.6.0
+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.2.0
+e5190aae89d423191f15f500f42a0f35cb21f117 sale_subscription-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+9af60e26dd79dd30e6ec0609e365344b1250d29c sale_subscription-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+6f2ab30e556d71e08663bea79defaf21d54ed5d4 sale_subscription-6.6.0
+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
+f2df468193a63bb6d56083ceb853bb3c390aa7de 6.2.0
+fcecdacba07c2ea68eb54c8e857b4f43f7141ad5 6.4.0
+9ffe7d3e158e5862d04def1538f25bdb2161c236 6.6.0
+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.2.0
+f2df468193a63bb6d56083ceb853bb3c390aa7de sale_supply_drop_shipment-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+fcecdacba07c2ea68eb54c8e857b4f43f7141ad5 sale_supply_drop_shipment-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+9ffe7d3e158e5862d04def1538f25bdb2161c236 sale_supply_drop_shipment-6.6.0
+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
+432ecd49808d54aa33187cd80d6f63157627655a 6.2.0
+b6805e6286b9a01d8ff771dcfce9df03b44f8361 6.4.0
+b619018431c13efb0842ef327ac8bffe0f6d3f82 6.6.0
+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.2.0
+432ecd49808d54aa33187cd80d6f63157627655a sale_supply-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+b6805e6286b9a01d8ff771dcfce9df03b44f8361 sale_supply-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+b619018431c13efb0842ef327ac8bffe0f6d3f82 sale_supply-6.6.0
+f62f4846d82f2c05110d92ddb65f764478df50d4 5.6.0
+2e4a3b14e265050e2df36c1c96b03fd246a5da6e 5.8.0
+2081017ba6e796df571eb28475f82ada5ab9c27f 6.0.0
+f5f4a83af1aeb986953896e5998e493dc0409e8a 6.2.0
+0796eba2e4ce9cbe1a55eae318928f5d1c677cad 6.4.0
+7fd73f7e728815f79790e1900fab8191a99ac4bb 6.6.0
+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.2.0
+f5f4a83af1aeb986953896e5998e493dc0409e8a sale_supply_production-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+0796eba2e4ce9cbe1a55eae318928f5d1c677cad sale_supply_production-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+7fd73f7e728815f79790e1900fab8191a99ac4bb sale_supply_production-6.6.0
+2ecdd7815e6c21be61cd051a6a9e8b717f070a88 5.8.0
+8ca8057e893a91132d0cd825f4d657f33d7ea0e7 6.0.0
+42401c72c3a82685174dba5a81aaebaa4f624fb1 6.2.0
+813ad0081e08f2bc3bd5625b9e78a4e08f5c2151 6.4.0
+279eb9b4bf692ed19998700b08ce14fa33d925af 6.6.0
+0000000000000000000000000000000000000000 5.8.0
+2ecdd7815e6c21be61cd051a6a9e8b717f070a88 stock_assign_manual-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+8ca8057e893a91132d0cd825f4d657f33d7ea0e7 stock_assign_manual-6.0.0
+0000000000000000000000000000000000000000 6.2.0
+42401c72c3a82685174dba5a81aaebaa4f624fb1 stock_assign_manual-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+813ad0081e08f2bc3bd5625b9e78a4e08f5c2151 stock_assign_manual-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+279eb9b4bf692ed19998700b08ce14fa33d925af stock_assign_manual-6.6.0
+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
+180de67e1814e6ba5e8668158ba9a58b95820b5c 6.2.0
+ae815400b9962362a04e7f2ba15e9f714d605fd5 6.4.0
+0c4fcba19d00c6ab004bb83164acf47473f13dd2 6.6.0
+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.2.0
+180de67e1814e6ba5e8668158ba9a58b95820b5c stock_consignment-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+ae815400b9962362a04e7f2ba15e9f714d605fd5 stock_consignment-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+0c4fcba19d00c6ab004bb83164acf47473f13dd2 stock_consignment-6.6.0
+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
+51e2cca077e6619be7c4ae334286e202daaaf27c 6.2.0
+e997d99e37b7120b7ac28b1b9736a42befef1146 6.4.0
+8bef0994e14f3dddaa9a19ef99917a5a88ec1407 6.6.0
+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.2.0
+51e2cca077e6619be7c4ae334286e202daaaf27c stock_forecast-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+e997d99e37b7120b7ac28b1b9736a42befef1146 stock_forecast-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+8bef0994e14f3dddaa9a19ef99917a5a88ec1407 stock_forecast-6.6.0
+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
+3cdc0696c0f6a6aaf4e767ccfc25971a992340ce 6.2.0
+65d7e83be01e651274bc5eebd98deac8b4afceef 6.4.0
+f83c1c8c757c652767eb7651370f786f0a864e00 6.6.0
+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.2.0
+3cdc0696c0f6a6aaf4e767ccfc25971a992340ce stock-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+65d7e83be01e651274bc5eebd98deac8b4afceef stock-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+f83c1c8c757c652767eb7651370f786f0a864e00 stock-6.6.0
+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
+6cf0c4d8f64ccaedf402800b446718200d74bbcb 6.2.0
+2406bcb73d0867cb64318cb3917d421ae50858a5 6.4.0
+e245f55d75a981d8b7968be54c9faeaa97c61e22 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+6cf0c4d8f64ccaedf402800b446718200d74bbcb stock_inventory_location-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+2406bcb73d0867cb64318cb3917d421ae50858a5 stock_inventory_location-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+e245f55d75a981d8b7968be54c9faeaa97c61e22 stock_inventory_location-6.6.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
+3ebb517c91bc0b75b347d4e23fc63234aace7b22 6.2.0
+a71b982ae4381f840823a000af60c3c222c957f0 6.4.0
+26556d44c2fb84b55ef0c6ee513181c56e743148 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+3ebb517c91bc0b75b347d4e23fc63234aace7b22 stock_location_move-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+a71b982ae4381f840823a000af60c3c222c957f0 stock_location_move-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+26556d44c2fb84b55ef0c6ee513181c56e743148 stock_location_move-6.6.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
+613034b9778b85d02ae1585a39e90039f13a3695 6.2.0
+47541d334066316ea3296e4eb2004da55c6b5e4f 6.4.0
+2ba005a00d90302b0bf759cf8528df1fca8bbaec 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+613034b9778b85d02ae1585a39e90039f13a3695 stock_location_sequence-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+47541d334066316ea3296e4eb2004da55c6b5e4f stock_location_sequence-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+2ba005a00d90302b0bf759cf8528df1fca8bbaec stock_location_sequence-6.6.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
+188ebdc1fe97c6427635e6a6f5778c5000ba5938 6.2.0
+b5347defe5e8d03260599fd6e03002022b9a993c 6.4.0
+50613053f4b76964b7bcea9f7894fb77c068b50f 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+188ebdc1fe97c6427635e6a6f5778c5000ba5938 stock_lot-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+b5347defe5e8d03260599fd6e03002022b9a993c stock_lot-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+50613053f4b76964b7bcea9f7894fb77c068b50f stock_lot-6.6.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
+771f2086b196fc5756e7bfcaf52365abd00d10e9 6.2.0
+af1f96f38c986ef0c8b960d83c9725d3c525c709 6.4.0
+2a4f3a2eeb07431a35a32d69ccec9d4d3f5014dc 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+771f2086b196fc5756e7bfcaf52365abd00d10e9 stock_lot_sled-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+af1f96f38c986ef0c8b960d83c9725d3c525c709 stock_lot_sled-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+2a4f3a2eeb07431a35a32d69ccec9d4d3f5014dc stock_lot_sled-6.6.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
+1b88c1efab8e6d8c128b0eed0395603ccb2d1ffd 6.2.0
+e5d8ffaf91c7afd4f809b0bc441827edc8673dda 6.4.0
+3b990739f8071bb9bcc46bfb5f45a2f71532f296 6.6.0
+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.2.0
+1b88c1efab8e6d8c128b0eed0395603ccb2d1ffd stock_lot_unit-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+e5d8ffaf91c7afd4f809b0bc441827edc8673dda stock_lot_unit-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+3b990739f8071bb9bcc46bfb5f45a2f71532f296 stock_lot_unit-6.6.0
+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
+f3109538cd603d85a10e5070ce8a1bfd92416dfe 6.2.0
+260a52bf21527f2e746e08ae3e2eb5d86551fdf2 6.4.0
+b812bca2a752860635219290eca696b83042e406 6.6.0
+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.2.0
+f3109538cd603d85a10e5070ce8a1bfd92416dfe stock_package-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+260a52bf21527f2e746e08ae3e2eb5d86551fdf2 stock_package-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+b812bca2a752860635219290eca696b83042e406 stock_package-6.6.0
+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
+6216cdc125f78a1071e72bb49cc7fcdff2b82667 6.2.0
+053fff25d83a0378a37b43591d864becdb8dd217 6.4.0
+1ec0ff090be4cead1d05df473cf8fbdfe0810c88 6.6.0
+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.2.0
+6216cdc125f78a1071e72bb49cc7fcdff2b82667 stock_package_shipping_dpd-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+053fff25d83a0378a37b43591d864becdb8dd217 stock_package_shipping_dpd-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+1ec0ff090be4cead1d05df473cf8fbdfe0810c88 stock_package_shipping_dpd-6.6.0
+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
+0f981b2c2095bb4284ed6e1abe9e5f076e44bc65 6.2.0
+656bbe82f32db7cc41ba407bb46eb8ef4d78b72d 6.4.0
+81a891f156685cf5afe526044217c806990d462b 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+0f981b2c2095bb4284ed6e1abe9e5f076e44bc65 stock_package_shipping-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+656bbe82f32db7cc41ba407bb46eb8ef4d78b72d stock_package_shipping-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+81a891f156685cf5afe526044217c806990d462b stock_package_shipping-6.6.0
+efe8ad65ecc999176a779e8a5b9506916223081e 6.2.0
+e70bee6490857d56f447491144ef6d6e61bf229a 6.4.0
+dd62e5e8f5838b5653e649ec07968ee07c972f71 6.6.0
+0000000000000000000000000000000000000000 6.2.0
+efe8ad65ecc999176a779e8a5b9506916223081e stock_package_shipping_mygls-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+e70bee6490857d56f447491144ef6d6e61bf229a stock_package_shipping_mygls-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+dd62e5e8f5838b5653e649ec07968ee07c972f71 stock_package_shipping_mygls-6.6.0
+7bdde48affeaf205d5698d453b5ae136c8dcf69a 6.2.0
+85f567bf416a2e725f88c9e68f11cec2fb97ba53 6.4.0
+086fa4d627bd13cea36e72e923ae18e7b387fe12 6.6.0
+0000000000000000000000000000000000000000 6.2.0
+7bdde48affeaf205d5698d453b5ae136c8dcf69a stock_package_shipping_sendcloud-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+85f567bf416a2e725f88c9e68f11cec2fb97ba53 stock_package_shipping_sendcloud-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+086fa4d627bd13cea36e72e923ae18e7b387fe12 stock_package_shipping_sendcloud-6.6.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
+d2df4ecc1213be8c5ff84508ec7c72fa2a38f457 6.2.0
+92b93590f3c5e0fc8520d61181aeb2bfc85af729 6.4.0
+954087b1fe9ed0441b5ac0dbaae3700754422b02 6.6.0
+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.2.0
+d2df4ecc1213be8c5ff84508ec7c72fa2a38f457 stock_package_shipping_ups-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+92b93590f3c5e0fc8520d61181aeb2bfc85af729 stock_package_shipping_ups-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+954087b1fe9ed0441b5ac0dbaae3700754422b02 stock_package_shipping_ups-6.6.0
+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
+18a35510777ea296aff2bdc46fa4fc156fb6a2b6 6.2.0
+8f8e0041380e8a6dded2149eeb2f83993e98cb4f 6.4.0
+11e9e50a83519832fc3a654c6a2893a47af1c852 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+18a35510777ea296aff2bdc46fa4fc156fb6a2b6 stock_product_location-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+8f8e0041380e8a6dded2149eeb2f83993e98cb4f stock_product_location-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+11e9e50a83519832fc3a654c6a2893a47af1c852 stock_product_location-6.6.0
+790271308b23a4856ade0be330ee59b5d69e7e75 6.0.0
+729e05a801e119103c3087b3f8708632d0121ee2 6.2.0
+300d3e729f2ce6c918ea534784d82917315a2e82 6.4.0
+c9f273114e8b76b0154115cb01f9a0345109cf84 6.6.0
+0000000000000000000000000000000000000000 6.0.0
+790271308b23a4856ade0be330ee59b5d69e7e75 stock_quantity_early_planning-6.0.0
+0000000000000000000000000000000000000000 6.2.0
+729e05a801e119103c3087b3f8708632d0121ee2 stock_quantity_early_planning-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+300d3e729f2ce6c918ea534784d82917315a2e82 stock_quantity_early_planning-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+c9f273114e8b76b0154115cb01f9a0345109cf84 stock_quantity_early_planning-6.6.0
+8c7dc4a68eb44600a2e57f380b7fb39e7d4c9bd7 6.0.0
+180fa9e24693b07498ca2994729aa234e5f2f230 6.2.0
+12dbb1ede87b8d90716c7bd3d93116a5ef06cbf1 6.4.0
+693c2fbb45dee895662a6c24d8ebe55e9ca5bb53 6.6.0
+0000000000000000000000000000000000000000 6.0.0
+8c7dc4a68eb44600a2e57f380b7fb39e7d4c9bd7 stock_quantity_issue-6.0.0
+0000000000000000000000000000000000000000 6.2.0
+180fa9e24693b07498ca2994729aa234e5f2f230 stock_quantity_issue-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+12dbb1ede87b8d90716c7bd3d93116a5ef06cbf1 stock_quantity_issue-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+693c2fbb45dee895662a6c24d8ebe55e9ca5bb53 stock_quantity_issue-6.6.0
+5e63bae17297495d2b63041be081e6bb8a69be2e 5.4.0
+83b28ed660ea0a02ba4cbaea22f495f2b3038615 5.6.0
+d7e3a25d15aa72096b29d985483e3caeb1fc4a43 5.8.0
+e55605b40ed71ec25e3079bb9c8b473bf879af58 6.0.0
+f3fd1dcb37f9d934da6f6bb0c31770409a93265f 6.2.0
+b7fb7dc89a758cc91d55f523db7513c6365b7af2 6.4.0
+1ab9ff3f2173cca3d03571d4b090e1e9fa085632 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+f3fd1dcb37f9d934da6f6bb0c31770409a93265f stock_secondary_unit-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+b7fb7dc89a758cc91d55f523db7513c6365b7af2 stock_secondary_unit-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+1ab9ff3f2173cca3d03571d4b090e1e9fa085632 stock_secondary_unit-6.6.0
+e2d7e4135cc43091843e096a227cb69ded3b425a 6.0.0
+e86dc3d9aaf74d02f4d76b7b39be6cccc45df90a 6.2.0
+e669817bef263fe9cfc7b9d065f2fd6464c33825 6.4.0
+3c296d4df695e3b1b0e8a13d54e767db5b0b6aec 6.6.0
+0000000000000000000000000000000000000000 6.0.0
+e2d7e4135cc43091843e096a227cb69ded3b425a stock_shipment_cost-6.0.0
+0000000000000000000000000000000000000000 6.2.0
+e86dc3d9aaf74d02f4d76b7b39be6cccc45df90a stock_shipment_cost-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+e669817bef263fe9cfc7b9d065f2fd6464c33825 stock_shipment_cost-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+3c296d4df695e3b1b0e8a13d54e767db5b0b6aec stock_shipment_cost-6.6.0
+738617ef9100cb2bca45596cdaa48c75ad3cfd5e 6.4.0
+ffcd53cff4353e6d17547b5f7d31e2ef2c5ea1b2 6.6.0
+0000000000000000000000000000000000000000 6.4.0
+738617ef9100cb2bca45596cdaa48c75ad3cfd5e stock_shipment_cost_weight-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+ffcd53cff4353e6d17547b5f7d31e2ef2c5ea1b2 stock_shipment_cost_weight-6.6.0
+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
+63c1d22cdd2cb1a4ebc8c3b1e71d3b18487060d2 6.2.0
+d823ffc0ccd4eb62d5621560582b03253fddb346 6.4.0
+a4431f200ae5d4e89fb90795c88258261156220d 6.6.0
+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.2.0
+63c1d22cdd2cb1a4ebc8c3b1e71d3b18487060d2 stock_shipment_measurements-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+d823ffc0ccd4eb62d5621560582b03253fddb346 stock_shipment_measurements-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+a4431f200ae5d4e89fb90795c88258261156220d stock_shipment_measurements-6.6.0
+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
+5cda0f5b743d0d42a58187e5d38585e5e4ec7f1d 6.2.0
+3e649b6f6f2a16621caa05565ffcc8934bcb308e 6.4.0
+ca9aef457838d9bae9cddc270e83239c3d08dfde 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+5cda0f5b743d0d42a58187e5d38585e5e4ec7f1d stock_split-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+3e649b6f6f2a16621caa05565ffcc8934bcb308e stock_split-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+ca9aef457838d9bae9cddc270e83239c3d08dfde stock_split-6.6.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
+a19ed98c7d062115451f9ed8d1e5c09017cd6b72 6.2.0
+ec2dcacd13e91cae985e8a259459a2a1c1185cae 6.4.0
+49793239a5c3e08cb3dd39e43642826b3f692f26 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+a19ed98c7d062115451f9ed8d1e5c09017cd6b72 stock_supply_day-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+ec2dcacd13e91cae985e8a259459a2a1c1185cae stock_supply_day-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+49793239a5c3e08cb3dd39e43642826b3f692f26 stock_supply_day-6.6.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
+e979007c21a4054f31741b30aed287cd5a638ebe 6.2.0
+91add9ae71e1343bccacf5479b71eb0108eb4de1 6.4.0
+1c7acdc192cc44cb913b7aa9165062b1cb1d8873 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+e979007c21a4054f31741b30aed287cd5a638ebe stock_supply_forecast-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+91add9ae71e1343bccacf5479b71eb0108eb4de1 stock_supply_forecast-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+1c7acdc192cc44cb913b7aa9165062b1cb1d8873 stock_supply_forecast-6.6.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
+0a8b4ee3edc6e4e4e128884c435a47108ef30ba2 6.2.0
+e87dde891cebd2a9c913e1d4ed1884010123e740 6.4.0
+833a1c72275774e303e72d99b8c79f61a4aa873b 6.6.0
+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.2.0
+0a8b4ee3edc6e4e4e128884c435a47108ef30ba2 stock_supply-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+e87dde891cebd2a9c913e1d4ed1884010123e740 stock_supply-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+833a1c72275774e303e72d99b8c79f61a4aa873b stock_supply-6.6.0
+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
+6311d85f112ab42e976db5964c3b8a88f71c609d 6.2.0
+df757189f2c2803cbd60aa4646ec073712ad2a72 6.4.0
+a10a03c01c293c3d60338c0cdf255e645ae582bc 6.6.0
+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.2.0
+6311d85f112ab42e976db5964c3b8a88f71c609d stock_supply_production-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+df757189f2c2803cbd60aa4646ec073712ad2a72 stock_supply_production-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+a10a03c01c293c3d60338c0cdf255e645ae582bc stock_supply_production-6.6.0
+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
+c7e966206f80f8ec35d48cada0dbf93603d2ba58 6.2.0
+8326eead85e5b3dbae373141494cf52ac0ee1868 6.4.0
+0e2e8692cf07cdbc798c4ba525b7184633c26635 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+c7e966206f80f8ec35d48cada0dbf93603d2ba58 timesheet_cost-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+8326eead85e5b3dbae373141494cf52ac0ee1868 timesheet_cost-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+0e2e8692cf07cdbc798c4ba525b7184633c26635 timesheet_cost-6.6.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
+562ea339e5f31405a6835b76cd0b0f85541bbe0f 6.2.0
+3c80653500553e4f032caf920c5e0b515dfbdcf0 6.4.0
+c16ea65a1df9fc825f2f929cf47e733dadc73b80 6.6.0
+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.2.0
+562ea339e5f31405a6835b76cd0b0f85541bbe0f timesheet-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+3c80653500553e4f032caf920c5e0b515dfbdcf0 timesheet-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+c16ea65a1df9fc825f2f929cf47e733dadc73b80 timesheet-6.6.0
+0f3d5527aad7e83e07c84b19983b86f5b580d9b9 5.2.0
+32c3f6707c841e89eaa8e1200b4ed4b4b8c2510d 5.4.0
+65a1ddcc0b7d681c785f9260aa11e9c9a9b3f74b 5.6.0
+8766a61dd6f885faa2bed9eaa21c307412674989 5.8.0
+5c50392d0b77f4f5c1f76ece0997ec73591e887c 6.0.0
+111e976e7d587ab314808f3be9508fb45fcb7218 6.2.0
+8b0f3f4c817cbf75622b0e2cca36c7d32a2e71ca 6.4.0
+9a8161d1a043fa99953350890026644a36adc927 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+111e976e7d587ab314808f3be9508fb45fcb7218 user_role-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+8b0f3f4c817cbf75622b0e2cca36c7d32a2e71ca user_role-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+9a8161d1a043fa99953350890026644a36adc927 user_role-6.6.0
+cc6273db844d391455840a0cb63fbd8e78b704c7 5.8.0
+4020d5ca9497c14dfc273676d49363650eb8da80 6.0.0
+2f7384935c9a660fe3e324dd80cae3231058dbfd 6.2.0
+2c401c41ecfbb40b9d175ea27ead1dfc28808d7d 6.4.0
+2e6be173a48ec7586d87bf8d4277d90e45f9e421 6.6.0
+0000000000000000000000000000000000000000 5.8.0
+cc6273db844d391455840a0cb63fbd8e78b704c7 web_shop-5.8.0
+0000000000000000000000000000000000000000 6.0.0
+4020d5ca9497c14dfc273676d49363650eb8da80 web_shop-6.0.0
+0000000000000000000000000000000000000000 6.2.0
+2f7384935c9a660fe3e324dd80cae3231058dbfd web_shop-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+2c401c41ecfbb40b9d175ea27ead1dfc28808d7d web_shop-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+2e6be173a48ec7586d87bf8d4277d90e45f9e421 web_shop-6.6.0
+0fa3353dd8f6ecd194c8850181ed067e33f12a9c 6.2.0
+48e0025a6f396470511abd211e8454cf5b007b68 6.4.0
+fefaf7d877521704862965f443572c2df19d0fa0 6.6.0
+0000000000000000000000000000000000000000 6.2.0
+0fa3353dd8f6ecd194c8850181ed067e33f12a9c web_shop_shopify-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+48e0025a6f396470511abd211e8454cf5b007b68 web_shop_shopify-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+fefaf7d877521704862965f443572c2df19d0fa0 web_shop_shopify-6.6.0
+bfc8e45097fc0e414744408e96708fdf5d2b33a1 5.8.0
+2efa183d80e356d0c11731819456b8dd9bc586db 6.0.0
+68ad2bbc8a5c7be8f7e28abfc29643c50edeae72 6.2.0
+4c49fb91d23f62bcec4079bd4329cc6011a0762d 6.4.0
+a1f0befe30d33598a618410c7ab38831ae8d99b9 6.6.0
+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.2.0
+68ad2bbc8a5c7be8f7e28abfc29643c50edeae72 web_shop_vue_storefront-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+4c49fb91d23f62bcec4079bd4329cc6011a0762d web_shop_vue_storefront-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+a1f0befe30d33598a618410c7ab38831ae8d99b9 web_shop_vue_storefront-6.6.0
+0a5ab9e8e526e89b69c1aadb73127da0759edc27 5.8.0
+4b01e563d74ede2cd6ac3c0ae8bd597a963c21a3 6.0.0
+4aec6b591d561476f821e4b7696fdeb2445649a0 6.2.0
+13fb09e13f9961147b3fafd7a4acda34aa782057 6.4.0
+69ebe443a0a7202973e896d6a44a62a2fff29615 6.6.0
+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.2.0
+4aec6b591d561476f821e4b7696fdeb2445649a0 web_shop_vue_storefront_stripe-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+13fb09e13f9961147b3fafd7a4acda34aa782057 web_shop_vue_storefront_stripe-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+69ebe443a0a7202973e896d6a44a62a2fff29615 web_shop_vue_storefront_stripe-6.6.0
+d1340478469878c66528aac5cec001841d14ca5a 5.2.0
+bed84c6dd812463897dc9cca5b7909f6ea4651a4 5.4.0
+e37a9b2291b9b60d453a9eabc894d21b5aeca097 5.6.0
+c3046a83c61339a6310b8cf56c2e4dddd59a0675 5.8.0
+0d2662846f667e44e2831a271becf86f8868c9a5 6.0.0
+5a39f9619caf2338d2b86a46f16154a8e29d2830 6.2.0
+b27e5df8f64e7e96c3b895ec7090eb1bb9166eaa 6.4.0
+cd182550e175f7de15c5940fb446d72895f68a31 6.6.0
+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.2.0
+5a39f9619caf2338d2b86a46f16154a8e29d2830 web_shortener-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+b27e5df8f64e7e96c3b895ec7090eb1bb9166eaa web_shortener-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+cd182550e175f7de15c5940fb446d72895f68a31 web_shortener-6.6.0
+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
+355cdcd27f958fbd7e3bdd021c238283b3f0f539 6.2.0
+b81b890c871cea5a9a3fb734af72452f59969c32 6.4.0
+a9dab1237717b85084d19158a7d487d0d9adbfb4 6.6.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
+0000000000000000000000000000000000000000 6.2.0
+355cdcd27f958fbd7e3bdd021c238283b3f0f539 web_user-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+b81b890c871cea5a9a3fb734af72452f59969c32 web_user-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+a9dab1237717b85084d19158a7d487d0d9adbfb4 web_user-6.6.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
+286ac00ea47d420641bf79917025421a90a5d353 6.2.0
+1310030ca59a2d88a3995cdc5874e9c4a57c5854 6.4.0
+051cf4dfddf8c0e15109b4a74554a910cc28c6c1 6.6.0
+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.2.0
+286ac00ea47d420641bf79917025421a90a5d353 proteus-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+1310030ca59a2d88a3995cdc5874e9c4a57c5854 proteus-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+051cf4dfddf8c0e15109b4a74554a910cc28c6c1 proteus-6.6.0
+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
+e6b66ac38f2f3aefeddeba9fc0b3cee375d1f19a 6.2.0
+4a114b18bce58de90577d7975b0c275b45ecdcb0 6.4.0
+1bf438772b1bb9702ebb9bbcbce96f7ab53a94eb 6.6.0
+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.2.0
+e6b66ac38f2f3aefeddeba9fc0b3cee375d1f19a sao-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+4a114b18bce58de90577d7975b0c275b45ecdcb0 sao-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+1bf438772b1bb9702ebb9bbcbce96f7ab53a94eb sao-6.6.0
+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
+77df2082ed44a6655dd151c09cf8a7ca36ec6499 6.2.0
+88192dc708bc13b43a99168c97642106684bbfeb 6.4.0
+312583490fff372849dfb38c7c849325d40bbf81 6.6.0
+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.2.0
+77df2082ed44a6655dd151c09cf8a7ca36ec6499 trytond-gis-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+88192dc708bc13b43a99168c97642106684bbfeb trytond-gis-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+312583490fff372849dfb38c7c849325d40bbf81 trytond-gis-6.6.0
+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
+1252631aa5277267887251090d6e2f7ed6d41503 6.2.0
+2593216de16bfca661479ed068b87fd0e83260e0 6.4.0
+e5934d7675cbdbf6e534ea4a01f9e1d0792e22b4 6.6.0
+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.2.0
+1252631aa5277267887251090d6e2f7ed6d41503 trytond-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+2593216de16bfca661479ed068b87fd0e83260e0 trytond-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+e5934d7675cbdbf6e534ea4a01f9e1d0792e22b4 trytond-6.6.0
+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
+932b5115f37ddb479b4034bf1438e48df198cc05 6.2.0
+4100f887dd4a3d7511c0c0547e766db7845114e3 6.4.0
+f3542b3396f897c2231e629437f528371d3d11db 6.6.0
+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.2.0
+932b5115f37ddb479b4034bf1438e48df198cc05 tryton-6.2.0
+0000000000000000000000000000000000000000 6.4.0
+4100f887dd4a3d7511c0c0547e766db7845114e3 tryton-6.4.0
+0000000000000000000000000000000000000000 6.6.0
+f3542b3396f897c2231e629437f528371d3d11db tryton-6.6.0
diff --git a/modules/sale_subscription/.drone.yml b/modules/sale_subscription/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/sale_subscription/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/sale_subscription/.flake8 b/modules/sale_subscription/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/sale_subscription/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/sale_subscription/.isort.cfg b/modules/sale_subscription/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/sale_subscription/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/sale_subscription/CHANGELOG b/modules/sale_subscription/CHANGELOG
new file mode 100644
index 0000000000..ca62c80587
--- /dev/null
+++ b/modules/sale_subscription/CHANGELOG
@@ -0,0 +1,55 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Display subscription services on product form
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Use customer currency as default
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-01
+* Bug fixes (see mercurial logs for details)
+* Add wizard for testing subscription recurrence rule
+* Always fill invoice date
+
+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
+* Rename subscription state from canceled to cancelled
+
+Version 5.6.0 - 2020-05-04
+* Bug fixes (see mercurial logs for details)
+* Add employee on subscriptions for some states
+* Use greatest end date of lines for closed date
+* Add contact and invoice party on subscription
+* Allow invoices to be created in advance
+
+Version 5.4.0 - 2019-11-04
+* Bug fixes (see mercurial logs for details)
+* Allow lines to be finished before next consumption
+* Allow services to be deactivated
+
+Version 5.2.0 - 2019-05-06
+* Bug fixes (see mercurial logs for details)
+* Use ir.calendar.day
+
+Version 5.0.0 - 2018-10-01
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 2.7
+* Make start date of line required
+* Make description on subscription line optional
+
+Version 4.8.0 - 2018-04-23
+* Bug fixes (see mercurial logs for details)
+* Check pending subscription to erase party
+
+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/sale_subscription/COPYRIGHT b/modules/sale_subscription/COPYRIGHT
new file mode 100644
index 0000000000..3bf61ea509
--- /dev/null
+++ b/modules/sale_subscription/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2016-2022 Cédric Krier
+Copyright (C) 2016-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/sale_subscription/LICENSE b/modules/sale_subscription/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/sale_subscription/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/sale_subscription/MANIFEST.in b/modules/sale_subscription/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/sale_subscription/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/sale_subscription/README.rst b/modules/sale_subscription/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/sale_subscription/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/sale_subscription/__init__.py b/modules/sale_subscription/__init__.py
new file mode 100644
index 0000000000..dc839dd693
--- /dev/null
+++ b/modules/sale_subscription/__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 (
+ configuration, invoice, ir, party, product, recurrence, service,
+ subscription)
+
+
+def register():
+ Pool.register(
+ configuration.Configuration,
+ configuration.ConfigurationSequence,
+ recurrence.RecurrenceRuleSet,
+ recurrence.RecurrenceRule,
+ recurrence.TestRecurrenceRuleSetView,
+ recurrence.TestRecurrenceRuleSetViewResult,
+ service.Service,
+ subscription.Subscription,
+ subscription.Line,
+ subscription.LineConsumption,
+ subscription.CreateLineConsumptionStart,
+ subscription.CreateSubscriptionInvoiceStart,
+ invoice.InvoiceLine,
+ product.Product,
+ ir.Cron,
+ module='sale_subscription', type_='model')
+ Pool.register(
+ subscription.CreateLineConsumption,
+ subscription.CreateSubscriptionInvoice,
+ recurrence.TestRecurrenceRuleSet,
+ party.Replace,
+ party.Erase,
+ module='sale_subscription', type_='wizard')
+ Pool.register(
+ module='sale_subscription', type_='report')
diff --git a/modules/sale_subscription/configuration.py b/modules/sale_subscription/configuration.py
new file mode 100644
index 0000000000..9831ddde3e
--- /dev/null
+++ b/modules/sale_subscription/configuration.py
@@ -0,0 +1,51 @@
+# 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 Pool, PoolMeta
+from trytond.pyson import Eval, Id
+
+
+class Configuration(metaclass=PoolMeta):
+ __name__ = 'sale.configuration'
+
+ subscription_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Subscription Sequence", required=True,
+ domain=[
+ ('company', 'in',
+ [Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('sale_subscription', 'sequence_type_subscription')),
+ ]))
+
+ @classmethod
+ def multivalue_model(cls, field):
+ pool = Pool()
+ if field == 'subscription_sequence':
+ return pool.get('sale.configuration.sequence')
+ return super(Configuration, cls).multivalue_model(field)
+
+ @classmethod
+ def default_subscription_sequence(cls, **pattern):
+ return cls.multivalue_model(
+ 'subscription_sequence').default_subscription_sequence()
+
+
+class ConfigurationSequence(metaclass=PoolMeta):
+ __name__ = 'sale.configuration.sequence'
+ subscription_sequence = fields.Many2One(
+ 'ir.sequence', "Subscription Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('sale_subscription', 'sequence_type_subscription')),
+ ])
+
+ @classmethod
+ def default_subscription_sequence(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id(
+ 'sale_subscription', 'sequence_subscription')
+ except KeyError:
+ return None
diff --git a/modules/sale_subscription/configuration.xml b/modules/sale_subscription/configuration.xml
new file mode 100644
index 0000000000..e02f1721e3
--- /dev/null
+++ b/modules/sale_subscription/configuration.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+ Subscription
+
+
+
+
+
+
+
+
+
+
+
+ Subscription
+
+
+
+
+ sale.configuration
+
+ configuration_form
+
+
+
diff --git a/modules/sale_subscription/doc/index.rst b/modules/sale_subscription/doc/index.rst
new file mode 100644
index 0000000000..3dce7bbd92
--- /dev/null
+++ b/modules/sale_subscription/doc/index.rst
@@ -0,0 +1,86 @@
+Sale Subscription Module
+########################
+
+The sale subscription module defines subscription, services and recurrence rule
+models.
+
+Subscription
+************
+
+A subscription defines how some recurring services are periodically invoiced.
+The invoice is generated based on the consumption of each services. Here is the
+extensive list of the fields:
+
+- Party: The customer.
+- Contact: The contact who placed the order.
+- Invoice Party: An optional different party to invoice.
+- Invoice Address: The invoice address of the customer.
+- Number: The internal reference of the subscription.
+- Reference: The optional external reference of the subscription.
+- Description: An optional description for the subscription.
+- Start Date: The date at which the subscription starts.
+- End Date: The optional end date of the subscription.
+- Invoice Start Date: The date at which the invoice starts to be generated.
+- Invoice Recurrence: The definition of the invoicing recurrence.
+- Payment Term: The payment term to apply on the invoices.
+- Currency: Define the currency to use for the subscription. All service prices
+ will be computed accordingly.
+- Lines:
+
+ - Service: A required reference to the service subscribed.
+ - Description: The description of the service subscribed.
+ - Consumption Recurrence: The optional recurrence of consumption of the
+ service.
+ - Quantity: The quantity consumed on each occurrence.
+ - Unit: The unit of measure of the quantity.
+ - Unit Price: The unit price of the service expressed in the currency of
+ the subscription.
+ - Start Date: An optional later start date than the subscription.
+ - End Date: An optional earlier end date than the subscription.
+
+- States: The state of the subscription. May take one of the following values:
+ Draft, Quotation, Running, Closed, Cancelled.
+- Company: The company which issue the sale order.
+
+A running subscription can be modified by going back to draft and edit. Some
+field may not more be editable if the consumption has already started.
+The draft subscription is momentary stopped until it is set back to running.
+
+The consumptions are created by schedulers or by a wizard.
+Idem for the creation of the invoices.
+
+Service
+*******
+
+A subscription service defines the default consumption of a product. It is
+composed of the fields:
+
+- Product: A product of type service.
+- Consumption Recurrence: The recurrence at which the service is consumed.
+- Consumption Delay: A delay to apply between the date the consumption is
+ created and the date of the consumption.
+
+Recurrence Rule
+***************
+
+It defines combination of rules which compute the occurrence dates.
+
+- Name: The name of the rule.
+- Rules:
+
+ - Exclusive: Define if the rule excludes the resulted dates.
+ - Frequency: Daily, Weekly, Monthly, Yearly.
+ - Interval: The interval of the frequency
+ - By Week Day: Defines the list of weekdays where the recurrence will be
+ applied.
+ - By Month Day: Defines the list of month days to apply the recurrence to.
+ - By Year Day: Defines the list of year days to apply the recurrence to.
+ - By Week Number: Defines the list of week numbers (ISO8601) to apply the
+ recurrence to.
+ - By Month: Defines the list of months to apply the recurrence to.
+ - By Position: Defines the list of occurrence positions.
+ - Week Start Day.
+
+The computation of occurrences is base on the `python-dateutil library`_.
+
+.. _`python-dateutil library`: https://dateutil.readthedocs.io/en/stable/rrule.html
diff --git a/modules/sale_subscription/exceptions.py b/modules/sale_subscription/exceptions.py
new file mode 100644
index 0000000000..d3d2d0c7a7
--- /dev/null
+++ b/modules/sale_subscription/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
+from trytond.model.exceptions import ValidationError
+
+
+class InvalidRecurrence(ValidationError):
+ pass
+
+
+class InvoiceError(UserError):
+ pass
+
+
+class RecurrenceRuleValidationError(ValidationError):
+ pass
diff --git a/modules/sale_subscription/icons/LICENSE b/modules/sale_subscription/icons/LICENSE
new file mode 100644
index 0000000000..7a4a3ea242
--- /dev/null
+++ b/modules/sale_subscription/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/sale_subscription/icons/tryton-sale-subscription.svg b/modules/sale_subscription/icons/tryton-sale-subscription.svg
new file mode 100644
index 0000000000..03e282bce5
--- /dev/null
+++ b/modules/sale_subscription/icons/tryton-sale-subscription.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/modules/sale_subscription/invoice.py b/modules/sale_subscription/invoice.py
new file mode 100644
index 0000000000..6b3958c22b
--- /dev/null
+++ b/modules/sale_subscription/invoice.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.pool import Pool, PoolMeta
+
+
+class InvoiceLine(metaclass=PoolMeta):
+ __name__ = 'account.invoice.line'
+
+ @property
+ def origin_name(self):
+ pool = Pool()
+ SubscriptionLine = pool.get('sale.subscription.line')
+ name = super(InvoiceLine, self).origin_name
+ if isinstance(self.origin, SubscriptionLine):
+ name = self.origin.subscription.rec_name
+ return name
+
+ @classmethod
+ def _get_origin(cls):
+ models = super(InvoiceLine, cls)._get_origin()
+ models.append('sale.subscription.line')
+ return models
diff --git a/modules/sale_subscription/ir.py b/modules/sale_subscription/ir.py
new file mode 100644
index 0000000000..6bccef6a1e
--- /dev/null
+++ b/modules/sale_subscription/ir.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 PoolMeta
+
+
+class Cron(metaclass=PoolMeta):
+ __name__ = 'ir.cron'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.method.selection.extend([
+ ('sale.subscription.line|generate_consumption',
+ "Generate Subscription Line Consumptions"),
+ ('sale.subscription|generate_invoice',
+ "Generate Subscription Invoices"),
+ ])
diff --git a/modules/sale_subscription/locale/bg.po b/modules/sale_subscription/locale/bg.po
new file mode 100644
index 0000000000..cebbf7fdb9
--- /dev/null
+++ b/modules/sale_subscription/locale/bg.po
@@ -0,0 +1,662 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumptions"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/ca.po b/modules/sale_subscription/locale/ca.po
new file mode 100644
index 0000000000..c534c050df
--- /dev/null
+++ b/modules/sale_subscription/locale/ca.po
@@ -0,0 +1,637 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Serveis de subscripció"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Seqüència de subscripció"
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Seqüència de subscripció"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr "Contacte"
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Data final"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Adreça de facturació"
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Tercer de la factura"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "Recurrència factura"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr "Data inici factura"
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "Data següent factura"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Tercer"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Termini de pagament"
+
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Pressupostada per"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr "Executat per"
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Data inicial"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumit fins"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Retard consum"
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Recurrència consum"
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Data final"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr "Data següent consum"
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr "Següent consum amb retard"
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Servei"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr "Categoria d'unitat del servei"
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Data inicial"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscripció"
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Data final subscripció"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Data inici subscripció"
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Estat subscripció"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línia de factura"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Línia"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr "El més"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr "El dia del més"
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr "La posició"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr "El dia de la setmana"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr "El nombre de setmana"
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr "El dia de l'any"
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr "Exclusiu"
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "Freqüència"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr "Interval"
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr "Conjunt"
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr "Dia setmana inici"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr "Regles"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr "Nombre"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Recurrència de la subscripció"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr "Resultat"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Data inicial"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Retràs consum"
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Recurrència consum"
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr "Feu que la subscripció pertanyi a l'empresa."
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr "El identificador principal de la subscripció."
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr "El tercer que es subscriu."
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr "La identificació d'un origen extern."
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr "L'estat actual de la subscripció."
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr "Afegiu línies a la subscripció."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr "Una llista de nombres separada per comes."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr "Una llista de nombres separada per comes."
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr "Una llista de nombres separada per comes."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+"Una llista de nombres o dies de la setmana (MO, TU, etc) separada per comes."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr "Una llista de nombres (ISO8601) separada per comes."
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr "Una llista de nombres separada per comes."
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr "Afegir regles al conjunt."
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr "El identificador principal del conjunt de regles."
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr "Utilitzat per determinar quantes ocurrències calcular."
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Crea factures de subscripció"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Crea consums de les línies"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Conjunts de regles de recurrència"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Serveis de subscripció"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscripcions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consums"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consums"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consums"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscripcions"
+
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Provar la recurrència de la subscripció"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Pressupost"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "En execució"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr "No podeu eliminar el consum facturat \"%(consumption)s\"."
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Per facturar els consums heu de definir un compte d'ingressos pel producte "
+"\"%(product)s\"."
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr "No podeu modificar el consum facturat \"%(consumption)s\"."
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+"El recurrència de consum de la línia \"%(line)s\" de la subscripció "
+"\"%(subscription)s\" no genera cap ocurrència."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+"No podeu eliminar el tercer \"%(party)s\" mentre tingui subscripcions "
+"pendents amb l'empresa \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+"El recurrència de facturació de la subscripció \"%(subscription)s\" no "
+"genera cap ocurrència."
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+"Invalid \"%(fields)\" \"%(value)s\" a la regla de recurrència "
+"\"%(recurrence_rule)s\" amb l'excpeció \"%(exception)s\"."
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Pressupost"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Executa"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscripció"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscripció"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscripció"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Crea factures de subscripció"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Crea consums de les línies"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Conjunts de regles de recurrència"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Provar la recurrència de la subscripció"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Serveis de subscripció"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscripcions"
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscripció"
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Crea factures de subscripció"
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Línia de subscripció"
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Consum de Línia de subscripció"
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Crea consums de línies de subscripció"
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Regles de recurrència de les subscripcions"
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Conjunt de regles de recurrència de les subscripcions"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Provar el conjunt de regles de recurrència de la subscripció"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr ""
+"Resultat de la prova del conjunt de regles de recurrència de la subscripció"
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Serveis de subcripció"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Genera les factures de les subscripcions"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Genera consums de les línies de subscripció"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancel·lada"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "Tancat"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Pressupost"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "En execució"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "Diàriament"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "Mensualment"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "Setmanalment"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "Anualment"
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Crea les factures de subscripció fins la data"
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Crea els consums de subscripció fins la data"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscripció"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "Crea"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "Crea"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Tanca"
diff --git a/modules/sale_subscription/locale/cs.po b/modules/sale_subscription/locale/cs.po
new file mode 100644
index 0000000000..cebbf7fdb9
--- /dev/null
+++ b/modules/sale_subscription/locale/cs.po
@@ -0,0 +1,662 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumptions"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/de.po b/modules/sale_subscription/locale/de.po
new file mode 100644
index 0000000000..261bd9bd90
--- /dev/null
+++ b/modules/sale_subscription/locale/de.po
@@ -0,0 +1,640 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Abonnement Dienstleistungen"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Nummernkreis Abonnement"
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Nummernkreis Abonnement"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr "Kontakt"
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Enddatum"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Rechnungsadresse"
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Rechnungsempfänger"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "Wiederkehrende Rechnung"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr "Startdatum der Verrechnung"
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "Nächstes Rechnungsdatum"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Partei"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Zahlungsbedingung"
+
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Angeboten von"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Referenz"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr "Ausgeführt von"
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Startdatum"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Verbraucht bis"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Verbrauchszeitraum"
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Wiederkehrender Verbrauch"
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Beschreibung"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Enddatum"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr "Nächstes Verbrauchsdatum"
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr "Nächster Verbrauch verzögert"
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Dienstleistung"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr "Einheitenkategorie Dienstleistung"
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Startdatum"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Ablaufdatum des Abonnements"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Startdatum des Abonnements"
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Status des Abonnements"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Rechnungsposition"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Position"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr "Am Tag des Monats"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr "Am Tag des Monats"
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr "An Position"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr "Am Wochentag"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr "In Kalenderwoche"
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr "Am Tag im Jahr"
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr "Exklusiv"
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "Frequenz"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr "Intervall"
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr "Satz"
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr "Erster Wochentag"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr "Regeln"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr "Anzahl"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Abonnement Wiederholungsregel"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr "Ergebnis"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Startdatum"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Verbrauchszeitraum"
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Wiederkehrender Verbrauch"
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr "Das Abonnement dem Unternehmen zuordnen."
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr "Die Hauptbezeichnung des Abonnements."
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr "Die Partei die abonniert."
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr "Die Identifikation für eine externe Herkunft."
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr "Der aktuelle Status des Abonnements."
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr "Die Position unter dem Abonnement hinzufügen."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr "Durch Komma getrennte Liste von Ganzzahlen."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr "Durch Komma getrennte Liste von Ganzzahlen."
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr "Durch Komma getrennte Liste von Ganzzahlen."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+"Durch Komma getrennte Liste von Ganzzahlen oder Wochentagen (MO, TU etc)."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr "Durch Komma getrennte Liste von Ganzzahlen (ISO8601)."
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr "Durch Komma getrennte Liste von Ganzzahlen."
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr "Die Regel am Ende hinzufügen."
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr "Das Hauptidentifizierungsmerkmal des Regelsatzes."
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr "Wir zur Berechnung der Anzahl der Vorkommnisse verwendet."
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Rechnungen für Abonnements erstellen"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Verbrauchspositionen erstellen"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Abonnement Wiederholungsregelsätze"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Abonnement Dienstleistungen"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Abonnements"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr "Rechnungen"
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Verbrauch"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Verbrauch"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Verbrauch"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Abonnements"
+
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Test Abonnement Wiederholungsregel"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Angebot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "In Ausführung"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+"Der bereits abgerechnete Verbrauch \"%(consumption)s\" kann nicht gelöscht "
+"werden."
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Damit der Verbrauch abgerechnet werden kann, muss zuerst ein Ertragskonto "
+"für Artikel \"%(product)s\" konfiguriert werden."
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+"Der bereits abgerechnete Verbrauch \"%(consumption)s\" kann nicht mehr "
+"geändert werden."
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+"Die Verbrauchswiederholung von Position \"%(line)s\" von Abonnement "
+"\"%(subscription)s\" erzeugt keine Vorkommnisse."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+"Die Partei \"%(party)s\" kann nicht gelöscht werden, solange für sie noch "
+"unerledigte Abonnements bei Unternehmen \"%(company)s\" bestehen."
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+"Die Rechnungswiederholung von Abonnement \"%(subscription)s\" erzeugt keine "
+"Vorkommnisse."
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+"\"%(field)s\" \"%(value)s\" in Wiederholungsregel \"%(recurrence_rule)s\" "
+"ist ungültig mit Fehler \"%(exception)s\"."
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Angebot"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Ausführen"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Rechnungen für Abonnements erstellen"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Verbrauchspositionen erstellen"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Abonnement Wiederholungsregelsätze"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Test Abonnement Wiederholungsregel"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Abonnement Dienstleistungen"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Abonnements"
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Rechnung für Abonnement erstellen"
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Abonnement Position"
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Abonnement Position Verbrauch"
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Verbrauch für die Abonnementsposition erstellen"
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Abonnement Wiederholungsregel"
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Abonnement Wiederholungsregelsatz"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Test Abonnement Wiederholungsregelsatz"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Test Abonnement Wiederholungsregelsätze"
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Abonnement Dienstleistung"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Rechnungen für Abonnements erstellen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Verbrauchspositionen für Abonnements erstellen"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "Geschlossen"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Angebot"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "In Ausführung"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "Täglich"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "Monatlich"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "Jährlich"
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Rechnungen für Abonnements für ein Datum erstellen"
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Verbrauch für die Abonnementsposition für ein Datum erstellen"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "Erstellen"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "Erstellen"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Schließen"
diff --git a/modules/sale_subscription/locale/es.po b/modules/sale_subscription/locale/es.po
new file mode 100644
index 0000000000..5e402e2e14
--- /dev/null
+++ b/modules/sale_subscription/locale/es.po
@@ -0,0 +1,638 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Servicios de suscripción"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Sequencia de suscripción"
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Solicitud de suscripción"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr "Contacto"
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Fecha final"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Dirección de facturación"
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Tercero de la factura"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "Recurrencia de facturación"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr "Fecha inicial de facturación"
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "Fecha próxima factura"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Tercero"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Plazo de pago"
+
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Presupuestada por"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr "Ejecutado por"
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Fecha inicial"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumido hasta"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Retraso del consumo"
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Recurrencia del consumo"
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Fecha final"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr "Fecha siguiente consumo"
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr "Fecha siguiente consumo con retraso"
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Servicio"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr "Categoría de unidad de servicio"
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Fecha inicial"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Suscripción"
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Fecha final suscripción"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Fecha inicial suscripción"
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Estado suscripción"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Línea de factura"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr "El mes"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr "El día del mes"
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr "La posición"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr "El día de la semana"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr "El número de semana"
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr "El día del año"
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr "Exclusivo"
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr "Conjunto"
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr "Día semana inicio"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr "Reglas"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr "Contador"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Recurrencia de la suscripción"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr "Resultado"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Fecha inicial"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Retraso de consumo"
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Recurrencia consumo"
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr "Hacer que la suscripción pertenezca a la compañía."
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr "El identificador principal de la suscripción."
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr "El tercero que se suscribe."
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr "La identificación en un origen externo."
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr "El estado actual de la suscripción."
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr "Añade lineas a la suscripción."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr "Una lista de números separada por comas."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr "Una lista de números separada por comas."
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr "Una lista de números separada por comas."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+"Una lista de números o días de la semana (MO, TU, etc) separada por comas."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr "Una lista de números (ISO8601) separada por comas."
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr "Una lista de números separada por comas."
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr "Añade reglas al conjunto."
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr "El identificador principal del conjunto de reglas."
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr "Utilizado para determinar cuántas ocurrencias calcular."
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Crear facturas de suscripción"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Crear consumos de las líneas"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Conjuntos de reglas de recurrencia"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Servicios de suscripción"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Suscripciones"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr "Facturas"
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumos"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumos"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumos"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Suscripciones"
+
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Probar la recurrencia de la suscripción"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "En ejecución"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr "No puede eliminar el consumo facturado \"%(consumption)s\"."
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Para facturar los consumos debe definir una cuenta de ingresos para el "
+"producto \"%(product)s\"."
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr "No puede modificar el consumo facturado \"%(consumption)s\"."
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+"El recurrencia de consumo de la línea \"%(line)s\" de la suscripción "
+"\"%(subscription)s\" no genera ninguna ocurrencia."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+"No puede eliminar el tercero \"%(party)s\" mientras tenga subscripciones "
+"pendientes con la empresa \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+"El recurrencia de facturación de la suscripción \"%(subscription)s\" no "
+"genera ninguna ocurrencia."
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+"Inválido \"%(field)s\" \"%(value)s\" en la regla de recurrencia "
+"\"%(recurrence_rule)s\" con excepción \"%(exception)s\"."
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Presupuesto"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Ejecutar"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Suscripción"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Suscripción"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Suscripción"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Crear facturas de suscripción"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Crear consumos de las líneas"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Conjuntos de reglas de recurrencia"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Probar la recurrencia de la suscripción"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Servicios de suscripción"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Suscripciones"
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Suscripción"
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Crear facturas de suscripción"
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Linea de suscripción"
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Consumo de linea de suscripción"
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Crear consumos de lineas de suscripción"
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Reglas de recurrencia de la suscripción"
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Conjunto de reglas de recurrencia de la suscripción"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Probar el conjunto de reglas de recurrencia de la suscripción"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr ""
+"Resultado de la prueba de conjuntos de reglas de recurrencia de la "
+"suscripción"
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Servicios de suscripción"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generar las facturas de las suscripciones"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generar consumos de las lineas de suscripción"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancelada"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "Cerrada"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Presupuesto"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "En ejecución"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Crear las facturas de suscripción hasta la fecha"
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Crear los consumos de suscripción hasta la fecha"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Suscripción"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "Crear"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "Crear"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Cerrar"
diff --git a/modules/sale_subscription/locale/es_419.po b/modules/sale_subscription/locale/es_419.po
new file mode 100644
index 0000000000..16f27de95e
--- /dev/null
+++ b/modules/sale_subscription/locale/es_419.po
@@ -0,0 +1,625 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr ""
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr ""
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr ""
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr ""
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr ""
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr ""
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr ""
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr ""
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr ""
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr ""
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/et.po b/modules/sale_subscription/locale/et.po
new file mode 100644
index 0000000000..22a761a4df
--- /dev/null
+++ b/modules/sale_subscription/locale/et.po
@@ -0,0 +1,644 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Tellimuse teenused"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Tellimuse jada"
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Tellimuse jada"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Valuuta"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Selgitus"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Lõppkuupäev"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Arve aadress"
+
+#, fuzzy
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Arve alguskuupäev"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "Arve kordus"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr "Arve alguskuupäev"
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Read"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "Järgmise arve kuupäev"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Osapool"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Maksetingimus"
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Päring"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Viide"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Alguskuupäev"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "Staatus"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Kasutatud"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Kasutuse viide"
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Kasutuse kordus"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Valuuta"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Selgitus"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Lõppkuupäev"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr "Järgmise kasutuse kuupäev"
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr "Järgmise kasutuse viide"
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Teenus"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr "Teenuse ühiku kategooria"
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Alguskuupäev"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Tellimus"
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Tellimuse lõppkuupäev"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Tellimuse alguskuupäev"
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Tellimuse olek"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "Ühik"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "Ühiku hind"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Arve rida"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Rida"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "Ühik"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr "Kuude lõikes"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr "Kuu päeva lõikes"
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr "Postisooni lõikes"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr "Nädalapäeva lõikes"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr "Nädala numbri lõikes"
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr "Aasta päeva lõikes"
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr "Eksklusiivne"
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "Sagedus"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr "Intervall"
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr "Komplekt"
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr "Nädala alguse päev"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Nimi"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr "Reegel"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Tellimuse jada"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Alguskuupäev"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Tarbimise viide"
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Tarbimise kordus"
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr "Teenuse tellija osapool"
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Loo tellimuse arved"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Tellimuse teenused"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Tellimused"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr "Arved"
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Tarbimised"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Tarbimised"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Tarbimised"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Tellimused"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Arve kordus"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Päring"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Töös"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Päring"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Käivit"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Tellimus"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Tellimus"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Tellimus"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Loo tellimuse arved"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Arve kordus"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Tellimuse teenused"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Tellimused"
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Tellimus"
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Loo tellimuse arve"
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Tellimuse rida"
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr ""
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Tellimuse jada"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr ""
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Tellimuse teenus"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Loo tellimuse arved"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "Suletud"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Päring"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Töös"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "Igapäevane"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "Igakuine"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "Iganädalane"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "Iga-aastane"
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Loo tellimuse arved"
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr ""
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "Üldine"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "Muu info"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Tellimus"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "Loo"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "Loo"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Suletud"
diff --git a/modules/sale_subscription/locale/fa.po b/modules/sale_subscription/locale/fa.po
new file mode 100644
index 0000000000..11de85235f
--- /dev/null
+++ b/modules/sale_subscription/locale/fa.po
@@ -0,0 +1,651 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "سرویس اشتراک"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "دنباله اشتراک"
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "دنباله اشتراک"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "واحد پول"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "شرح"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "تاریخ پایان"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "آدرس صورتحساب"
+
+#, fuzzy
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "تاریخ شروع صورتحساب"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "باز تکرار صورتحساب"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr "تاریخ شروع صورتحساب"
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "سطرها"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "تاریخ صورت حساب بعدی"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "نهاد/سازمان"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "مدت پرداخت"
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "مرجع"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "تاریخ شروع"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "شرکت"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "مصرف شده"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "تاخیر مصرف"
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "باز تکرار مصرف"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "واحد پول"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "شرح"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "تاریخ پایان"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr "تاریخ مصرف بعدی"
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr "مصرف بعدی به تاخیر افتاده"
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "خدمات"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr "دسته بندی واحد خدمات"
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "تاریخ شروع"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "اشتراک"
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "تاریخ پایان اشتراک"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "تاریخ شروع اشتراک"
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "وضعیت اشتراک"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "واحد"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "قیمت واحد"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "سطر صورتحساب"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "سطر"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "واحد"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr "بر اساس ماه"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr "بر اساس روزهای ماه"
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr "بر اساس موقعیت"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr "براساس روزهای هفته"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr "بر اساس شماره هفته"
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr "براساس روزهای سال"
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr "انحصاری"
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "فرکانس"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr "وقفه"
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr "مجموعه"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr "روز شروع هفته"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr "قوانین"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "قانون بازتکرار اشتراک"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "تاریخ شروع"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "تاخیر مصرف"
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "باز تکرار مصرف"
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr "اشتراک متعلق به شرکت را بسازید."
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr "کد شناسه اصلی اشتراک."
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr "نهاد/سازمانی که مشترک شده است."
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr "شناسایی منشاء خارجی."
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr "وضعیت جاری اشتراک."
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr "اضافه کردن سطر در زیر اشتراک."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr "یک لیست اعداد صحیح جداشده با ویرگول."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr "یک لیست اعداد صحیح جداشده با ویرگول."
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr "یک لیست اعداد صحیح جداشده با ویرگول."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr "یک لیست اعداد صحیح جداشده با ویرگول یا روزهای هفته (MO, TU , etc) ."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr "یک لیست اعداد صحیح جداشده با ویرگول (ISO8601)."
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr "یک لیست اعداد صحیح جداشده با ویرگول."
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr "اضافه کردن قانون در زیرمجموعه"
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr "شناسه اصلی مجموعه قانون"
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "ایجاد صورتحساب اشتراک"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "ایجاد سطر اشتراک"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "مجموعه های قانون بازتکرار اشتراک"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "سرویس اشتراک"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "اشتراک ها"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr "صورتحساب ها"
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "مصرفی"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "مصرفی"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "مصرفی ها"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "اشتراک ها"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "قانون بازتکرار اشتراک"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "نقل قول"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "در حال اجرا"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr "شما نمی توانید صورتحساب کالای مصرفی :\"%(consumption)s\" را حذف کنید."
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"برای صورتحساب کالای مصرفی شما باید یک حساب درآمد برای محصول :\"%(product)s\""
+" تعریف کنید."
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr "شما نمی توانید صورتحساب کالای مصرفی :\"%(consumption)s\"را اصلاح کنید."
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+"شما نمیتوانید نهاد/سازمان :\"%(party)s\"را که مشترکین در انتظار با شرکت "
+":\"%(company)s\" دارد را حذف کنید."
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+"\"%(value)s\"در \"%(field)s\" در قانون عودت :\"%(recurrence_rule)s\" با "
+"شرایط :\"%(exception)s\" نامعتبر است."
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "اشتراک"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "اشتراک"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "اشتراک"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "ایجاد صورتحساب های اشتراک"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "ایجاد سطر مصرفی ها"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "مجموعه های قانون بازتکرار اشتراک"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "قانون بازتکرار اشتراک"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "سرویس اشتراک"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "اشتراک ها"
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "اشتراک"
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "ایجاد صورتحساب اشتراک"
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "سطر اشتراک"
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "سطر مصرفی در اشتراک"
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "ایجاد سطر مصرفی اشتراک"
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "قانون بازتکرار اشتراک"
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "مجموعه قانون بازتکرار اشتراک"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "مجموعه قانون بازتکرار اشتراک"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "مجموعه های قانون بازتکرار اشتراک"
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "سرویس اشتراک"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "تولید صورتحساب اشتراک"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "تولید سطر مصرفی ها در اشتراک"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "بسته شده"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "نقل قول"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "در حال اجرا"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "روزانه"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "ماهانه"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "هفتگی"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "سالانه"
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "ایجاد صورتحساب های اشتراک برای تاریخ"
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "ایجاد سطر مصرفی اشتراک برای تاریخ"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "عمومی"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "سایر اطلاعات"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "اشتراک"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "ایجاد"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "انصراف"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "ایجاد"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "انصراف"
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "بسته شده"
diff --git a/modules/sale_subscription/locale/fi.po b/modules/sale_subscription/locale/fi.po
new file mode 100644
index 0000000000..cebbf7fdb9
--- /dev/null
+++ b/modules/sale_subscription/locale/fi.po
@@ -0,0 +1,662 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumptions"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/fr.po b/modules/sale_subscription/locale/fr.po
new file mode 100644
index 0000000000..853e752dc2
--- /dev/null
+++ b/modules/sale_subscription/locale/fr.po
@@ -0,0 +1,639 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Services d'abonnement"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Séquence d'abonnement"
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Séquence d'abonnement"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr "Contact"
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Date de fin"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Adresse de facturation"
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Tiers de facturation"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "Récurrence de facturation"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr "Date de début de facturation"
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "Prochaine date de facturation"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Tiers"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Conditions de paiement"
+
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Devis fait par"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr "Exécuté par"
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Date de début"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consommée jusqu'à"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Délai de consommation"
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Récurrence de consommation"
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Date de fin"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr "Prochaine date de consommation"
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr "Prochaine consommation retardée"
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Service"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr "Catégorie d'unité du service"
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Date de début"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Date de fin de l'abonnement"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Date de début de l'abonnement"
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "État de l'abonnement"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Ligne de facture"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Ligne"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr "Par mois"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr "Par jour du mois"
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr "Par position"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr "Par jour de semaine"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr "Par numéro de semaine"
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr "Par jour d'année"
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr "Exclusive"
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "Fréquence"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr "Intervalle"
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr "Ensemble"
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr "Jour de début de semaine"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr "Règles"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr "Nombre"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Récurrence de l'abonnement"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr "Résultat"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Date de début"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Délai de consommation"
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Récurrence de consommation"
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr "Faire appartenir l’abonnement à la société."
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr "L'identifiant principal de l'abonnement."
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr "Le tiers qui souscrit."
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr "L'identifiant de l'origine externe."
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr "L'état actuel de l'abonnement."
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr "Ajouter la ligne sous l'abonnement."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr "Une liste d'entiers séparés par des virgules."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr "Une liste d'entiers séparés par des virgules."
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr "Une liste d'entiers séparés par des virgules."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+"Une liste d'entiers ou de jour de semaine (MO, TU etc.) séparés par des "
+"virgules."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr "Une liste d'entiers (ISO8601) séparés par des virgules."
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr "Une liste d'entiers séparés par des virgules."
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr "Ajouter la règle dans l'ensemble."
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr "L'identifiant principal de l'ensemble de règles."
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr "Utilisé pour déterminer le nombre d'occurrences à calculer."
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Créer les factures d'abonnements"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Créer les lignes de consommations"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Ensemble de règles de récurrence d'abonnement"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Services d'abonnement"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Abonnements"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr "Factures"
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consommations"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consommations"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consommations"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Abonnements"
+
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Test de règle de récurrence"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "Tous"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "En cours"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+"Vous ne pouvez pas supprimer la consommation facturée « %(consumption)s »."
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Pour facture les consommations, vous devez définir un compte de produits "
+"pour le produit « %(product)s »."
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+"Vous ne pouvez pas modifier la consommation facturée « %(consumption)s »."
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+"La récurrence de consommation de la ligne « %(line)s » de l'abonnement "
+"« %(subscription)s » ne génère aucune occurrence."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+"Vous ne pouvez pas effacer le tiers « %(party)s » tant qu'il a des "
+"abonnements en cours pour la société « %(company)s »."
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+"La récurrence de facturation de l'abonnement « %(subscription)s » ne génère"
+" aucune occurrence."
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+"« %(field)s » « %(value)s » sur la règle de récurrence "
+"« %(recurrence_rule)s » est invalide avec l'exception « %(exception)s »."
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Devis"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Lancer"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Créer les factures d'abonnements"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Créer les lignes de consommations"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Ensemble de règles de récurrence d'abonnement"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Test de règle de récurrence"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Services d'abonnement"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Abonnements"
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Créer la facture d'abonnement"
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Ligne d'abonnement"
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Consommation de ligne d'abonnement"
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Créer la consommation de la ligne d'abonnement"
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Règle de récurrence d'abonnement"
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Ensemble de règles de récurrence d'abonnement"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Test de l'ensemble de règles de récurrence d'abonnement"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Résultat de test de l'ensemble de règles de récurrence d'abonnement"
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Service d'abonnement"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Générer les factures d'abonnements"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Générer les lignes de consommation d'abonnements"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Annulée"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "Clôturé"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Devis"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "En cours"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "Quotidien"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "Hebdomadaire"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Créer les factures d'abonnement pour la date"
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Créer les lignes de consommation d'abonnement pour la date"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "Créer"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "Créer"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Fermer"
diff --git a/modules/sale_subscription/locale/hu.po b/modules/sale_subscription/locale/hu.po
new file mode 100644
index 0000000000..cebbf7fdb9
--- /dev/null
+++ b/modules/sale_subscription/locale/hu.po
@@ -0,0 +1,662 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumptions"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/id.po b/modules/sale_subscription/locale/id.po
new file mode 100644
index 0000000000..0e051ae30e
--- /dev/null
+++ b/modules/sale_subscription/locale/id.po
@@ -0,0 +1,631 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Deskripsi"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr ""
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr ""
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Mata uang"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Deskripsi"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Tanggal Akhir"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Alamat Faktur"
+
+#, fuzzy
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Tanggal Faktur Berikutnya"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Baris"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "Tanggal Faktur Berikutnya"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Pihak"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Masa Pembayaran"
+
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Dikutip Oleh"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Referensi"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Tanggal Awal"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Mata Uang"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Deskripsi"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Tanggal Akhir"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Jasa"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Tanggal Awal"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "Harga Satuan"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Baris Faktur"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Baris"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "Frekuensi"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Deskripsi"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Tanggal Awal"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr "Faktur-Faktur"
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Rancangan"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Deskripsi"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr ""
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr ""
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr ""
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr ""
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Dibatalkan"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "Harian"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "Bulanan"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "Mingguan"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "Tahunan"
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr ""
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr ""
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "Umum"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "Info Lain"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "Buat"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "Buat"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Tutup"
diff --git a/modules/sale_subscription/locale/it.po b/modules/sale_subscription/locale/it.po
new file mode 100644
index 0000000000..6125bbd0f1
--- /dev/null
+++ b/modules/sale_subscription/locale/it.po
@@ -0,0 +1,661 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr "Contatto"
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Descrizione"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Data fine"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Indirizzo di fatturazione"
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "Ricorrenza della fattura"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr "Data inizio fatturazione"
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Righe"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "Data fatturazione successiva"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Numero"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Controparte"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Termine di pagamento"
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Riferimento"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Data inizio"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumato fino"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Descrizione"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Data fine"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Servizio"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Data inizio"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "Unità"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Riga"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "Unità"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Data inizio"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Preventivo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/lo.po b/modules/sale_subscription/locale/lo.po
new file mode 100644
index 0000000000..cebbf7fdb9
--- /dev/null
+++ b/modules/sale_subscription/locale/lo.po
@@ -0,0 +1,662 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumptions"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/lt.po b/modules/sale_subscription/locale/lt.po
new file mode 100644
index 0000000000..acb02bf2a1
--- /dev/null
+++ b/modules/sale_subscription/locale/lt.po
@@ -0,0 +1,665 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Valiuta"
+
+#, fuzzy
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Pabaigos data"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Juridinis adresas"
+
+#, fuzzy
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Sąskaitos faktūros"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "Pasikartojanti sąskaita faktūra"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Kontrahentas"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Pradžios data"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumptions"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Valiuta"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Pabaigos data"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Pradžios data"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Prenumeratos pradžios data"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Sąskaitos faktūros eilutė"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Pradžios data"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Pabaigos data"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr "Sąskaitos faktūros"
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/nl.po b/modules/sale_subscription/locale/nl.po
new file mode 100644
index 0000000000..7d718ca615
--- /dev/null
+++ b/modules/sale_subscription/locale/nl.po
@@ -0,0 +1,638 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Abonnement Diensten"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Abonnementsvolgorde"
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Abonnementsvolgorde"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr "Contact"
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Omschrijving"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Eind datum"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Factuuradres"
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Factuur relatie (Invoice Party)"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "Factuurherhaling"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr "startdatum facturatie"
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Regels"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "volgende facturatie datum"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Relaties"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Betalingstermijn"
+
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Offerte gemaakt door"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr "Uitgevoerd door"
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Start datum"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "datum"
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Verbruikt tot"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Houdbaarheid"
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "wederkerend verbruik"
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Omschrijving"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Eind datum"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr "Volgende verbruiksdatum"
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr "Volgende uitgestelde verbruiksdatum"
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Dienst"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr "Dienst eenheid categorie"
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Start datum"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Einddatum abonnement"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Begindatum abonnement"
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Abonnementsstatus"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "Eenheids- prijs"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Factuurregel"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Regel"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr "per maand"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr "op dag van de maand"
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr "Op positie"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr "Per weekdag"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr "Op weeknummer"
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr "Per dag van het jaar"
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr "exclusief"
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "Frequentie"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr "Interval"
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr "groep (set)"
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr "eerste dag van de week"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr "Regels"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr "Tellen"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Abonnementsherhaling"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr "Resultaat"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Start datum"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "datum"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Consumptievertraging"
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "wederkerend verbruik"
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr "Maak het abonnement eigendom van het bedrijf."
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr "De hoofdidentificatie van het abonnement."
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr "De relatie die zich inschrijft."
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr "De identificatie van een externe oorsprong."
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr "De huidige status van het abonnement."
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr "Voeg de onderstaande regel toeaan het abonnement."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr "Een door komma's gescheiden lijst met gehele getallen."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr "Een door komma's gescheiden lijst met gehele getallen."
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr "Een door komma's gescheiden lijst met gehele getallen."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+"Een door komma's gescheiden lijst met gehele getallen of weekdagen (Ma, DI "
+"enz.)."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr "Een door komma's gescheiden lijst met gehele getallen (ISO8601)."
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr "Een door komma's gescheiden lijst met gehele getallen."
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr "Voeg de regel toe onder het geheel(set)."
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr "De hoofdidentificatie van de regelset."
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+"Wordt gebruikt om te bepalen hoeveel voorvallen moeten worden berekend."
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Maak een abonnementsfactuur aan"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Maak een verbruiksartikkel"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Herhalingsregels abonnement"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Abonnementsdiensten"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Abonnementen"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr "Facturen"
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "verbruiken"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "verbruiken"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "verbruiken"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Abonnementen"
+
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Test herhalingsregel"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "Alles"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Offerte"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "in uitvoering"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr "U kunt het gefactureerde verbruik \"%(consumption)s\" niet verwijderen."
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+"Om consumpties te factureren, moet u een omzetrekening definiëren voor "
+"product \"% (product) s\"."
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr "U kunt het gefactureerde verbruik \"%(consumption)s\" niet wijzigen."
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+"De herhaling van verbruik van regel \"%(line)s\" van abonnement "
+"\"%(subscription)s\" genereert geen enkele gebeurtenis."
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"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_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+"Het herhalen van de facturering van abonnement \"%(subscription)s\" "
+"genereert geen gebeurtenissen."
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+"\"%(field)s\" \"%(value)s\" in herhalingsregel \"%(recurrence_rule)s\" "
+"is/zijn ongeldig met fout \"%(exception)s\"."
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "offerte"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "uitvoeren"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Abonnementsfactuur maken"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Maak een verbruiksartikel"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Herhalingsregels abonnement"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Test herhalingsregel"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Abonnementsdiensten"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Abonnementen"
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Abonnementsfactuur maken"
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Abonnementsregel"
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Abonnement verbruik"
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Creëer consumptie voor het abonnement item"
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "abonnement herhalingsregel"
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Herhalingsregels abonnement"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Regelset voor herhaling van abonnement testen"
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Testabonnement herhalingsregel Resultaat instellen"
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Abonnementsdienst"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Abonnementsfacturen genereren"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Consumpties voor abonnementsregels genereren"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "Afgesloten"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Offerte"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "in uitvoering"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "Dagelijks"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "Maandelijks"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "Wekelijks"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "Jaarlijks"
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Abonnementsfacturen voor datum maken"
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Creëer abonnementsregelconsumpties voor datum"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "Overige informatie"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Abonnement"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "Maken"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "Maken"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Sluiten"
diff --git a/modules/sale_subscription/locale/pl.po b/modules/sale_subscription/locale/pl.po
new file mode 100644
index 0000000000..c7ef8efaff
--- /dev/null
+++ b/modules/sale_subscription/locale/pl.po
@@ -0,0 +1,663 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Sekwencja subskrypcji"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Sekwencja subskrypcji"
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Sekwencja subskrypcji"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Waluta"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Data ukończenia"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Adres faktury"
+
+#, fuzzy
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Adres faktury"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Wiersze"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Strona"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Termin płatności"
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Referencja"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Data rozpoczęcia"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Firma"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumptions"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Waluta"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Data ukończenia"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Usługa"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr "Kategoria jednostki usługi"
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Data rozpoczęcia"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subskrypcja"
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Data zakończenia subskrypcji"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Data rozpoczęcia subskrypcji"
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Stan subskrypcji"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "Jednostka"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "Cena jednostkowa"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Wiersz faktury"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Wiersz"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "Jednostka"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr "Wg miesiąca"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr "Wg dnia miesiąca"
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr "Wg pozycji"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr "Wg dnia tygodnia"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr "Wg numeru tygodnia"
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr "Wg dnia roku"
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "Częstotliwość"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr "Ustaw"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr "Dzień rozpoczęcia tygodnia"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr "Reguły"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Data rozpoczęcia"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Sekwencja subskrypcji"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subskrypcje"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subskrypcje"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subskrypcja"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Sekwencja subskrypcji"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subskrypcja"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Wiersz subskrypcji"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Sekwencja subskrypcji"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "Zamknięto"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "Dziennie"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "Miesięcznie"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "Tygodniowo"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "Rocznie"
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "Ogólne"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "Inne informacje"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subskrypcja"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "Utwórz"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Anuluj"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "Utwórz"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Anuluj"
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Zamknięto"
diff --git a/modules/sale_subscription/locale/pt.po b/modules/sale_subscription/locale/pt.po
new file mode 100644
index 0000000000..375a158a81
--- /dev/null
+++ b/modules/sale_subscription/locale/pt.po
@@ -0,0 +1,666 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Sequência de Assinatura"
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Sequência de Assinatura"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Moeda"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Descrição"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Data de Término"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Endereço para Faturamento"
+
+#, fuzzy
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Data de Início da Fatura"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "Recorrência da Fatura"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr "Data de Início da Fatura"
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Linhas"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "Próxima Data da Fatura"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Pessoa"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Prazo de Pagamento"
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Referência"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Data de Início"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Empresa"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumido"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Atraso no Consumo"
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Recorrência do Consumo"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Moeda"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Descrição"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Data de término"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr "Próxima Data de Consumo"
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr "Próximo Consumo Atrasado"
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Serviço"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr "Categoria da Unidade de Serviço"
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Data de início"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Assinatura"
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Data de Término da Assinatura"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Data de Início da Assinatura"
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Estado da Assinatura"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "Unidade"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "Preço Unitário"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Linha da Fatura"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Linha"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "Unidade"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr "Por Mês"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por Dia do Mês"
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr "Por Posição"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr "Por Dia da Semana"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr "Por Número da Semana"
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr "Por Dia do Ano"
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr "Exclusivo"
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "Frequência"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr "Definir"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr "Dia de Início da Semana"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr "Regras"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Regra de Recorrência da Assinatura"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Data de Início"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Atraso no Consumo"
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Recorrência do Consumo"
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr "Faça com que a assinatura pertença à empresa."
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr "O identificador principal da assinatura."
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr "A pessoa que assina."
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr "Identificador de origem externa."
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr "O estado atual da assinatura."
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr "Adicionar linha abaixo da assinatura."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr "Lista de inteiros separados por vírgula."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr "Lista de inteiros separados por vírgula."
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr "Lista de inteiros separados por vírgula."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+"Lista de inteiros (que representem dias da semana) separados por vírgula."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr "Lista de inteiros (ISO8601) separados por vírgula."
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr "Lista de inteiros separados por vírgula."
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr "Adicionar a regra abaixo do conjunto."
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr "O principal identificador do grupo de regras."
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Regra de Recorrência da Assinatura"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Assinatura"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Regra de Recorrência da Assinatura"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Assinatura"
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Criar Assinatura de Fatura"
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Linha de Assinatura"
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Linha de Consumo da Assinatura"
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Criar Linha de Consumo da Assinatura"
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Regra de Recorrência da Assinatura"
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Grupo de Regras de Recorrência da Assinatura"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Grupo de Regras de Recorrência da Assinatura"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Serviço de Assinatura"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "Fechado"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Cotação"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Em execução"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "Mensalmente"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Criar Faturas de Assinatura para Data"
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Criar Linha de Consumo de Assinatura para Data"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "Geral"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "Outras informações"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Assinatura"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "Criar"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "Criar"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Fechado"
diff --git a/modules/sale_subscription/locale/ro.po b/modules/sale_subscription/locale/ro.po
new file mode 100644
index 0000000000..b48da30b91
--- /dev/null
+++ b/modules/sale_subscription/locale/ro.po
@@ -0,0 +1,631 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Descriere"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr ""
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr ""
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Descriere"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Parte Facturata"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Rânduri"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Parte"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr ""
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Valută"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Descriere"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Descriere"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Descriere"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr ""
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr ""
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr ""
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr ""
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "Închis"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr ""
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr ""
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Închis"
diff --git a/modules/sale_subscription/locale/ru.po b/modules/sale_subscription/locale/ru.po
new file mode 100644
index 0000000000..cebbf7fdb9
--- /dev/null
+++ b/modules/sale_subscription/locale/ru.po
@@ -0,0 +1,662 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumptions"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/sl.po b/modules/sale_subscription/locale/sl.po
new file mode 100644
index 0000000000..50e607f855
--- /dev/null
+++ b/modules/sale_subscription/locale/sl.po
@@ -0,0 +1,671 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Štetje naročnin"
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Štetje naročnin"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr "Konec"
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr "Naslov plačnika"
+
+#, fuzzy
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr "Začetek zaračunavanja"
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr "Perioda zaračunavanja"
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr "Začetek zaračunavanja"
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr "Postavke"
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr "Datum naslednjega računa"
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr "Partner"
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr "Plačilni pogoj"
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr "Sklic"
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr "Začetek"
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr "Datum"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr "Družba"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Porabljeno"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Zamki porabe"
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Perioda porabe"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Opis"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr "Konec"
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr "Naslednja poraba"
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr "Naslednja poraba z zamikom"
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr "Storitev"
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr "Kategorija ME storitve"
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr "Začetek"
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Naročnina"
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Konec naročnine"
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Začetek naročnine"
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Stanje naročnine"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr "Enota"
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr "Cena enote"
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr "Postavka računa"
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr "Postavka"
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr "Enota"
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr "Po mesecih"
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr "Po dnevih v mesecu"
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr "Po položaju znotraj periode"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr "Po dnevih v tednu"
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr "Po tednih"
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr "Po dnevih v letu"
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr "Izključno"
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr "Pogostost"
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr "Razmik"
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr "Niz"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr "Začetek tedna"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr "Pravila"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Pravilo za periodičnost naročnine"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Začetek"
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr "Zamik porabe"
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr "Ponovitev porabe"
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr "Poveži naročnino z družbo."
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr "Glavni identifikator naročnine."
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr "Naročnik"
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr "Identifikacija zunanjega vira."
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr "Stanje naroćnine"
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr "Dodajanje postavke naročnini."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr "Z vejico loćen seznam celih števil, ki predstavljajo mesece."
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr "Z vejico loćen seznam celih števil, ki predstavljajo dneve v mesecu."
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+"Z vejico loćen seznam celih števil, ki predstavljajo položaj znotraj "
+"obdobja."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+"Z vejico loćen seznam celih števil ali kratic, ki predstavljajo dneve v "
+"tednu (1,2, ... ali MO, TU, itd)."
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+"Z vejico loćen seznam celih števil, ki predstavljajo tedne v letu "
+"(ISO-8601)."
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr "Z vejico loćen seznam celih števil, ki predstavljajo dneve v letu."
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr "Dodajanje pravila nizu pravil."
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr "Glavni identifikator niza pravil."
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Pravilo za periodičnost naročnine"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Naročnina"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Pravilo za periodičnost naročnine"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Naročnina"
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Izdelava računa naročnine"
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Postavka naročnine"
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Poraba naročniške postavke"
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Izdelava porabe naročniške postavke"
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Pravilo za periodičnost naročnine"
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Niz pravil za periodičnost naročnine"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Niz pravil za periodičnost naročnine"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Naročniška storitev"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr "Zaprto"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Ponudba"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Tekoče"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr "Dnevno"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr "Mesečno"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr "Tedensko"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr "Letno"
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Zaračunavanje naročnine na dan"
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Poraba naročnine na dan"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr "Splošno"
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr "Drugo"
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Naročnina"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr "Izdelava"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Prekliči"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr "Izdelava"
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Prekliči"
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr "Zaprto"
diff --git a/modules/sale_subscription/locale/tr.po b/modules/sale_subscription/locale/tr.po
new file mode 100644
index 0000000000..cebbf7fdb9
--- /dev/null
+++ b/modules/sale_subscription/locale/tr.po
@@ -0,0 +1,662 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumptions"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/uk.po b/modules/sale_subscription/locale/uk.po
new file mode 100644
index 0000000000..16f27de95e
--- /dev/null
+++ b/modules/sale_subscription/locale/uk.po
@@ -0,0 +1,625 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr ""
+
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr ""
+
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr ""
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr ""
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr ""
+
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr ""
+
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr ""
+
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr ""
+
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr ""
+
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr ""
+
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr ""
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr ""
+
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr ""
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/locale/zh_CN.po b/modules/sale_subscription/locale/zh_CN.po
new file mode 100644
index 0000000000..cebbf7fdb9
--- /dev/null
+++ b/modules/sale_subscription/locale/zh_CN.po
@@ -0,0 +1,662 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,subscription_services:"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sequence,subscription_sequence:"
+msgid "Subscription Sequence"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:sale.subscription,contact:"
+msgid "Contact"
+msgstr ""
+
+msgctxt "field:sale.subscription,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_address:"
+msgid "Invoice Address"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_party:"
+msgid "Invoice Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_recurrence:"
+msgid "Invoice Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription,invoice_start_date:"
+msgid "Invoice Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:sale.subscription,next_invoice_date:"
+msgid "Next Invoice Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:sale.subscription,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:sale.subscription,payment_term:"
+msgid "Payment Term"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription,quoted_by:"
+msgid "Quoted By"
+msgstr "Quote"
+
+msgctxt "field:sale.subscription,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:sale.subscription,run_by:"
+msgid "Run By"
+msgstr ""
+
+msgctxt "field:sale.subscription,start_date:"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:sale.subscription,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:sale.subscription.create_invoice.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,consumed_until:"
+msgid "Consumed until"
+msgstr "Consumptions"
+
+msgctxt "field:sale.subscription.line,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,currency:"
+msgid "Currency"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,description:"
+msgid "Description"
+msgstr "Subscription"
+
+msgctxt "field:sale.subscription.line,end_date:"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date:"
+msgid "Next Consumption Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,next_consumption_date_delayed:"
+msgid "Next Consumption Delayed"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service:"
+msgid "Service"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,service_unit_category:"
+msgid "Service Unit Category"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,start_date:"
+msgid "Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_end_date:"
+msgid "Subscription End Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_start_date:"
+msgid "Subscription Start Date"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "field:sale.subscription.line,subscription_state:"
+msgid "Subscription State"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.line,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,invoice_line:"
+msgid "Invoice Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:sale.subscription.line.consumption.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekday:"
+msgid "By Week Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,exclusive:"
+msgid "Exclusive"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,freq:"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,interval:"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,set_:"
+msgid "Set"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule,week_start_day:"
+msgid "Week Start Day"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set,rules:"
+msgid "Rules"
+msgstr ""
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,recurrence:"
+msgid "Subscription Recurrence"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test,result:"
+msgid "Result"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.subscription.recurrence.rule.set.test,start_date:"
+msgid "Start Date"
+msgstr "Subscription Services"
+
+msgctxt "field:sale.subscription.recurrence.rule.set.test.result,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_delay:"
+msgid "Consumption Delay"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,consumption_recurrence:"
+msgid "Consumption Recurrence"
+msgstr ""
+
+msgctxt "field:sale.subscription.service,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:sale.subscription,company:"
+msgid "Make the subscription belong to the company."
+msgstr ""
+
+msgctxt "help:sale.subscription,number:"
+msgid "The main identification of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription,party:"
+msgid "The party who subscribes."
+msgstr ""
+
+msgctxt "help:sale.subscription,reference:"
+msgid "The identification of an external origin."
+msgstr ""
+
+msgctxt "help:sale.subscription,state:"
+msgid "The current state of the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.line,subscription:"
+msgid "Add the line below the subscription."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonth:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bymonthday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,bysetpos:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekday:"
+msgid "A comma separated list of integers or weekday (MO, TU etc)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byweekno:"
+msgid "A comma separated list of integers (ISO8601)."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,byyearday:"
+msgid "A comma separated list of integers."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule,set_:"
+msgid "Add the rule below the set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set,name:"
+msgid "The main identifier of the rule set."
+msgstr ""
+
+msgctxt "help:sale.subscription.recurrence.rule.set.test,count:"
+msgid "Used to determine how many occurences to compute."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.action,name:act_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.action,name:act_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.action,name:act_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.action,name:act_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+msgctxt "model:ir.action,name:act_subscription_invoice_relate"
+msgid "Invoices"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_subscription_line_consumption_form"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_line_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt ""
+"model:ir.action,name:act_subscription_line_consumption_subscription_relate"
+msgid "Consumptions"
+msgstr "Consumptions"
+
+msgctxt "model:ir.action,name:act_subscription_party_relate"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_quotation"
+msgid "Quotation"
+msgstr "Quotation"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_subscription_form_domain_running"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "model:ir.message,text:msg_consumption_delete_invoiced"
+msgid "You cannot delete invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_consumption_invoice_missing_account_revenue"
+msgid ""
+"To invoice consumptions you must define an account revenue for product "
+"\"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_modify_invoiced"
+msgid "You cannot modify invoiced consumption \"%(consumption)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_consumption_recurrence_invalid"
+msgid ""
+"The consumption recurrence of line \"%(line)s\" of subscription "
+"\"%(subscription)s\" does not generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_pending_subscription"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending subscriptions "
+"with company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invoice_recurrence_invalid"
+msgid ""
+"The invoice recurrence of subscription \"%(subscription)s\" does not "
+"generate any occurrence."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_recurrence_rule_invalid_by"
+msgid ""
+"Invalid \"%(field)s\" \"%(value)s\" in recurence rule "
+"\"%(recurrence_rule)s\" with exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:subscription_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:subscription_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:subscription_quote_button"
+msgid "Quote"
+msgstr "Quote"
+
+msgctxt "model:ir.model.button,string:subscription_run_button"
+msgid "Run"
+msgstr "Run"
+
+msgctxt "model:ir.rule.group,name:rule_group_subscription_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_subscription"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "model:ir.ui.menu,name:menu_create_invoice"
+msgid "Create Subscription Invoices"
+msgstr "Create Subscription Invoices"
+
+msgctxt "model:ir.ui.menu,name:menu_line_consumption_create"
+msgid "Create Line Consumptions"
+msgstr "Create Line Consumptions"
+
+msgctxt "model:ir.ui.menu,name:menu_recurrence_rule_set_form"
+msgid "Subscription Recurrence Rule Sets"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_recurrence_test"
+msgid "Test Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+msgctxt "model:ir.ui.menu,name:menu_service_form"
+msgid "Subscription Services"
+msgstr "Subscription Services"
+
+msgctxt "model:ir.ui.menu,name:menu_subscription_form"
+msgid "Subscriptions"
+msgstr "Subscriptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription,name:"
+msgid "Subscription"
+msgstr "Subscription"
+
+#, fuzzy
+msgctxt "model:sale.subscription.create_invoice.start,name:"
+msgid "Create Subscription Invoice"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line,name:"
+msgid "Subscription Line"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption,name:"
+msgid "Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.line.consumption.create.start,name:"
+msgid "Create Subscription Line Consumption"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule,name:"
+msgid "Subscription Recurrence Rule"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set,name:"
+msgid "Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test,name:"
+msgid "Test Subscription Recurrence Rule Set"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.recurrence.rule.set.test.result,name:"
+msgid "Test Subscription Recurrence Rule Set Result"
+msgstr "Subscription Recurrence Rule Sets"
+
+#, fuzzy
+msgctxt "model:sale.subscription.service,name:"
+msgid "Subscription Service"
+msgstr "Subscription Services"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Invoices"
+msgstr "Generate Subscription Invoices"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Generate Subscription Line Consumptions"
+msgstr "Generate Subscription Line Consumptions"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+msgctxt "selection:sale.subscription,state:"
+msgid "Closed"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Quotation"
+msgstr "Quotation"
+
+#, fuzzy
+msgctxt "selection:sale.subscription,state:"
+msgid "Running"
+msgstr "Running"
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:sale.subscription.recurrence.rule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription.create_invoice.start:"
+msgid "Create Subscription Invoices for date"
+msgstr "Create Subscription Invoices"
+
+#, fuzzy
+msgctxt "view:sale.subscription.line.consumption.create.start:"
+msgid "Create Subscription Line Consumptions for date"
+msgstr "Generate Subscription Line Consumptions"
+
+msgctxt "view:sale.subscription.line:"
+msgid "General"
+msgstr ""
+
+msgctxt "view:sale.subscription:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:sale.subscription:"
+msgid "Subscription"
+msgstr "Subscription"
+
+msgctxt "wizard_button:sale.subscription.create_invoice,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.create_invoice,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt ""
+"wizard_button:sale.subscription.line.consumption.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:sale.subscription.line.consumption.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:sale.subscription.recurrence.rule.set.test,test,end:"
+msgid "Close"
+msgstr ""
diff --git a/modules/sale_subscription/message.xml b/modules/sale_subscription/message.xml
new file mode 100644
index 0000000000..d9fed01f71
--- /dev/null
+++ b/modules/sale_subscription/message.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+ The invoice recurrence of subscription "%(subscription)s" does not generate any occurrence.
+
+
+ The consumption recurrence of line "%(line)s" of subscription "%(subscription)s" does not generate any occurrence.
+
+
+ You cannot modify invoiced consumption "%(consumption)s".
+
+
+ You cannot delete invoiced consumption "%(consumption)s".
+
+
+ To invoice consumptions you must define an account revenue for product "%(product)s".
+
+
+ You cannot erase party "%(party)s" while they have pending subscriptions with company "%(company)s".
+
+
+ Invalid "%(field)s" "%(value)s" in recurence rule "%(recurrence_rule)s" with exception "%(exception)s".
+
+
+
diff --git a/modules/sale_subscription/party.py b/modules/sale_subscription/party.py
new file mode 100644
index 0000000000..2420f8df95
--- /dev/null
+++ b/modules/sale_subscription/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.modules.party.exceptions import EraseError
+from trytond.pool import Pool, PoolMeta
+
+
+class Replace(metaclass=PoolMeta):
+ __name__ = 'party.replace'
+
+ @classmethod
+ def fields_to_replace(cls):
+ return super().fields_to_replace() + [
+ ('sale.subscription', 'party'),
+ ]
+
+
+class Erase(metaclass=PoolMeta):
+ __name__ = 'party.erase'
+
+ def check_erase_company(self, party, company):
+ pool = Pool()
+ Subscription = pool.get('sale.subscription')
+ super().check_erase_company(party, company)
+
+ subscriptions = Subscription.search([
+ ('party', '=', party.id),
+ ('company', '=', company.id),
+ ('state', 'not in', ['closed', 'cancelled']),
+ ])
+ if subscriptions:
+ raise EraseError(
+ gettext('sale_subscription'
+ '.msg_erase_party_pending_subscription',
+ party=party.rec_name,
+ company=company.rec_name))
diff --git a/modules/sale_subscription/party.xml b/modules/sale_subscription/party.xml
new file mode 100644
index 0000000000..e5c6732c93
--- /dev/null
+++ b/modules/sale_subscription/party.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ party.party
+
+ party_form
+
+
+
diff --git a/modules/sale_subscription/product.py b/modules/sale_subscription/product.py
new file mode 100644
index 0000000000..769357c14e
--- /dev/null
+++ b/modules/sale_subscription/product.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.model import fields
+from trytond.pool import PoolMeta
+from trytond.pyson import Eval, If
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
+
+ subscription_services = fields.One2Many(
+ 'sale.subscription.service', 'product', "Subscription Services",
+ domain=[
+ If(~Eval('active'), ('active', '=', False), ()),
+ ],
+ states={
+ 'invisible': Eval('type') != 'service',
+ })
diff --git a/modules/sale_subscription/product.xml b/modules/sale_subscription/product.xml
new file mode 100644
index 0000000000..db4a307dda
--- /dev/null
+++ b/modules/sale_subscription/product.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ product.product
+
+ product_form
+
+
+
diff --git a/modules/sale_subscription/recurrence.py b/modules/sale_subscription/recurrence.py
new file mode 100644
index 0000000000..562c552286
--- /dev/null
+++ b/modules/sale_subscription/recurrence.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.
+import datetime as dt
+
+from dateutil.rrule import (
+ DAILY, FR, MO, MONTHLY, SA, SU, TH, TU, WE, WEEKLY, YEARLY, rrule,
+ rruleset)
+
+from trytond.i18n import gettext
+from trytond.model import ModelSQL, ModelView, fields
+from trytond.pool import Pool
+from trytond.transaction import Transaction
+from trytond.wizard import Button, StateView, Wizard
+
+from .exceptions import RecurrenceRuleValidationError
+
+WEEKDAYS = {
+ 'MO': MO,
+ 'TU': TU,
+ 'WE': WE,
+ 'TH': TH,
+ 'FR': FR,
+ 'SA': SA,
+ 'SU': SU,
+ }
+FREQUENCIES = {
+ 'yearly': YEARLY,
+ 'monthly': MONTHLY,
+ 'weekly': WEEKLY,
+ 'daily': DAILY,
+ }
+
+
+class RecurrenceRuleSet(ModelSQL, ModelView):
+ "Subscription Recurrence Rule Set"
+ __name__ = 'sale.subscription.recurrence.rule.set'
+
+ name = fields.Char(
+ "Name", required=True, translate=True,
+ help="The main identifier of the rule set.")
+ rules = fields.One2Many(
+ 'sale.subscription.recurrence.rule', 'set_', "Rules")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._order.insert(0, ('name', 'ASC'))
+
+ @classmethod
+ def default_rules(cls):
+ if Transaction().user == 0:
+ return []
+ return [{}]
+
+ def rruleset(self, dtstart):
+ set_ = rruleset(**self._rruleset())
+ for rule in self.rules:
+ if not rule.exclusive:
+ set_.rrule(rule.rrule(dtstart))
+ else:
+ set_.exrule(rule.rrule(dtstart))
+ return set_
+
+ def _rruleset(self):
+ return {}
+
+
+class RecurrenceRule(ModelSQL, ModelView):
+ "Subscription Recurrence Rule"
+ __name__ = 'sale.subscription.recurrence.rule'
+
+ set_ = fields.Many2One(
+ 'sale.subscription.recurrence.rule.set', "Set",
+ required=True, ondelete='CASCADE',
+ help="Add the rule below the set.")
+ freq = fields.Selection([
+ ('yearly', 'Yearly'),
+ ('monthly', 'Monthly'),
+ ('weekly', 'Weekly'),
+ ('daily', 'Daily'),
+ ], "Frequency", sort=False, required=True)
+ interval = fields.Integer("Interval", required=True)
+ byweekday = fields.Char(
+ "By Week Day",
+ help="A comma separated list of integers or weekday (MO, TU etc).")
+ bymonthday = fields.Char(
+ "By Month Day",
+ help="A comma separated list of integers.")
+ byyearday = fields.Char(
+ "By Year Day",
+ help="A comma separated list of integers.")
+ byweekno = fields.Char(
+ "By Week Number",
+ help="A comma separated list of integers (ISO8601).")
+ bymonth = fields.Char(
+ "By Month",
+ help="A comma separated list of integers.")
+ bysetpos = fields.Char(
+ "By Position",
+ help="A comma separated list of integers.")
+ week_start_day = fields.Many2One('ir.calendar.day', "Week Start Day")
+
+ exclusive = fields.Boolean("Exclusive")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.__access__.add('set_')
+
+ @classmethod
+ def __register__(cls, module_name):
+ pool = Pool()
+ Day = pool.get('ir.calendar.day')
+ day = Day.__table__()
+ transaction = Transaction()
+ table = cls.__table__()
+
+ super().__register__(module_name)
+ table_h = cls.__table_handler__(module_name)
+
+ # Migration from 5.0: replace wkst by week_start_day
+ if table_h.column_exist('wkst'):
+ cursor = transaction.connection.cursor()
+ update = transaction.connection.cursor()
+ cursor.execute(*day.select(day.id, day.index))
+ for day_id, index in cursor:
+ update.execute(*table.update(
+ [table.week_start_day], [day_id],
+ where=table.wkst == str(index)))
+ table_h.drop_column('wkst')
+
+ @classmethod
+ def default_interval(cls):
+ return 1
+
+ @classmethod
+ def default_exclusive(cls):
+ return False
+
+ def rrule(self, dtstart):
+ return rrule(**self._rrule(dtstart))
+
+ def _rrule(self, dtstart):
+ return {
+ 'dtstart': dtstart,
+ 'freq': FREQUENCIES[self.freq],
+ 'interval': self.interval,
+ 'byweekday': self._byweekday,
+ 'bymonthday': self._bymonthday,
+ 'byyearday': self._byyearday,
+ 'byweekno': self._byweekno,
+ 'bymonth': self._bymonth,
+ 'bysetpos': self._bysetpos,
+ 'wkst': self.week_start_day.index if self.week_start_day else None,
+ }
+
+ @property
+ def _byweekday(self):
+ if not self.byweekday:
+ return None
+ byweekday = []
+ for weekday in self.byweekday.split(','):
+ try:
+ weekday = int(weekday)
+ except ValueError:
+ pass
+ else:
+ if 0 <= weekday <= len(WEEKDAYS):
+ byweekday.append(weekday)
+ continue
+ else:
+ raise ValueError('Invalid weekday')
+ try:
+ cls = WEEKDAYS[weekday[:2]]
+ except KeyError:
+ raise ValueError('Invalid weekday')
+ if not weekday[2:]:
+ byweekday.append(cls)
+ else:
+ byweekday.append(cls(int(weekday[3:-1])))
+ return byweekday
+
+ @property
+ def _bymonthday(self):
+ if not self.bymonthday:
+ return None
+ return [int(md) for md in self.bymonthday.split(',')]
+
+ @property
+ def _byyearday(self):
+ if not self.byyearday:
+ return None
+ return [int(yd) for yd in self.byyearday.split(',')]
+
+ @property
+ def _byweekno(self):
+ if not self.byweekno:
+ return None
+ return [int(wn) for wn in self.byweekno.split(',')]
+
+ @property
+ def _bymonth(self):
+ if not self.bymonth:
+ return None
+ return [int(m) for m in self.bymonth.split(',')]
+
+ @property
+ def _bysetpos(self):
+ if not self.bysetpos:
+ return None
+ positions = []
+ for setpos in self.bysetpos.split(','):
+ setpos = int(setpos)
+ if -366 <= setpos <= 366:
+ positions.append(setpos)
+ else:
+ raise ValueError('Invalid setpos')
+ return positions
+
+ def pre_validate(self):
+ for name in ['byweekday', 'bymonthday', 'byyearday', 'byweekno',
+ 'bymonth', 'bysetpos']:
+ self.check_by(name)
+
+ def check_by(self, name):
+ try:
+ getattr(self, '_%s' % name)
+ except ValueError as exception:
+ raise RecurrenceRuleValidationError(
+ gettext('sale_subscription.msg_recurrence_rule_invalid_by',
+ value=getattr(self, name),
+ recurrence_rule=self.rec_name,
+ exception=exception,
+ **self.__names__(name))) from exception
+
+
+class TestRecurrenceRuleSet(Wizard):
+ "Test Subscription Recurrence Rule Set"
+ __name__ = 'sale.subscription.recurrence.rule.set.test'
+ start_state = 'test'
+ test = StateView(
+ 'sale.subscription.recurrence.rule.set.test',
+ 'sale_subscription.recurrence_rule_set_test_view_form',
+ [Button("Close", 'end', 'tryton-close', default=True)])
+
+ def default_test(self, fields):
+ default = {}
+ if (self.model and self.model.__name__
+ == 'sale.subscription.recurrence.rule.set'):
+ if self.record:
+ default['recurrence'] = self.record.id
+ return default
+
+
+class TestRecurrenceRuleSetView(ModelView):
+ "Test Subscription Recurrence Rule Set"
+ __name__ = 'sale.subscription.recurrence.rule.set.test'
+ recurrence = fields.Many2One(
+ 'sale.subscription.recurrence.rule.set',
+ "Subscription Recurrence", required=True)
+ start_date = fields.Date("Start Date", required=True)
+ count = fields.Integer("Count", required=True,
+ help="Used to determine how many occurences to compute.")
+ result = fields.One2Many(
+ 'sale.subscription.recurrence.rule.set.test.result',
+ None, "Result", readonly=True)
+
+ @classmethod
+ def default_start_date(cls):
+ return Pool().get('ir.date').today()
+
+ @fields.depends('recurrence', 'start_date', 'count', 'result')
+ def on_change_with_result(self):
+ pool = Pool()
+ Result = pool.get('sale.subscription.recurrence.rule.set.test.result')
+ result = []
+ if self.recurrence and self.start_date and self.count:
+ rruleset = self.recurrence.rruleset(self.start_date)
+ datetime = dt.datetime.combine(self.start_date, dt.time())
+ for date in rruleset.xafter(datetime, self.count, inc=True):
+ result.append(Result(date=date.date()))
+ self.result = result
+ return self._changed_values.get('result', [])
+
+
+class TestRecurrenceRuleSetViewResult(ModelView):
+ "Test Subscription Recurrence Rule Set Result"
+ __name__ = 'sale.subscription.recurrence.rule.set.test.result'
+ date = fields.Date("Date", readonly=True)
diff --git a/modules/sale_subscription/recurrence.xml b/modules/sale_subscription/recurrence.xml
new file mode 100644
index 0000000000..dcff5cb3c7
--- /dev/null
+++ b/modules/sale_subscription/recurrence.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+ sale.subscription.recurrence.rule.set
+ form
+ recurrence_rule_set_form
+
+
+
+ sale.subscription.recurrence.rule.set
+ tree
+ recurrence_rule_set_list
+
+
+
+ Subscription Recurrence Rule Sets
+ sale.subscription.recurrence.rule.set
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sale.subscription.recurrence.rule
+ form
+ recurrence_rule_form
+
+
+
+ sale.subscription.recurrence.rule
+ tree
+ recurrence_rule_list
+
+
+
+ Test Recurrence Rule
+ sale.subscription.recurrence.rule.set.test
+
+
+ form_action
+ sale.subscription.recurrence.rule.set,-1
+
+
+
+
+
+ sale.subscription.recurrence.rule.set.test
+ form
+ recurrence_rule_set_test_form
+
+
+ sale.subscription.recurrence.rule.set.test.result
+ tree
+ recurrence_rule_set_test_result_list
+
+
+
diff --git a/modules/sale_subscription/service.py b/modules/sale_subscription/service.py
new file mode 100644
index 0000000000..59962088b7
--- /dev/null
+++ b/modules/sale_subscription/service.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.
+from trytond.model import DeactivableMixin, ModelSQL, ModelView, fields
+from trytond.pyson import Eval
+
+
+class Service(DeactivableMixin, ModelSQL, ModelView):
+ "Subscription Service"
+ __name__ = 'sale.subscription.service'
+
+ product = fields.Many2One(
+ 'product.product', "Product", required=True, ondelete='CASCADE',
+ domain=[
+ ('type', '=', 'service'),
+ ])
+ consumption_recurrence = fields.Many2One(
+ 'sale.subscription.recurrence.rule.set', "Consumption Recurrence")
+ consumption_delay = fields.TimeDelta("Consumption Delay",
+ states={
+ 'invisible': ~Eval('consumption_recurrence'),
+ })
+
+ 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:])]
diff --git a/modules/sale_subscription/service.xml b/modules/sale_subscription/service.xml
new file mode 100644
index 0000000000..7cd53370c6
--- /dev/null
+++ b/modules/sale_subscription/service.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+ sale.subscription.service
+ form
+ service_form
+
+
+
+ sale.subscription.service
+ tree
+ service_list
+
+
+
+ Subscription Services
+ sale.subscription.service
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_subscription/setup.py b/modules/sale_subscription/setup.py
new file mode 100755
index 0000000000..8ab3591b78
--- /dev/null
+++ b/modules/sale_subscription/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 find_packages, setup
+
+
+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_sale_subscription'
+
+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-dateutil']
+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 subscription',
+ 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/sale_subscription',
+ },
+ keywords='tryton sale subscription',
+ package_dir={'trytond.modules.sale_subscription': '.'},
+ packages=(
+ ['trytond.modules.sale_subscription']
+ + ['trytond.modules.sale_subscription.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.sale_subscription': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ 'Topic :: Office/Business :: Financial :: Accounting',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ sale_subscription = trytond.modules.sale_subscription
+ """,
+ )
diff --git a/modules/sale_subscription/subscription.py b/modules/sale_subscription/subscription.py
new file mode 100644
index 0000000000..ac37970b87
--- /dev/null
+++ b/modules/sale_subscription/subscription.py
@@ -0,0 +1,1021 @@
+# 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 itertools import groupby
+
+from sql import Literal, Null, operators
+from sql.conditionals import Case, Coalesce
+from sql.functions import CharLength
+
+from trytond import backend
+from trytond.i18n import gettext
+from trytond.model import (
+ Index, ModelSQL, ModelView, Workflow, fields, sequence_ordered)
+from trytond.model.exceptions import AccessError
+from trytond.modules.company.model import (
+ employee_field, reset_employee, set_employee)
+from trytond.modules.currency.fields import Monetary
+from trytond.modules.product import price_digits, round_price
+from trytond.pool import Pool
+from trytond.pyson import Bool, Eval, If
+from trytond.tools import sortable_values
+from trytond.transaction import Transaction
+from trytond.wizard import (
+ Button, StateAction, StateTransition, StateView, Wizard)
+
+from .exceptions import InvalidRecurrence, InvoiceError
+
+
+class Subscription(Workflow, ModelSQL, ModelView):
+ "Subscription"
+ __name__ = 'sale.subscription'
+ _rec_name = 'number'
+
+ company = fields.Many2One(
+ 'company.company', "Company", required=True,
+ states={
+ 'readonly': (Eval('state') != 'draft') | Eval('party', True),
+ },
+ help="Make the subscription belong to the company.")
+
+ number = fields.Char(
+ "Number", readonly=True,
+ help="The main identification of the subscription.")
+ reference = fields.Char(
+ "Reference",
+ help="The identification of an external origin.")
+ description = fields.Char("Description",
+ states={
+ 'readonly': Eval('state') != 'draft',
+ })
+
+ party = fields.Many2One(
+ 'party.party', "Party", required=True,
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | (Eval('lines', [0]) & Eval('party'))),
+ },
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'},
+ help="The party who subscribes.")
+ contact = fields.Many2One(
+ 'party.contact_mechanism', "Contact",
+ context={
+ 'company': Eval('company', -1),
+ },
+ search_context={
+ 'related_party': Eval('party'),
+ },
+ depends={'company', 'party'})
+ invoice_party = fields.Many2One('party.party', "Invoice Party",
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | Eval('lines', [0])),
+ },
+ context={
+ 'company': Eval('company', -1),
+ },
+ search_context={
+ 'related_party': Eval('party'),
+ },
+ depends={'company', 'party'})
+ invoice_address = fields.Many2One(
+ 'party.address', "Invoice Address",
+ domain=[
+ ('party', '=', If(Bool(Eval('invoice_party',)),
+ Eval('invoice_party'), Eval('party'))),
+ ],
+ states={
+ 'readonly': Eval('state') != 'draft',
+ 'required': ~Eval('state').in_(['draft']),
+ })
+ payment_term = fields.Many2One(
+ 'account.invoice.payment_term', "Payment Term",
+ states={
+ 'readonly': Eval('state') != 'draft',
+ })
+
+ currency = fields.Many2One(
+ 'currency.currency', "Currency", required=True,
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | (Eval('lines', [0]) & Eval('currency', 0))),
+ })
+
+ start_date = fields.Date(
+ "Start Date", required=True,
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | Eval('next_invoice_date')),
+ })
+ end_date = fields.Date(
+ "End Date",
+ domain=['OR',
+ ('end_date', '>=', If(
+ Bool(Eval('start_date')),
+ Eval('start_date', datetime.date.min),
+ datetime.date.min)),
+ ('end_date', '=', None),
+ ],
+ states={
+ 'readonly': Eval('state') != 'draft',
+ })
+
+ invoice_recurrence = fields.Many2One(
+ 'sale.subscription.recurrence.rule.set', "Invoice Recurrence",
+ required=True,
+ states={
+ 'readonly': Eval('state') != 'draft',
+ })
+ invoice_start_date = fields.Date("Invoice Start Date",
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | Eval('next_invoice_date')),
+ })
+ next_invoice_date = fields.Date(
+ "Next Invoice Date", readonly=True,
+ states={
+ 'invisible': Eval('state') != 'running',
+ })
+
+ lines = fields.One2Many(
+ 'sale.subscription.line', 'subscription', "Lines",
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | ~Eval('start_date')),
+ })
+
+ quoted_by = employee_field(
+ "Quoted By", states=['quotation', 'running', 'closed', 'cancelled'])
+ run_by = employee_field(
+ "Run By", states=['running', 'closed', 'cancelled'])
+ state = fields.Selection([
+ ('draft', "Draft"),
+ ('quotation', "Quotation"),
+ ('running', "Running"),
+ ('closed', "Closed"),
+ ('cancelled', "Cancelled"),
+ ], "State", readonly=True, required=True, sort=False,
+ help="The current state of the subscription.")
+
+ @classmethod
+ def __setup__(cls):
+ cls.number.search_unaccented = False
+ cls.reference.search_unaccented = False
+ super(Subscription, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.update({
+ Index(t, (t.reference, Index.Similarity())),
+ Index(
+ t,
+ (t.state, Index.Equality()),
+ where=t.state.in_(['draft', 'quotation', 'running'])),
+ })
+ cls._order = [
+ ('start_date', 'DESC'),
+ ('id', 'DESC'),
+ ]
+ cls._transitions |= set((
+ ('draft', 'cancelled'),
+ ('draft', 'quotation'),
+ ('quotation', 'cancelled'),
+ ('quotation', 'draft'),
+ ('quotation', 'running'),
+ ('running', 'draft'),
+ ('running', 'closed'),
+ ('cancelled', 'draft'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': ~Eval('state').in_(['draft', 'quotation']),
+ 'icon': 'tryton-cancel',
+ 'depends': ['state'],
+ },
+ 'draft': {
+ 'invisible': Eval('state').in_(['draft', 'closed']),
+ 'icon': If(Eval('state') == 'cancelled',
+ 'tryton-undo', 'tryton-back'),
+ 'depends': ['state'],
+ },
+ 'quote': {
+ 'invisible': Eval('state') != 'draft',
+ 'readonly': ~Eval('lines', []),
+ 'icon': 'tryton-forward',
+ 'depends': ['state'],
+ },
+ 'run': {
+ 'invisible': Eval('state') != 'quotation',
+ 'icon': 'tryton-forward',
+ 'depends': ['state'],
+ },
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
+ cursor = Transaction().connection.cursor()
+ table = cls.__table__()
+
+ super().__register__(module_name)
+
+ # Migration from 5.6: rename state canceled to cancelled
+ cursor.execute(*table.update(
+ [table.state], ['cancelled'],
+ where=table.state == 'canceled'))
+
+ @classmethod
+ def order_number(cls, tables):
+ table, _ = tables[None]
+ return [CharLength(table.number), table.number]
+
+ @classmethod
+ def default_company(cls):
+ return Transaction().context.get('company')
+
+ @classmethod
+ def default_currency(cls, **pattern):
+ pool = Pool()
+ Company = pool.get('company.company')
+ company = pattern.get('company')
+ if not company:
+ company = cls.default_company()
+ if company:
+ return Company(company).currency.id
+
+ @classmethod
+ def default_state(cls):
+ return 'draft'
+
+ @fields.depends('company', 'party', 'invoice_party', 'currency', 'lines')
+ def on_change_party(self):
+ if not self.invoice_party:
+ self.invoice_address = None
+ if not self.lines:
+ self.currency = self.default_currency(
+ company=self.company.id if self.company else None)
+ if self.party:
+ if not self.invoice_party:
+ self.invoice_address = self.party.address_get(type='invoice')
+ self.payment_term = self.party.customer_payment_term
+ if not self.lines and self.party.customer_currency:
+ self.currency = self.party.customer_currency
+
+ @fields.depends('party', 'invoice_party')
+ def on_change_invoice_party(self):
+ if self.invoice_party:
+ self.invoice_address = self.invoice_party.address_get(
+ type='invoice')
+ elif self.party:
+ self.invoice_address = self.party.address_get(type='invoice')
+
+ @classmethod
+ def set_number(cls, subscriptions):
+ pool = Pool()
+ Config = pool.get('sale.configuration')
+
+ config = Config(1)
+ for subscription in subscriptions:
+ if subscription.number:
+ continue
+ subscription.number = config.get_multivalue(
+ 'subscription_sequence',
+ company=subscription.company.id).get()
+ cls.save(subscriptions)
+
+ def compute_next_invoice_date(self):
+ start_date = self.invoice_start_date or self.start_date
+ date = self.next_invoice_date or start_date
+ rruleset = self.invoice_recurrence.rruleset(start_date)
+ dt = datetime.datetime.combine(date, datetime.time())
+ inc = (start_date == date) and not self.next_invoice_date
+ next_date = rruleset.after(dt, inc=inc)
+ if next_date:
+ return next_date.date()
+
+ @classmethod
+ def validate_fields(cls, subscriptions, field_names):
+ super().validate_fields(subscriptions, field_names)
+ cls.validate_invoice_recurrence(subscriptions, field_names)
+
+ @classmethod
+ def validate_invoice_recurrence(cls, subscriptions, field_names=None):
+ if field_names and not (field_names & {
+ 'start_date', 'invoice_start_date', 'invoice_recurrence'}):
+ return
+ for subscription in subscriptions:
+ start_date = (
+ subscription.invoice_start_date or subscription.start_date)
+ try:
+ subscription.invoice_recurrence.rruleset(start_date)[0]
+ except IndexError:
+ raise InvalidRecurrence(gettext(
+ 'sale_subscription.msg_invoice_recurrence_invalid',
+ subscription=subscription.rec_name))
+
+ @classmethod
+ def copy(cls, subscriptions, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('number', None)
+ default.setdefault('next_invoice_date', None)
+ default.setdefault('quoted_by')
+ default.setdefault('run_by')
+ return super(Subscription, cls).copy(subscriptions, default=default)
+
+ @classmethod
+ def view_attributes(cls):
+ return super().view_attributes() + [
+ ('/tree', 'visual',
+ If(Eval('state') == 'cancelled', 'muted', '')),
+ ]
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, subscriptions):
+ pass
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ @reset_employee('quoted_by', 'run_by')
+ def draft(cls, subscriptions):
+ pass
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('quotation')
+ @set_employee('quoted_by')
+ def quote(cls, subscriptions):
+ cls.set_number(subscriptions)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('running')
+ @set_employee('run_by')
+ def run(cls, subscriptions):
+ pool = Pool()
+ Line = pool.get('sale.subscription.line')
+ lines = []
+ for subscription in subscriptions:
+ if not subscription.next_invoice_date:
+ subscription.next_invoice_date = (
+ subscription.compute_next_invoice_date())
+ for line in subscription.lines:
+ if (line.next_consumption_date is None
+ and not line.consumed_until):
+ line.next_consumption_date = (
+ line.compute_next_consumption_date())
+ lines.extend(subscription.lines)
+ Line.save(lines)
+ cls.save(subscriptions)
+
+ @classmethod
+ def process(cls, subscriptions):
+ to_close = []
+ for subscription in subscriptions:
+ if all(l.next_consumption_date is None
+ for l in subscription.lines):
+ to_close.append(subscription)
+ cls.close(to_close)
+
+ @classmethod
+ @Workflow.transition('closed')
+ def close(cls, subscriptions):
+ for subscription in subscriptions:
+ if not subscription.end_date and subscription.lines:
+ subscription.end_date = max(
+ l.end_date for l in subscription.lines)
+ cls.save(subscriptions)
+
+ @classmethod
+ def generate_invoice(cls, date=None):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ Consumption = pool.get('sale.subscription.line.consumption')
+ Invoice = pool.get('account.invoice')
+ InvoiceLine = pool.get('account.invoice.line')
+
+ if date is None:
+ date = Date.today()
+
+ consumptions = Consumption.search([
+ ('invoice_line', '=', None),
+ ('line.subscription.next_invoice_date', '<=', date),
+ ('line.subscription.state', 'in', ['running', 'closed']),
+ ('line.subscription.company', '=',
+ Transaction().context.get('company')),
+ ],
+ order=[
+ ('line.subscription.id', 'DESC'),
+ ])
+
+ def keyfunc(consumption):
+ return consumption.line.subscription
+ invoices = {}
+ lines = {}
+ for subscription, consumptions in groupby(consumptions, key=keyfunc):
+ invoices[subscription] = invoice = subscription._get_invoice()
+ lines[subscription] = Consumption.get_invoice_lines(
+ consumptions, invoice)
+
+ all_invoices = list(invoices.values())
+ Invoice.save(all_invoices)
+
+ all_invoice_lines = []
+ for subscription, invoice in invoices.items():
+ invoice_lines, _ = lines[subscription]
+ all_invoice_lines.extend(invoice_lines)
+ InvoiceLine.save(all_invoice_lines)
+
+ all_consumptions = []
+ for values in lines.values():
+ for invoice_line, consumptions in zip(*values):
+ for consumption in consumptions:
+ assert not consumption.invoice_line
+ consumption.invoice_line = invoice_line
+ all_consumptions.append(consumption)
+ Consumption.save(all_consumptions)
+
+ Invoice.update_taxes(all_invoices)
+
+ subscriptions = cls.search([
+ ('next_invoice_date', '<=', date),
+ ])
+ for subscription in subscriptions:
+ if subscription.state == 'running':
+ while subscription.next_invoice_date <= date:
+ subscription.next_invoice_date = (
+ subscription.compute_next_invoice_date())
+ else:
+ subscription.next_invoice_date = None
+ cls.save(subscriptions)
+
+ def _get_invoice(self):
+ pool = Pool()
+ Invoice = pool.get('account.invoice')
+ party = self.invoice_party or self.party
+ invoice = Invoice(
+ company=self.company,
+ type='out',
+ party=party,
+ invoice_address=self.invoice_address,
+ currency=self.currency,
+ account=party.account_receivable_used,
+ )
+ invoice.invoice_date = self.next_invoice_date
+ invoice.on_change_type()
+ invoice.payment_term = self.payment_term
+ return invoice
+
+
+class Line(sequence_ordered(), ModelSQL, ModelView):
+ "Subscription Line"
+ __name__ = 'sale.subscription.line'
+
+ subscription = fields.Many2One(
+ 'sale.subscription', "Subscription", required=True, ondelete='CASCADE',
+ states={
+ 'readonly': ((Eval('subscription_state') != 'draft')
+ & Bool(Eval('subscription'))),
+ },
+ help="Add the line below the subscription.")
+ subscription_state = fields.Function(
+ fields.Selection('get_subscription_states', "Subscription State"),
+ 'on_change_with_subscription_state')
+ subscription_start_date = fields.Function(
+ fields.Date("Subscription Start Date"),
+ 'on_change_with_subscription_start_date')
+ subscription_end_date = fields.Function(
+ fields.Date("Subscription End Date"),
+ 'on_change_with_subscription_end_date')
+ company = fields.Function(
+ fields.Many2One('company.company', "Company"),
+ 'on_change_with_company')
+
+ service = fields.Many2One(
+ 'sale.subscription.service', "Service", required=True,
+ states={
+ 'readonly': Eval('subscription_state') != 'draft',
+ },
+ context={
+ 'company': Eval('company', None),
+ },
+ depends={'company'})
+ description = fields.Text("Description",
+ states={
+ 'readonly': Eval('subscription_state') != 'draft',
+ })
+
+ quantity = fields.Float(
+ "Quantity", digits='unit',
+ states={
+ 'readonly': Eval('subscription_state') != 'draft',
+ 'required': Bool(Eval('consumption_recurrence')),
+ })
+ unit = fields.Many2One(
+ 'product.uom', "Unit", required=True,
+ states={
+ 'readonly': Eval('subscription_state') != 'draft',
+ },
+ domain=[
+ If(Bool(Eval('service_unit_category')),
+ ('category', '=', Eval('service_unit_category')),
+ ('category', '!=', -1)),
+ ])
+ service_unit_category = fields.Function(
+ fields.Many2One('product.uom.category', "Service Unit Category"),
+ 'on_change_with_service_unit_category')
+
+ unit_price = Monetary(
+ "Unit Price", currency='currency', digits=price_digits,
+ states={
+ 'readonly': Eval('subscription_state') != 'draft',
+ })
+ currency = fields.Function(fields.Many2One('currency.currency',
+ 'Currency'), 'on_change_with_currency')
+ consumption_recurrence = fields.Many2One(
+ 'sale.subscription.recurrence.rule.set', "Consumption Recurrence",
+ states={
+ 'readonly': Eval('subscription_state') != 'draft',
+ })
+ consumption_delay = fields.TimeDelta(
+ "Consumption Delay",
+ states={
+ 'readonly': Eval('subscription_state') != 'draft',
+ 'invisible': ~Eval('consumption_recurrence'),
+ })
+ next_consumption_date = fields.Date("Next Consumption Date", readonly=True)
+ next_consumption_date_delayed = fields.Function(
+ fields.Date("Next Consumption Delayed"),
+ 'get_next_consumption_date_delayed')
+ consumed_until = fields.Date("Consumed until", readonly=True)
+ start_date = fields.Date(
+ "Start Date", required=True,
+ domain=[
+ ('start_date', '>=', Eval('subscription_start_date')),
+ ],
+ states={
+ 'readonly': ((Eval('subscription_state') != 'draft')
+ | Eval('consumed_until')),
+ })
+ end_date = fields.Date(
+ "End Date",
+ domain=['OR', [
+ ('end_date', '>=', Eval('start_date')),
+ If(Bool(Eval('subscription_end_date')),
+ ('end_date', '<=', Eval('subscription_end_date')),
+ ()),
+ If(Bool(Eval('consumed_until')),
+ ('end_date', '>=', Eval('consumed_until')),
+ ()),
+ ],
+ ('end_date', '=', None),
+ ],
+ states={
+ 'readonly': ((Eval('subscription_state') != 'draft')
+ | (~Eval('consumed_until') & Eval('consumed_until'))),
+ })
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.__access__.add('subscription')
+
+ @classmethod
+ def __register__(cls, module):
+ pool = Pool()
+ Subscription = pool.get('sale.subscription')
+ transaction = Transaction()
+ cursor = transaction.connection.cursor()
+ table = cls.__table__()
+ subscription = Subscription.__table__()
+
+ # Migration from 4.8: start_date required
+ if backend.TableHandler.table_exist(cls._table):
+ table_h = cls.__table_handler__(module)
+ if table_h.column_exist('start_date'):
+ cursor.execute(*table.update(
+ [table.start_date],
+ subscription.select(
+ subscription.start_date,
+ where=subscription.id == table.subscription),
+ where=table.start_date == Null))
+
+ super(Line, cls).__register__(module)
+ table_h = cls.__table_handler__(module)
+
+ # Migration from 4.8: drop required on description
+ table_h.not_null_action('description', action='remove')
+
+ # Migration from 5.2: replace consumed by consumed_until
+ if table_h.column_exist('consumed'):
+ cursor.execute(*table.update(
+ [table.consumed_until],
+ [Case((table.consumed, Coalesce(
+ table.next_consumption_date,
+ table.end_date)), else_=Null)]))
+ table_h.drop_column('consumed')
+
+ @classmethod
+ def get_subscription_states(cls):
+ pool = Pool()
+ Subscription = pool.get('sale.subscription')
+ return Subscription.fields_get(['state'])['state']['selection']
+
+ @fields.depends('subscription', '_parent_subscription.state')
+ def on_change_with_subscription_state(self, name=None):
+ if self.subscription:
+ return self.subscription.state
+
+ @fields.depends('subscription', '_parent_subscription.start_date')
+ def on_change_with_subscription_start_date(self, name=None):
+ if self.subscription:
+ return self.subscription.start_date
+
+ @fields.depends('subscription', '_parent_subscription.end_date')
+ def on_change_with_subscription_end_date(self, name=None):
+ if self.subscription:
+ return self.subscription.end_date
+
+ @fields.depends('subscription', '_parent_subscription.company')
+ def on_change_with_company(self, name=None):
+ if self.subscription and self.subscription.company:
+ return self.subscription.company.id
+
+ @fields.depends('subscription', 'start_date', 'end_date',
+ '_parent_subscription.start_date', '_parent_subscription.end_date')
+ def on_change_subscription(self):
+ if self.subscription:
+ if not self.start_date:
+ self.start_date = self.subscription.start_date
+ if not self.end_date:
+ self.end_date = self.subscription.end_date
+
+ @classmethod
+ def default_quantity(cls):
+ return 1
+
+ @fields.depends('subscription', '_parent_subscription.currency')
+ def on_change_with_currency(self, name=None):
+ if self.subscription and self.subscription.currency:
+ return self.subscription.currency.id
+
+ @fields.depends('service')
+ def on_change_with_service_unit_category(self, name=None):
+ if self.service:
+ return self.service.product.default_uom_category.id
+
+ @fields.depends('service', 'quantity', 'unit',
+ 'subscription', '_parent_subscription.party',
+ methods=['_get_context_sale_price'])
+ def on_change_service(self):
+ pool = Pool()
+ Product = pool.get('product.product')
+
+ if not self.service:
+ self.consumption_recurrence = None
+ self.consumption_delay = None
+ return
+
+ party = None
+ party_context = {}
+ if self.subscription and self.subscription.party:
+ party = self.subscription.party
+ if party.lang:
+ party_context['language'] = party.lang.code
+
+ product = self.service.product
+ category = product.sale_uom.category
+ if not self.unit or self.unit.category != category:
+ self.unit = product.sale_uom
+
+ with Transaction().set_context(self._get_context_sale_price()):
+ self.unit_price = Product.get_sale_price(
+ [product], self.quantity or 0)[product.id]
+ if self.unit_price is not None:
+ self.unit_price = round_price(self.unit_price)
+
+ self.consumption_recurrence = self.service.consumption_recurrence
+ self.consumption_delay = self.service.consumption_delay
+
+ @fields.depends('subscription', '_parent_subscription.currency',
+ '_parent_subscription.party', 'start_date', 'unit', 'service',
+ 'company')
+ def _get_context_sale_price(self):
+ context = {}
+ if self.subscription:
+ if self.subscription.currency:
+ context['currency'] = self.subscription.currency.id
+ if self.subscription.party:
+ context['customer'] = self.subscription.party.id
+ if self.start_date:
+ context['sale_date'] = self.start_date
+ if self.unit:
+ context['uom'] = self.unit.id
+ elif self.service:
+ context['uom'] = self.service.sale_uom.id
+ if self.company:
+ context['company'] = self.company.id
+ # TODO tax
+ return context
+
+ def get_next_consumption_date_delayed(self, name=None):
+ if self.next_consumption_date and self.consumption_delay:
+ return self.next_consumption_date + self.consumption_delay
+ return self.next_consumption_date
+
+ def get_rec_name(self, name):
+ pool = Pool()
+ Lang = pool.get('ir.lang')
+ lang = Lang.get()
+ return (lang.format_number_symbol(
+ self.quantity or 0, self.unit, digits=self.unit.digits)
+ + ' %s @ %s' % (self.service.rec_name, self.subscription.rec_name))
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return ['OR',
+ ('subscription.rec_name',) + tuple(clause[1:]),
+ ('service.rec_name',) + tuple(clause[1:]),
+ ]
+
+ @classmethod
+ def domain_next_consumption_date_delayed(cls, domain, tables):
+ field = cls.next_consumption_date_delayed._field
+ table, _ = tables[None]
+ name, operator, value = domain
+ Operator = fields.SQL_OPERATORS[operator]
+ column = (
+ table.next_consumption_date + Coalesce(
+ table.consumption_delay, datetime.timedelta()))
+ expression = Operator(column, field._domain_value(operator, value))
+ if isinstance(expression, operators.In) and not expression.right:
+ expression = Literal(False)
+ elif isinstance(expression, operators.NotIn) and not expression.right:
+ expression = Literal(True)
+ expression = field._domain_add_null(
+ column, operator, value, expression)
+ return expression
+
+ @classmethod
+ def generate_consumption(cls, date=None):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ Consumption = pool.get('sale.subscription.line.consumption')
+ Subscription = pool.get('sale.subscription')
+
+ if date is None:
+ date = Date.today()
+
+ remainings = all_lines = cls.search([
+ ('consumption_recurrence', '!=', None),
+ ('next_consumption_date_delayed', '<=', date),
+ ('subscription.state', '=', 'running'),
+ ('subscription.company', '=',
+ Transaction().context.get('company')),
+ ])
+
+ consumptions = []
+ subscription_ids = set()
+ while remainings:
+ lines, remainings = remainings, []
+ for line in lines:
+ consumption = line.get_consumption(line.next_consumption_date)
+ if consumption:
+ consumptions.append(consumption)
+ line.next_consumption_date = (
+ line.compute_next_consumption_date())
+ if line.next_consumption_date:
+ line.consumed_until = (
+ line.next_consumption_date - datetime.timedelta(1))
+ else:
+ line.consumed_until = line.end_date
+ if line.next_consumption_date is None:
+ subscription_ids.add(line.subscription.id)
+ elif line.get_next_consumption_date_delayed() <= date:
+ remainings.append(line)
+
+ Consumption.save(consumptions)
+ cls.save(all_lines)
+ Subscription.process(Subscription.browse(list(subscription_ids)))
+
+ def get_consumption(self, date):
+ pool = Pool()
+ Consumption = pool.get('sale.subscription.line.consumption')
+ end_date = self.end_date or self.subscription.end_date
+ if date < (end_date or datetime.date.max):
+ return Consumption(line=self, quantity=self.quantity, date=date)
+
+ def compute_next_consumption_date(self):
+ if not self.consumption_recurrence:
+ return None
+ date = self.next_consumption_date or self.start_date
+ rruleset = self.consumption_recurrence.rruleset(self.start_date)
+ dt = datetime.datetime.combine(date, datetime.time())
+ inc = (self.start_date == date) and not self.next_consumption_date
+ next_date = rruleset.after(dt, inc=inc)
+ if next_date:
+ next_date = next_date.date()
+ for end_date in [self.end_date, self.subscription.end_date]:
+ if end_date:
+ if next_date > end_date:
+ return None
+ return next_date
+
+ @classmethod
+ def validate_fields(cls, lines, field_names):
+ super().validate_fields(lines, field_names)
+ cls.validate_consumption_recurrence(lines, field_names)
+
+ @classmethod
+ def validate_consumption_recurrence(cls, lines, field_names=None):
+ if field_names and not (field_names & {
+ 'consumption_recurrence', 'start_date'}):
+ return
+ for line in lines:
+ if line.consumption_recurrence:
+ try:
+ line.consumption_recurrence.rruleset(line.start_date)[0]
+ except IndexError:
+ raise InvalidRecurrence(gettext(
+ 'sale_subscription'
+ '.msg_consumption_recurrence_invalid',
+ line=line.rec_name,
+ subscription=line.subscription.rec_name))
+
+ @classmethod
+ def copy(cls, lines, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('next_consumption_date', None)
+ default.setdefault('consumed', None)
+ default.setdefault('consumed_until', None)
+ return super(Line, cls).copy(lines, default=default)
+
+
+class LineConsumption(ModelSQL, ModelView):
+ "Subscription Line Consumption"
+ __name__ = 'sale.subscription.line.consumption'
+
+ line = fields.Many2One(
+ 'sale.subscription.line', "Line", required=True, ondelete='RESTRICT')
+ quantity = fields.Float("Quantity", digits='unit', required=True)
+ unit = fields.Function(fields.Many2One(
+ 'product.uom', "Unit"), 'on_change_with_unit')
+ date = fields.Date("Date", required=True)
+ invoice_line = fields.Many2One(
+ 'account.invoice.line', "Invoice Line", readonly=True)
+
+ @classmethod
+ def __setup__(cls):
+ super(LineConsumption, cls).__setup__()
+ cls.__access__.add('line')
+ cls._order.insert(0, ('date', 'DESC'))
+
+ @fields.depends('line')
+ def on_change_with_unit(self, name=None):
+ if self.line and self.line.unit:
+ return self.line.unit.id
+
+ @classmethod
+ def copy(cls, consumptions, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('invoice_line', None)
+ return super(LineConsumption, cls).copy(consumptions, default=default)
+
+ @classmethod
+ def write(cls, *args):
+ for consumptions in args[::2]:
+ for consumption in consumptions:
+ if consumption.invoice_line:
+ raise AccessError(
+ gettext('sale_subscription'
+ '.msg_consumption_modify_invoiced',
+ consumption=consumption.rec_name))
+ super(LineConsumption, cls).write(*args)
+
+ @classmethod
+ def delete(cls, consumptions):
+ for consumption in consumptions:
+ if consumption.invoice_line:
+ raise AccessError(
+ gettext('sale_subscription'
+ '.msg_consumption_modify_invoiced',
+ consumption=consumption.rec_name))
+ super(LineConsumption, cls).delete(consumptions)
+
+ @classmethod
+ def get_invoice_lines(cls, consumptions, invoice):
+ "Return a list of lines and a list of consumptions"
+ pool = Pool()
+ InvoiceLine = pool.get('account.invoice.line')
+
+ lines, grouped_consumptions = [], []
+ consumptions = sorted(
+ consumptions, key=sortable_values(cls._group_invoice_key))
+ for key, sub_consumptions in groupby(
+ consumptions, key=cls._group_invoice_key):
+ sub_consumptions = list(sub_consumptions)
+ line = InvoiceLine(**dict(key))
+ line.invoice = invoice
+ line.on_change_invoice()
+ line.type = 'line'
+ line.quantity = sum(c.quantity for c in sub_consumptions)
+ line.on_change_product()
+
+ if not line.account:
+ raise InvoiceError(
+ gettext('sale_subscription'
+ '.msg_consumption_invoice_missing_account_revenue',
+ product=line.product.rec_name))
+
+ lines.append(line)
+ grouped_consumptions.append(sub_consumptions)
+ return lines, grouped_consumptions
+
+ @classmethod
+ def _group_invoice_key(cls, consumption):
+ return (
+ ('company', consumption.line.subscription.company),
+ ('currency', consumption.line.subscription.currency),
+ ('unit', consumption.line.unit),
+ ('product', consumption.line.service.product),
+ ('unit_price', consumption.line.unit_price),
+ ('description', consumption.line.description),
+ ('origin', consumption.line),
+ )
+
+
+class CreateLineConsumption(Wizard):
+ "Create Subscription Line Consumption"
+ __name__ = 'sale.subscription.line.consumption.create'
+ start = StateView(
+ 'sale.subscription.line.consumption.create.start',
+ 'sale_subscription.line_consumption_create_start_view_form', [
+ Button("Cancel", 'end', 'tryton-cancel'),
+ Button("Create", 'create_', 'tryton-ok', default=True),
+ ])
+ create_ = StateAction(
+ 'sale_subscription.act_subscription_line_consumption_form')
+
+ def do_create_(self, action):
+ pool = Pool()
+ Line = pool.get('sale.subscription.line')
+ Line.generate_consumption(date=self.start.date)
+ return action, {}
+
+ def transition_create_(self):
+ return 'end'
+
+
+class CreateLineConsumptionStart(ModelView):
+ "Create Subscription Line Consumption"
+ __name__ = 'sale.subscription.line.consumption.create.start'
+
+ date = fields.Date("Date")
+
+ @classmethod
+ def default_date(cls):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ return Date.today()
+
+
+class CreateSubscriptionInvoice(Wizard):
+ "Create Subscription Invoice"
+ __name__ = 'sale.subscription.create_invoice'
+ start = StateView(
+ 'sale.subscription.create_invoice.start',
+ 'sale_subscription.create_invoice_start_view_form', [
+ Button("Cancel", 'end', 'tryton-cancel'),
+ Button("Create", 'create_', 'tryton-ok', default=True),
+ ])
+ create_ = StateTransition()
+
+ def transition_create_(self):
+ pool = Pool()
+ Subscription = pool.get('sale.subscription')
+ Subscription.generate_invoice(date=self.start.date)
+ return 'end'
+
+
+class CreateSubscriptionInvoiceStart(ModelView):
+ "Create Subscription Invoice"
+ __name__ = 'sale.subscription.create_invoice.start'
+
+ date = fields.Date("Date")
+
+ @classmethod
+ def default_date(cls):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ return Date.today()
diff --git a/modules/sale_subscription/subscription.xml b/modules/sale_subscription/subscription.xml
new file mode 100644
index 0000000000..1a2b223245
--- /dev/null
+++ b/modules/sale_subscription/subscription.xml
@@ -0,0 +1,323 @@
+
+
+
+
+
+ tryton-sale-subscription
+ icons/tryton-sale-subscription.svg
+
+
+
+ sale.subscription
+ form
+ subscription_form
+
+
+
+ sale.subscription
+ tree
+ subscription_list
+
+
+
+ Subscriptions
+ sale.subscription
+
+
+
+
+
+
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+
+ Quotation
+
+
+
+
+
+
+ Running
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+
+ Subscriptions
+ sale.subscription
+
+
+
+
+ form_relate
+ party.party,-1
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ draft
+ Draft
+
+
+
+
+
+
+
+
+ run
+ Run
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+
+
+
+
+ quote
+ Quote
+
+
+
+
+ sale.subscription.line
+ form
+ subscription_line_form
+
+
+
+ sale.subscription.line
+ tree
+
+ subscription_line_list
+
+
+
+ sale.subscription.line
+ tree
+
+ subscription_line_list_sequence
+
+
+
+ sale.subscription.line.consumption
+ form
+ subscription_line_consumption_form
+
+
+
+ sale.subscription.line.consumption
+ tree
+ subscription_line_consumption_list
+
+
+
+ Consumptions
+ sale.subscription.line.consumption
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Consumptions
+ sale.subscription.line.consumption
+
+
+
+ form_relate
+ sale.subscription,-1
+
+
+
+
+ Invoices
+ account.invoice
+
+
+
+ form_relate
+ sale.subscription,-1
+
+
+
+
+ Consumptions
+ sale.subscription.line.consumption
+
+
+
+ form_relate
+ sale.subscription.line,-1
+
+
+
+
+ Create Line Consumptions
+ sale.subscription.line.consumption.create
+
+
+
+
+
+
+
+
+
+ sale.subscription.line.consumption.create.start
+ form
+ line_consumption_create_start_form
+
+
+
+ sale.subscription.line|generate_consumption
+
+ days
+
+
+
+ Create Subscription Invoices
+ sale.subscription.create_invoice
+
+
+
+
+
+
+
+
+
+ sale.subscription.create_invoice.start
+ form
+ create_invoice_start_form
+
+
+
+ sale.subscription|generate_invoice
+
+ days
+
+
+
+
diff --git a/modules/sale_subscription/tests/__init__.py b/modules/sale_subscription/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/sale_subscription/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/sale_subscription/tests/scenario_sale_subscription.rst b/modules/sale_subscription/tests/scenario_sale_subscription.rst
new file mode 100644
index 0000000000..9f0d7ad221
--- /dev/null
+++ b/modules/sale_subscription/tests/scenario_sale_subscription.rst
@@ -0,0 +1,199 @@
+==========================
+Sale Subscription Scenario
+==========================
+
+Imports::
+
+ >>> import datetime
+ >>> from decimal import Decimal
+ >>> from dateutil.relativedelta import relativedelta
+ >>> 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('sale_subscription')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create sale user::
+
+ >>> User = Model.get('res.user')
+ >>> Group = Model.get('res.group')
+
+ >>> sale_user = User()
+ >>> sale_user.name = 'Sale'
+ >>> sale_user.login = 'sale'
+ >>> sale_group, = Group.find([('name', '=', 'Sales')])
+ >>> sale_user.groups.append(sale_group)
+ >>> sale_user.save()
+
+Create product user::
+
+ >>> product_user = User()
+ >>> product_user.name = 'Product'
+ >>> product_user.login = 'product'
+ >>> product_group, = Group.find([('name', '=', 'Product Administration')])
+ >>> product_user.groups.append(product_group)
+ >>> product_user.save()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+ >>> revenue = accounts['revenue']
+
+Create party::
+
+ >>> Party = Model.get('party.party')
+
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create subscription recurrence rule sets::
+
+ >>> RecurrenceRuleSet = Model.get('sale.subscription.recurrence.rule.set')
+
+ >>> monthly = RecurrenceRuleSet(name='Monthly')
+ >>> rule, = monthly.rules
+ >>> rule.freq = 'monthly'
+ >>> rule.interval = 1
+ >>> monthly.save()
+
+ >>> daily = RecurrenceRuleSet(name='Daily')
+ >>> rule, = daily.rules
+ >>> rule.freq = 'daily'
+ >>> rule.interval = 1
+ >>> daily.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 subscription service::
+
+ >>> Service = Model.get('sale.subscription.service')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Uom = Model.get('product.uom')
+
+ >>> unit, = Uom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Rental'
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+ >>> service = Service()
+ >>> service.product = product
+ >>> service.consumption_recurrence = daily
+ >>> service.save()
+
+Subscribe::
+
+ >>> Subscription = Model.get('sale.subscription')
+
+ >>> subscription = Subscription()
+ >>> subscription.party = customer
+ >>> subscription.start_date = datetime.date(2016, 1, 1)
+ >>> subscription.invoice_start_date = datetime.date(2016, 2, 1)
+ >>> subscription.invoice_recurrence = monthly
+ >>> line = subscription.lines.new()
+ >>> line.service = service
+ >>> line.quantity = 10
+ >>> line.start_date == subscription.start_date
+ True
+
+ >>> subscription.click('quote')
+ >>> subscription.state
+ 'quotation'
+ >>> subscription.click('run')
+ >>> subscription.state
+ 'running'
+
+Create line consumption::
+
+ >>> LineConsumption = Model.get('sale.subscription.line.consumption')
+
+ >>> line_consumption_create = Wizard(
+ ... 'sale.subscription.line.consumption.create')
+ >>> line_consumption_create.form.date = datetime.date(2016, 1, 31)
+ >>> line_consumption_create.execute('create_')
+
+ >>> len(LineConsumption.find([]))
+ 31
+
+ >>> subscription.reload()
+ >>> line, = subscription.lines
+ >>> line.next_consumption_date
+ datetime.date(2016, 2, 1)
+
+Create subscription invoice::
+
+ >>> Invoice = Model.get('account.invoice')
+
+ >>> create_invoice = Wizard('sale.subscription.create_invoice')
+ >>> create_invoice.form.date = datetime.date(2016, 2, 1)
+ >>> create_invoice.execute('create_')
+
+ >>> invoice, = Invoice.find([])
+ >>> invoice.invoice_date
+ datetime.date(2016, 2, 1)
+ >>> line, = invoice.lines
+ >>> line.quantity
+ 310.0
+ >>> line.unit_price
+ Decimal('10.0000')
+
+ >>> subscription.reload()
+ >>> subscription.next_invoice_date
+ datetime.date(2016, 3, 1)
+
+Close subscription::
+
+ >>> subscription.click('draft')
+ >>> subscription.state
+ 'draft'
+ >>> line, = subscription.lines
+ >>> line.end_date = datetime.date(2016, 1, 31)
+ >>> subscription.click('quote')
+ >>> subscription.click('run')
+ >>> subscription.state
+ 'running'
+
+ >>> line_consumption_create = Wizard(
+ ... 'sale.subscription.line.consumption.create')
+ >>> line_consumption_create.form.date = datetime.date(2016, 2, 1)
+ >>> line_consumption_create.execute('create_')
+
+ >>> len(LineConsumption.find([]))
+ 31
+
+ >>> subscription.reload()
+ >>> line, = subscription.lines
+ >>> line.next_consumption_date
+ >>> subscription.state
+ 'closed'
+
+Create final subscription invoice::
+
+ >>> create_invoice = Wizard('sale.subscription.create_invoice')
+ >>> create_invoice.form.date = datetime.date(2016, 3, 1)
+ >>> create_invoice.execute('create_')
+
+ >>> len(Invoice.find([]))
+ 1
diff --git a/modules/sale_subscription/tests/scenario_sale_subscription_advanced_invoice.rst b/modules/sale_subscription/tests/scenario_sale_subscription_advanced_invoice.rst
new file mode 100644
index 0000000000..8f0eeec684
--- /dev/null
+++ b/modules/sale_subscription/tests/scenario_sale_subscription_advanced_invoice.rst
@@ -0,0 +1,178 @@
+================================================
+Sale Subscription with Advanced Invoice Scenario
+================================================
+
+Imports::
+
+ >>> import datetime
+ >>> from decimal import Decimal
+ >>> from dateutil.relativedelta import relativedelta
+ >>> 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('sale_subscription')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+ >>> revenue = accounts['revenue']
+
+Create party::
+
+ >>> Party = Model.get('party.party')
+
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create subscription recurrence rule sets::
+
+ >>> RecurrenceRuleSet = Model.get('sale.subscription.recurrence.rule.set')
+
+ >>> monthly_in_advance = RecurrenceRuleSet(name='Monthly in advance')
+ >>> rule, = monthly_in_advance.rules
+ >>> rule.freq = 'monthly'
+ >>> rule.interval = 1
+ >>> rule.bymonthday = '-1'
+ >>> monthly_in_advance.save()
+
+ >>> monthly = RecurrenceRuleSet(name='Monthly')
+ >>> rule, = monthly.rules
+ >>> rule.freq = 'monthly'
+ >>> rule.interval = 1
+ >>> rule.bymonthday = '1'
+ >>> monthly.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 subscription service::
+
+ >>> Service = Model.get('sale.subscription.service')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Uom = Model.get('product.uom')
+
+ >>> unit, = Uom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Rental'
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+ >>> service = Service()
+ >>> service.product = product
+ >>> service.consumption_recurrence = monthly
+ >>> service.consumption_delay = datetime.timedelta(days=-1)
+ >>> service.save()
+
+Subscribe with start date greater than invoice start date::
+
+ >>> Subscription = Model.get('sale.subscription')
+
+ >>> subscription = Subscription()
+ >>> subscription.party = customer
+ >>> subscription.start_date = datetime.date(2016, 2, 1)
+ >>> subscription.invoice_start_date = datetime.date(2016, 1, 31)
+ >>> subscription.invoice_recurrence = monthly_in_advance
+ >>> line = subscription.lines.new()
+ >>> line.service = service
+ >>> line.quantity = 10
+
+ >>> subscription.click('quote')
+ >>> subscription.click('run')
+ >>> subscription.reload()
+ >>> subscription.next_invoice_date
+ datetime.date(2016, 1, 31)
+ >>> line, = subscription.lines
+ >>> line.next_consumption_date_delayed
+ datetime.date(2016, 1, 31)
+
+Create line consumption::
+
+ >>> LineConsumption = Model.get('sale.subscription.line.consumption')
+
+ >>> line_consumption_create = Wizard(
+ ... 'sale.subscription.line.consumption.create')
+ >>> line_consumption_create.form.date = datetime.date(2016, 1, 31)
+ >>> line_consumption_create.execute('create_')
+
+ >>> len(LineConsumption.find([]))
+ 1
+
+ >>> subscription.reload()
+ >>> subscription.next_invoice_date
+ datetime.date(2016, 1, 31)
+ >>> line, = subscription.lines
+ >>> line.next_consumption_date
+ datetime.date(2016, 3, 1)
+ >>> line.next_consumption_date_delayed
+ datetime.date(2016, 2, 29)
+
+Create subscription invoice::
+
+ >>> Invoice = Model.get('account.invoice')
+
+ >>> create_invoice = Wizard('sale.subscription.create_invoice')
+ >>> create_invoice.form.date = datetime.date(2016, 1, 31)
+ >>> create_invoice.execute('create_')
+
+ >>> invoice, = Invoice.find([])
+ >>> line, = invoice.lines
+ >>> line.quantity
+ 10.0
+
+ >>> subscription.reload()
+ >>> subscription.next_invoice_date
+ datetime.date(2016, 2, 29)
+
+Consume and invoice again::
+
+ >>> line_consumption_create = Wizard(
+ ... 'sale.subscription.line.consumption.create')
+ >>> line_consumption_create.form.date = datetime.date(2016, 2, 29)
+ >>> line_consumption_create.execute('create_')
+
+ >>> len(LineConsumption.find([]))
+ 2
+
+ >>> subscription.reload()
+ >>> subscription.next_invoice_date
+ datetime.date(2016, 2, 29)
+ >>> line, = subscription.lines
+ >>> line.next_consumption_date
+ datetime.date(2016, 4, 1)
+ >>> line.next_consumption_date_delayed
+ datetime.date(2016, 3, 31)
+
+ >>> create_invoice = Wizard('sale.subscription.create_invoice')
+ >>> create_invoice.form.date = datetime.date(2016, 2, 29)
+ >>> create_invoice.execute('create_')
+
+ >>> invoice2, = Invoice.find([('id', '!=', invoice.id)])
+ >>> line, = invoice2.lines
+ >>> line.quantity
+ 10.0
+
+ >>> subscription.reload()
+ >>> subscription.next_invoice_date
+ datetime.date(2016, 3, 31)
\ No newline at end of file
diff --git a/modules/sale_subscription/tests/scenario_sale_subscription_new_line.rst b/modules/sale_subscription/tests/scenario_sale_subscription_new_line.rst
new file mode 100644
index 0000000000..e18d5030fd
--- /dev/null
+++ b/modules/sale_subscription/tests/scenario_sale_subscription_new_line.rst
@@ -0,0 +1,164 @@
+===================================
+Sale Subscription New Line Scenario
+===================================
+
+Imports::
+
+ >>> import datetime
+ >>> from decimal import Decimal
+ >>> from dateutil.relativedelta import relativedelta
+ >>> 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('sale_subscription')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+ >>> revenue = accounts['revenue']
+
+Create party::
+
+ >>> Party = Model.get('party.party')
+
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create subscription recurrence rule sets::
+
+ >>> RecurrenceRuleSet = Model.get('sale.subscription.recurrence.rule.set')
+
+ >>> monthly = RecurrenceRuleSet(name='Monthly')
+ >>> rule, = monthly.rules
+ >>> rule.freq = 'monthly'
+ >>> rule.interval = 1
+ >>> monthly.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 subscription service::
+
+ >>> Service = Model.get('sale.subscription.service')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Uom = Model.get('product.uom')
+
+ >>> unit, = Uom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Rental'
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+ >>> service = Service()
+ >>> service.product = product
+ >>> service.consumption_recurrence = monthly
+ >>> service.save()
+
+Subscribe::
+
+ >>> Subscription = Model.get('sale.subscription')
+
+ >>> subscription = Subscription()
+ >>> subscription.party = customer
+ >>> subscription.start_date = datetime.date(2019, 1, 1)
+ >>> subscription.invoice_recurrence = monthly
+ >>> line = subscription.lines.new()
+ >>> line.service = service
+ >>> line.quantity = 1
+ >>> subscription.click('quote')
+ >>> subscription.state
+ 'quotation'
+ >>> subscription.click('run')
+ >>> subscription.state
+ 'running'
+
+Create consumption for next two months::
+
+ >>> LineConsumption = Model.get('sale.subscription.line.consumption')
+
+ >>> line_consumption_create = Wizard(
+ ... 'sale.subscription.line.consumption.create')
+ >>> line_consumption_create.form.date = datetime.date(2019, 2, 1)
+ >>> line_consumption_create.execute('create_')
+
+ >>> len(LineConsumption.find([]))
+ 2
+
+Create invoice for next two months::
+
+ >>> Invoice = Model.get('account.invoice')
+
+ >>> create_invoice = Wizard('sale.subscription.create_invoice')
+ >>> create_invoice.form.date = datetime.date(2019, 2, 1)
+ >>> create_invoice.execute('create_')
+
+ >>> invoice, = Invoice.find([])
+ >>> line, = invoice.lines
+ >>> line.quantity
+ 2.0
+ >>> line.unit_price
+ Decimal('10.0000')
+
+Close subscription::
+
+ >>> subscription.click('draft')
+ >>> subscription.state
+ 'draft'
+ >>> line, = subscription.lines
+ >>> line.consumed_until
+ datetime.date(2019, 2, 28)
+ >>> line.end_date = datetime.date(2019, 2, 28)
+ >>> new_line = subscription.lines.new()
+ >>> new_line.service = service
+ >>> new_line.quantity = 1
+ >>> new_line.start_date = datetime.date(2019, 3, 1)
+ >>> new_line.unit_price = Decimal('15.00')
+ >>> subscription.click('quote')
+ >>> subscription.click('run')
+ >>> subscription.state
+ 'running'
+
+ >>> line_consumption_create = Wizard(
+ ... 'sale.subscription.line.consumption.create')
+ >>> line_consumption_create.form.date = datetime.date(2019, 3, 1)
+ >>> line_consumption_create.execute('create_')
+
+ >>> len(LineConsumption.find([]))
+ 3
+
+Create next invoice::
+
+ >>> Invoice = Model.get('account.invoice')
+
+ >>> create_invoice = Wizard('sale.subscription.create_invoice')
+ >>> create_invoice.form.date = datetime.date(2019, 3, 1)
+ >>> create_invoice.execute('create_')
+
+ >>> new_invoice, = Invoice.find([('id', '!=', invoice.id)])
+ >>> line, = new_invoice.lines
+ >>> line.quantity
+ 1.0
+ >>> line.unit_price
+ Decimal('15.00')
diff --git a/modules/sale_subscription/tests/test_module.py b/modules/sale_subscription/tests/test_module.py
new file mode 100644
index 0000000000..5d6112c0e8
--- /dev/null
+++ b/modules/sale_subscription/tests/test_module.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.modules.company.tests import (
+ CompanyTestMixin, PartyCompanyCheckEraseMixin)
+from trytond.tests.test_tryton import ModuleTestCase
+
+
+class SaleSubscriptionTestCase(
+ PartyCompanyCheckEraseMixin, CompanyTestMixin, ModuleTestCase):
+ 'Test Sale Subscription module'
+ module = 'sale_subscription'
+
+
+del ModuleTestCase
diff --git a/modules/sale_subscription/tests/test_scenario.py b/modules/sale_subscription/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/sale_subscription/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/sale_subscription/tox.ini b/modules/sale_subscription/tox.ini
new file mode 100644
index 0000000000..4ec33716cb
--- /dev/null
+++ b/modules/sale_subscription/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/sale_subscription/* -m unittest discover -s tests
+ coverage report --include=./**/sale_subscription/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/sale_subscription/tryton.cfg b/modules/sale_subscription/tryton.cfg
new file mode 100644
index 0000000000..6e7c68a2c9
--- /dev/null
+++ b/modules/sale_subscription/tryton.cfg
@@ -0,0 +1,19 @@
+[tryton]
+version=6.7.0
+depends:
+ account
+ account_invoice
+ company
+ currency
+ ir
+ product
+ res
+ sale
+xml:
+ configuration.xml
+ recurrence.xml
+ service.xml
+ subscription.xml
+ party.xml
+ product.xml
+ message.xml
diff --git a/modules/sale_subscription/view/configuration_form.xml b/modules/sale_subscription/view/configuration_form.xml
new file mode 100644
index 0000000000..1976dedbff
--- /dev/null
+++ b/modules/sale_subscription/view/configuration_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/sale_subscription/view/create_invoice_start_form.xml b/modules/sale_subscription/view/create_invoice_start_form.xml
new file mode 100644
index 0000000000..5c2ed431a5
--- /dev/null
+++ b/modules/sale_subscription/view/create_invoice_start_form.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/modules/sale_subscription/view/line_consumption_create_start_form.xml b/modules/sale_subscription/view/line_consumption_create_start_form.xml
new file mode 100644
index 0000000000..e169bb7156
--- /dev/null
+++ b/modules/sale_subscription/view/line_consumption_create_start_form.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/modules/sale_subscription/view/party_form.xml b/modules/sale_subscription/view/party_form.xml
new file mode 100644
index 0000000000..258552aa91
--- /dev/null
+++ b/modules/sale_subscription/view/party_form.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/sale_subscription/view/product_form.xml b/modules/sale_subscription/view/product_form.xml
new file mode 100644
index 0000000000..a180031a53
--- /dev/null
+++ b/modules/sale_subscription/view/product_form.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_subscription/view/recurrence_rule_form.xml b/modules/sale_subscription/view/recurrence_rule_form.xml
new file mode 100644
index 0000000000..e634b6ca70
--- /dev/null
+++ b/modules/sale_subscription/view/recurrence_rule_form.xml
@@ -0,0 +1,29 @@
+
+
+
diff --git a/modules/sale_subscription/view/recurrence_rule_list.xml b/modules/sale_subscription/view/recurrence_rule_list.xml
new file mode 100644
index 0000000000..c457fd658b
--- /dev/null
+++ b/modules/sale_subscription/view/recurrence_rule_list.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_subscription/view/recurrence_rule_set_form.xml b/modules/sale_subscription/view/recurrence_rule_set_form.xml
new file mode 100644
index 0000000000..5cc5926d18
--- /dev/null
+++ b/modules/sale_subscription/view/recurrence_rule_set_form.xml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/modules/sale_subscription/view/recurrence_rule_set_list.xml b/modules/sale_subscription/view/recurrence_rule_set_list.xml
new file mode 100644
index 0000000000..b4d89538b1
--- /dev/null
+++ b/modules/sale_subscription/view/recurrence_rule_set_list.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/modules/sale_subscription/view/recurrence_rule_set_test_form.xml b/modules/sale_subscription/view/recurrence_rule_set_test_form.xml
new file mode 100644
index 0000000000..3a536c3868
--- /dev/null
+++ b/modules/sale_subscription/view/recurrence_rule_set_test_form.xml
@@ -0,0 +1,13 @@
+
+
+
\ No newline at end of file
diff --git a/modules/sale_subscription/view/recurrence_rule_set_test_result_list.xml b/modules/sale_subscription/view/recurrence_rule_set_test_result_list.xml
new file mode 100644
index 0000000000..f2a99fd552
--- /dev/null
+++ b/modules/sale_subscription/view/recurrence_rule_set_test_result_list.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/sale_subscription/view/service_form.xml b/modules/sale_subscription/view/service_form.xml
new file mode 100644
index 0000000000..991031d5bf
--- /dev/null
+++ b/modules/sale_subscription/view/service_form.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/modules/sale_subscription/view/service_list.xml b/modules/sale_subscription/view/service_list.xml
new file mode 100644
index 0000000000..722f4189d6
--- /dev/null
+++ b/modules/sale_subscription/view/service_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/sale_subscription/view/subscription_form.xml b/modules/sale_subscription/view/subscription_form.xml
new file mode 100644
index 0000000000..5c3185f68d
--- /dev/null
+++ b/modules/sale_subscription/view/subscription_form.xml
@@ -0,0 +1,62 @@
+
+
+
diff --git a/modules/sale_subscription/view/subscription_line_consumption_form.xml b/modules/sale_subscription/view/subscription_line_consumption_form.xml
new file mode 100644
index 0000000000..648ffb17c6
--- /dev/null
+++ b/modules/sale_subscription/view/subscription_line_consumption_form.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/modules/sale_subscription/view/subscription_line_consumption_list.xml b/modules/sale_subscription/view/subscription_line_consumption_list.xml
new file mode 100644
index 0000000000..9115206b51
--- /dev/null
+++ b/modules/sale_subscription/view/subscription_line_consumption_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/sale_subscription/view/subscription_line_form.xml b/modules/sale_subscription/view/subscription_line_form.xml
new file mode 100644
index 0000000000..5ebbed532a
--- /dev/null
+++ b/modules/sale_subscription/view/subscription_line_form.xml
@@ -0,0 +1,39 @@
+
+
+
diff --git a/modules/sale_subscription/view/subscription_line_list.xml b/modules/sale_subscription/view/subscription_line_list.xml
new file mode 100644
index 0000000000..2cb046ab03
--- /dev/null
+++ b/modules/sale_subscription/view/subscription_line_list.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_subscription/view/subscription_line_list_sequence.xml b/modules/sale_subscription/view/subscription_line_list_sequence.xml
new file mode 100644
index 0000000000..02fc60c68d
--- /dev/null
+++ b/modules/sale_subscription/view/subscription_line_list_sequence.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_subscription/view/subscription_list.xml b/modules/sale_subscription/view/subscription_list.xml
new file mode 100644
index 0000000000..d3a02b91d7
--- /dev/null
+++ b/modules/sale_subscription/view/subscription_list.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply/.drone.yml b/modules/sale_supply/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/sale_supply/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/sale_supply/.flake8 b/modules/sale_supply/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/sale_supply/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/sale_supply/.isort.cfg b/modules/sale_supply/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/sale_supply/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/sale_supply/CHANGELOG b/modules/sale_supply/CHANGELOG
new file mode 100644
index 0000000000..ccfcea9b43
--- /dev/null
+++ b/modules/sale_supply/CHANGELOG
@@ -0,0 +1,69 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-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)
+* Rename purchase request state into supply state
+
+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)
+* Create requests depending on the shipment method
+
+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
+* Add sale supplied move to shipment in state 'staging'
+
+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/sale_supply/COPYRIGHT b/modules/sale_supply/COPYRIGHT
new file mode 100644
index 0000000000..51a574630e
--- /dev/null
+++ b/modules/sale_supply/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2011-2022 Cédric Krier.
+Copyright (C) 2011-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/sale_supply/LICENSE b/modules/sale_supply/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/sale_supply/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/sale_supply/MANIFEST.in b/modules/sale_supply/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/sale_supply/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/sale_supply/README.rst b/modules/sale_supply/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/sale_supply/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/sale_supply/__init__.py b/modules/sale_supply/__init__.py
new file mode 100644
index 0000000000..c5c21fb081
--- /dev/null
+++ b/modules/sale_supply/__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, purchase, sale, stock
+
+
+def register():
+ Pool.register(
+ sale.Sale,
+ sale.Line,
+ purchase.Request,
+ purchase.Purchase,
+ stock.ShipmentIn,
+ product.Template,
+ product.Product,
+ module='sale_supply', type_='model')
+ Pool.register(
+ purchase.HandlePurchaseCancellationException,
+ module='sale_supply', type_='wizard')
diff --git a/modules/sale_supply/doc/index.rst b/modules/sale_supply/doc/index.rst
new file mode 100644
index 0000000000..1716c98903
--- /dev/null
+++ b/modules/sale_supply/doc/index.rst
@@ -0,0 +1,13 @@
+Sale Supply Module
+##################
+
+The Sale Supply module adds a "supply on sale option" to purchasable products.
+If checked, it will generate a purchase request for each sale line of this
+product regardless of the stock levels. Once the purchased products are
+received they are assigned on the customer shipments.
+If the purchase is cancelled the sale goes back to the default supply method.
+
+.. warning::
+ If the shiment method is *On Invoice Paid*, the purchase request will be
+ created only when all the invoice lines are paid
+..
diff --git a/modules/sale_supply/locale/bg.po b/modules/sale_supply/locale/bg.po
new file mode 100644
index 0000000000..161ba5c273
--- /dev/null
+++ b/modules/sale_supply/locale/bg.po
@@ -0,0 +1,42 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Заявка за покупка"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Заявки за покупки"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Отказване"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/ca.po b/modules/sale_supply/locale/ca.po
new file mode 100644
index 0000000000..774da101cf
--- /dev/null
+++ b/modules/sale_supply/locale/ca.po
@@ -0,0 +1,39 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Subministra a la venda"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Subministra a la venda"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Línies de venda"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Sol·licitud de compra"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "Estat subministrament"
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Sol·licituds de compra"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Sol·licitat"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr "Subministrat"
diff --git a/modules/sale_supply/locale/cs.po b/modules/sale_supply/locale/cs.po
new file mode 100644
index 0000000000..9bd68d6629
--- /dev/null
+++ b/modules/sale_supply/locale/cs.po
@@ -0,0 +1,40 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Purchase Requests"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Purchase Requests"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/de.po b/modules/sale_supply/locale/de.po
new file mode 100644
index 0000000000..73d2176759
--- /dev/null
+++ b/modules/sale_supply/locale/de.po
@@ -0,0 +1,39 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Beschaffung bei Verkauf"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Beschaffung bei Verkauf"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Verkaufspositionen"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Bestellvorschlag"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "Beschaffungsstatus"
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Bestellvorschläge"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Angefragt"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr "Beschafft"
diff --git a/modules/sale_supply/locale/es.po b/modules/sale_supply/locale/es.po
new file mode 100644
index 0000000000..5850b3fc33
--- /dev/null
+++ b/modules/sale_supply/locale/es.po
@@ -0,0 +1,39 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Suministrar en la venta"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Suministra en la venta"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Líneas de venta"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Solicitud de compra"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "Estado suministro"
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Solicitudes de compra"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Solicitado"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr "Subministrado"
diff --git a/modules/sale_supply/locale/es_419.po b/modules/sale_supply/locale/es_419.po
new file mode 100644
index 0000000000..69bcdc82aa
--- /dev/null
+++ b/modules/sale_supply/locale/es_419.po
@@ -0,0 +1,40 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr ""
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Solicitado"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/et.po b/modules/sale_supply/locale/et.po
new file mode 100644
index 0000000000..86a322cfeb
--- /dev/null
+++ b/modules/sale_supply/locale/et.po
@@ -0,0 +1,42 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Müügitarne"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Müügitarne"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Müügirida"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Ostupäring"
+
+#, fuzzy
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "Müügitarne"
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Ostupäringud"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Tühista"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Päritud"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/fa.po b/modules/sale_supply/locale/fa.po
new file mode 100644
index 0000000000..1520a61314
--- /dev/null
+++ b/modules/sale_supply/locale/fa.po
@@ -0,0 +1,42 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "عرضه در فروش"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "عرضه در فروش"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "سطرهای فروش"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "درخواست خرید"
+
+#, fuzzy
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "عرضه در فروش"
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "درخواست های خرید"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "انصراف"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "درخواست شده"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/fi.po b/modules/sale_supply/locale/fi.po
new file mode 100644
index 0000000000..9bd68d6629
--- /dev/null
+++ b/modules/sale_supply/locale/fi.po
@@ -0,0 +1,40 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Purchase Requests"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Purchase Requests"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/fr.po b/modules/sale_supply/locale/fr.po
new file mode 100644
index 0000000000..a078830a7e
--- /dev/null
+++ b/modules/sale_supply/locale/fr.po
@@ -0,0 +1,39 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Approvisionnement sur vente"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Approvisionnement sur vente"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Lignes de vente"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Demande d'achat"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "État d'approvisionnement"
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Demandes d'achat"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Demandé"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr "Approvisionné"
diff --git a/modules/sale_supply/locale/hu.po b/modules/sale_supply/locale/hu.po
new file mode 100644
index 0000000000..8c7f80a451
--- /dev/null
+++ b/modules/sale_supply/locale/hu.po
@@ -0,0 +1,41 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Purchase Requests"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Purchase Requests"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Mégse"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/id.po b/modules/sale_supply/locale/id.po
new file mode 100644
index 0000000000..9ddc29749b
--- /dev/null
+++ b/modules/sale_supply/locale/id.po
@@ -0,0 +1,39 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr ""
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Dibatalkan"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/it.po b/modules/sale_supply/locale/it.po
new file mode 100644
index 0000000000..365841ac2b
--- /dev/null
+++ b/modules/sale_supply/locale/it.po
@@ -0,0 +1,39 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "forniture in vendita"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "forniture in vendita"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Righe di vendita"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Richiesta di acquisto"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "Stato della fornitura"
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Richiesta acquisti"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Richiesto"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr "Fornito"
diff --git a/modules/sale_supply/locale/lo.po b/modules/sale_supply/locale/lo.po
new file mode 100644
index 0000000000..0e2a4a5007
--- /dev/null
+++ b/modules/sale_supply/locale/lo.po
@@ -0,0 +1,43 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "ສະໜອງການຂາຍ"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "ສະໜອງການຂາຍ"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "ລາຍການຂາຍ"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "ຕ້ອງການສັ່ງຊື້"
+
+#, fuzzy
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "ສະໜອງການຂາຍ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Purchase Requests"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກ"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "ສັ່ງແລ້ວ"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/lt.po b/modules/sale_supply/locale/lt.po
new file mode 100644
index 0000000000..9bd68d6629
--- /dev/null
+++ b/modules/sale_supply/locale/lt.po
@@ -0,0 +1,40 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Purchase Requests"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Purchase Requests"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/nl.po b/modules/sale_supply/locale/nl.po
new file mode 100644
index 0000000000..2d30c76038
--- /dev/null
+++ b/modules/sale_supply/locale/nl.po
@@ -0,0 +1,39 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Inkopen bij verkoop"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Inkopen bij verkoop"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Verkoop Regels"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Inkoop aanvraag"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "Lever Status"
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Inkoop Aanvragen"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Aangevraagd"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr "Geleverd"
diff --git a/modules/sale_supply/locale/pl.po b/modules/sale_supply/locale/pl.po
new file mode 100644
index 0000000000..41b691bf2a
--- /dev/null
+++ b/modules/sale_supply/locale/pl.po
@@ -0,0 +1,42 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Wiersze sprzedaży"
+
+#, fuzzy
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Purchase Requests"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Purchase Requests"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Anuluj"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/pt.po b/modules/sale_supply/locale/pt.po
new file mode 100644
index 0000000000..ab69bcde49
--- /dev/null
+++ b/modules/sale_supply/locale/pt.po
@@ -0,0 +1,43 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Abastecimento Na Venda"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Abastecimento Na Venda"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Linhas de Venda"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Pedido de Compra"
+
+#, fuzzy
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "Abastecimento Na Venda"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Purchase Requests"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Cancelar"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Solicitado"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/ro.po b/modules/sale_supply/locale/ro.po
new file mode 100644
index 0000000000..a15443918e
--- /dev/null
+++ b/modules/sale_supply/locale/ro.po
@@ -0,0 +1,39 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr ""
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/ru.po b/modules/sale_supply/locale/ru.po
new file mode 100644
index 0000000000..8dc0491029
--- /dev/null
+++ b/modules/sale_supply/locale/ru.po
@@ -0,0 +1,42 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Запрос на покупку"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Запросы на покупку"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Отменить"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/sl.po b/modules/sale_supply/locale/sl.po
new file mode 100644
index 0000000000..4d68b89acb
--- /dev/null
+++ b/modules/sale_supply/locale/sl.po
@@ -0,0 +1,43 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Dobava ob prodaji"
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Dobava ob prodaji"
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Prodajne postavke"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Nabavni zahtevek"
+
+#, fuzzy
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "Dobava ob prodaji"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Purchase Requests"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Zahtevano"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/tr.po b/modules/sale_supply/locale/tr.po
new file mode 100644
index 0000000000..ba4e0c62a0
--- /dev/null
+++ b/modules/sale_supply/locale/tr.po
@@ -0,0 +1,46 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Satış Tedariği"
+
+#, fuzzy
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr "Satış Tedariği"
+
+#, fuzzy
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr "Satış Kanalları"
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Satınalma Talebi"
+
+#, fuzzy
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr "Satış Tedariği"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "Purchase Requests"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "Vazgeç"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr "Talep Edilen"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/uk.po b/modules/sale_supply/locale/uk.po
new file mode 100644
index 0000000000..a15443918e
--- /dev/null
+++ b/modules/sale_supply/locale/uk.po
@@ -0,0 +1,39 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr ""
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/locale/zh_CN.po b/modules/sale_supply/locale/zh_CN.po
new file mode 100644
index 0000000000..54ab620499
--- /dev/null
+++ b/modules/sale_supply/locale/zh_CN.po
@@ -0,0 +1,41 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:product.template,supply_on_sale:"
+msgid "Supply On Sale"
+msgstr ""
+
+msgctxt "field:purchase.request,sale_lines:"
+msgid "Sale Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.line,purchase_request:"
+msgid "Purchase Request"
+msgstr "Purchase Requests"
+
+msgctxt "field:sale.line,supply_state:"
+msgid "Supply State"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_request_form"
+msgid "Purchase Requests"
+msgstr "采购申请"
+
+#, fuzzy
+msgctxt "selection:sale.line,supply_state:"
+msgid "Cancelled"
+msgstr "取消"
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Requested"
+msgstr ""
+
+msgctxt "selection:sale.line,supply_state:"
+msgid "Supplied"
+msgstr ""
diff --git a/modules/sale_supply/product.py b/modules/sale_supply/product.py
new file mode 100644
index 0000000000..08537ed277
--- /dev/null
+++ b/modules/sale_supply/product.py
@@ -0,0 +1,18 @@
+# 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 Template(metaclass=PoolMeta):
+ __name__ = 'product.template'
+
+ supply_on_sale = fields.Boolean('Supply On Sale',
+ states={
+ 'invisible': ~Eval('purchasable') | ~Eval('salable'),
+ })
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
diff --git a/modules/sale_supply/product.xml b/modules/sale_supply/product.xml
new file mode 100644
index 0000000000..70184cd889
--- /dev/null
+++ b/modules/sale_supply/product.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ product.template
+
+ template_form
+
+
+
diff --git a/modules/sale_supply/purchase.py b/modules/sale_supply/purchase.py
new file mode 100644
index 0000000000..d9bddd3e93
--- /dev/null
+++ b/modules/sale_supply/purchase.py
@@ -0,0 +1,107 @@
+# 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.model import ModelView, Workflow, fields
+from trytond.pool import Pool, PoolMeta
+from trytond.tools import grouped_slice
+from trytond.transaction import Transaction
+
+
+class Request(metaclass=PoolMeta):
+ __name__ = 'purchase.request'
+
+ sale_lines = fields.One2Many(
+ 'sale.line', 'purchase_request', "Sale Lines", readonly=True)
+
+ @classmethod
+ def _get_origin(cls):
+ return super()._get_origin() | {'sale.sale'}
+
+ @classmethod
+ def delete(cls, requests):
+ pool = Pool()
+ Sale = pool.get('sale.sale')
+ SaleLine = pool.get('sale.line')
+ transaction = Transaction()
+ context = transaction.context
+
+ with transaction.set_context(_check_access=False):
+ reqs = cls.browse(requests)
+ sales = set(r.origin for r in reqs if isinstance(r.origin, Sale))
+ sale_lines = [l for r in reqs for l in r.sale_lines]
+ if sale_lines:
+ SaleLine.write(sale_lines, {
+ 'purchase_request': None,
+ })
+
+ super().delete(requests)
+
+ if sales:
+ with transaction.set_context(
+ queue_batch=context.get('queue_batch', True)):
+ Sale.__queue__.process(sales)
+
+
+def process_sale_supply(func):
+ @wraps(func)
+ def wrapper(cls, purchases):
+ pool = Pool()
+ Request = pool.get('purchase.request')
+ Sale = pool.get('sale.sale')
+ transaction = Transaction()
+ context = transaction.context
+
+ sales = set()
+ with transaction.set_context(_check_access=False):
+ for sub_purchases in grouped_slice(purchases):
+ ids = [x.id for x in sub_purchases]
+ requests = Request.search([
+ ('purchase_line.purchase.id', 'in', ids),
+ ('origin', 'like', 'sale.sale,%'),
+ ])
+ sales.update(r.origin.id for r in requests)
+ func(cls, purchases)
+ if sales:
+ with transaction.set_context(
+ queue_batch=context.get('queue_batch', True)):
+ Sale.__queue__.process(sales)
+ return wrapper
+
+
+class Purchase(metaclass=PoolMeta):
+ __name__ = 'purchase.purchase'
+
+ @classmethod
+ @ModelView.button
+ @process_sale_supply
+ def process(cls, purchases):
+ super(Purchase, cls).process(purchases)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ @process_sale_supply
+ def cancel(cls, purchases):
+ super(Purchase, cls).cancel(purchases)
+
+
+class HandlePurchaseCancellationException(metaclass=PoolMeta):
+ __name__ = 'purchase.request.handle.purchase.cancellation'
+
+ def transition_cancel_request(self):
+ pool = Pool()
+ SaleLine = pool.get('sale.line')
+ Move = pool.get('stock.move')
+
+ next_state = super(HandlePurchaseCancellationException,
+ self).transition_cancel_request()
+ moves = []
+ for sub_ids in grouped_slice(list(map(int, self.records))):
+ sale_lines = SaleLine.search([
+ ('purchase_request', 'in', sub_ids),
+ ])
+ moves += [m for line in sale_lines for m in line.moves]
+ if moves:
+ Move.cancel(moves)
+ return next_state
diff --git a/modules/sale_supply/sale.py b/modules/sale_supply/sale.py
new file mode 100644
index 0000000000..4ffe8fb9ad
--- /dev/null
+++ b/modules/sale_supply/sale.py
@@ -0,0 +1,268 @@
+# 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 Model, fields
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Eval
+from trytond.transaction import Transaction
+
+
+class Sale(metaclass=PoolMeta):
+ __name__ = 'sale.sale'
+
+ def is_done(self):
+ done = super(Sale, self).is_done()
+ if done:
+ if any(l.supply_state in {'', 'requested'}
+ for l in self.lines if l.supply_on_sale):
+ return False
+ return done
+
+ @classmethod
+ def _process_shipment(cls, sales):
+ pool = Pool()
+ Line = pool.get('sale.line')
+ Move = pool.get('stock.move')
+ PurchaseRequest = pool.get('purchase.request')
+ ShipmentOut = pool.get('stock.shipment.out')
+
+ requests, lines = [], []
+ moves_to_draft, shipments_to_wait = [], []
+ for sale in sales:
+ # purchase requests must be created before shipments to get
+ # information about requests during the shipments creation
+ # like the supplier
+ reqs, lns = sale.create_purchase_requests()
+ requests.extend(reqs)
+ lines.extend(lns)
+
+ moves, shipments = sale.create_move_from_supply()
+ moves_to_draft.extend(moves)
+ shipments_to_wait.extend(shipments)
+ PurchaseRequest.save(requests)
+ Line.save(lines)
+ Move.draft(moves_to_draft)
+ ShipmentOut.wait(shipments_to_wait)
+ super()._process_shipment(sales)
+
+ def create_purchase_requests(self):
+ requests, lines = [], []
+ for line in self.lines:
+ request = line.get_purchase_request()
+ if not request:
+ continue
+ requests.append(request)
+ assert not line.purchase_request
+ line.purchase_request = request
+ lines.append(line)
+ return requests, lines
+
+ def create_move_from_supply(self):
+ 'Set to draft move linked to supply'
+ pool = Pool()
+ ShipmentOut = pool.get('stock.shipment.out')
+ moves = []
+ for line in self.lines:
+ if line.supply_state in {'supplied', 'cancelled'}:
+ for move in line.moves:
+ if move.state == 'staging':
+ moves.append(move)
+ shipments = {m.shipment for m in moves
+ if isinstance(m.shipment, ShipmentOut)}
+ return moves, shipments
+
+
+class Line(metaclass=PoolMeta):
+ __name__ = 'sale.line'
+
+ purchase_request = fields.Many2One('purchase.request', 'Purchase Request',
+ ondelete='SET NULL', readonly=True)
+ supply_state = fields.Function(fields.Selection([
+ ('', ""),
+ ('requested', "Requested"),
+ ('supplied', "Supplied"),
+ ('cancelled', "Cancelled"),
+ ], "Supply State",
+ states={
+ 'invisible': ~Eval('supply_state'),
+ }), 'get_supply_state')
+
+ @property
+ def has_supply(self):
+ return bool(self.purchase_request)
+
+ def get_supply_state(self, name):
+ if self.purchase_request is not None:
+ purchase_line = self.purchase_request.purchase_line
+ if purchase_line is not None:
+ purchase = purchase_line.purchase
+ if purchase.state == 'cancelled':
+ return 'cancelled'
+ elif purchase.state in ('processing', 'done'):
+ return 'supplied'
+ return 'requested'
+ return ''
+
+ @classmethod
+ def copy(cls, lines, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('purchase_request', None)
+ return super().copy(lines, default=default)
+
+ @property
+ def supply_on_sale(self):
+ "Returns True if the sale line has to be supply by purchase request"
+ if (self.type != 'line'
+ or self.sale.shipment_method == 'manual'
+ or not self.product
+ or self.quantity <= 0
+ or any(m.state not in ['staging', 'cancelled']
+ for m in self.moves)):
+ return False
+ return self.product.supply_on_sale
+
+ def get_move(self, shipment_type):
+ move = super().get_move(shipment_type)
+ if (move
+ and shipment_type == 'out'
+ and (self.supply_on_sale or self.has_supply)):
+ if self.supply_state in {'', 'requested'}:
+ move.state = 'staging'
+ return move
+
+ def _get_purchase_request_product_supplier_pattern(self):
+ return {
+ 'company': self.sale.company.id,
+ }
+
+ def get_purchase_request(self):
+ 'Return purchase request for the sale line'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Request = pool.get('purchase.request')
+
+ if (not self.supply_on_sale
+ or self.purchase_request
+ or not self.product.purchasable):
+ return
+
+ # Ensure to create the request for the maximum paid
+ if self.sale.shipment_method == 'invoice':
+ invoice_skips = (set(self.sale.invoices_ignored)
+ | set(self.sale.invoices_recreated))
+ invoice_lines = [l for l in self.invoice_lines
+ if l.invoice not in invoice_skips]
+ if (not invoice_lines
+ or any((not l.invoice) or l.invoice.state != 'paid'
+ for l in invoice_lines)):
+ return
+
+ product = self.product
+ supplier, purchase_date = Request.find_best_supplier(product,
+ self.shipping_date,
+ **self._get_purchase_request_product_supplier_pattern())
+ uom = product.purchase_uom or product.default_uom
+ quantity = self._get_move_quantity('out')
+ quantity = Uom.compute_qty(self.unit, quantity, uom)
+ return Request(
+ product=product,
+ party=supplier,
+ quantity=quantity,
+ uom=uom,
+ computed_quantity=quantity,
+ computed_uom=uom,
+ purchase_date=purchase_date,
+ supply_date=self.shipping_date,
+ company=self.sale.company,
+ warehouse=self.warehouse,
+ origin=self.sale,
+ )
+
+ def assign_supplied(self, quantities, grouping=('product',)):
+ '''
+ Assign supplied move
+
+ location_quantities will be updated according to assigned
+ quantities.
+ '''
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Move = pool.get('stock.move')
+
+ if self.supply_state != 'supplied':
+ return
+
+ def get_key(move, location_id):
+ key = (location_id,)
+ for field in grouping:
+ value = getattr(move, field)
+ if isinstance(value, Model):
+ value = value.id
+ key += (value,)
+ return key
+
+ def get_values(key, location_name):
+ yield location_name, key[0]
+ for field, value in zip(grouping, key[1:]):
+ if value is not None and '.' not in field:
+ yield field, value
+
+ def match(key, pattern):
+ for k, p in zip(key, pattern):
+ if p is None or k == p:
+ continue
+ else:
+ return False
+ else:
+ return True
+
+ moves = set()
+ for move in self.moves:
+ if move.shipment:
+ for inv_move in move.shipment.inventory_moves:
+ if inv_move.product.id == self.product.id:
+ moves.add(inv_move)
+ to_write = []
+ to_assign = []
+ for move in moves:
+ if move.state != 'draft':
+ continue
+ qties_converted = []
+ for key, quantity in quantities.items():
+ move_key = get_key(move, key[0])
+ if match(key, move_key):
+ qty = Uom.compute_qty(
+ move.product.default_uom, quantity, move.uom,
+ round=False)
+ qties_converted.append((key, qty))
+ to_pick = move.pick_product(qties_converted)
+
+ picked_qties = sum(qty for _, qty in to_pick)
+ if picked_qties < move.quantity:
+ first = False
+ Move.write([move], {
+ 'quantity': move.quantity - picked_qties,
+ })
+ else:
+ first = True
+ for key, qty in to_pick:
+ values = dict(get_values(key, 'from_location'))
+ values['quantity'] = move.uom.round(qty)
+ if first:
+ to_write.extend([[move], values])
+ to_assign.append(move)
+ first = False
+ else:
+ with Transaction().set_context(_stock_move_split=True):
+ to_assign.extend(Move.copy([move], default=values))
+
+ qty_default_uom = Uom.compute_qty(move.uom, qty,
+ move.product.default_uom, round=False)
+
+ quantities[key] -= qty_default_uom
+ if to_write:
+ Move.write(*to_write)
+ if to_assign:
+ Move.assign(to_assign)
diff --git a/modules/sale_supply/sale.xml b/modules/sale_supply/sale.xml
new file mode 100644
index 0000000000..334a6cb609
--- /dev/null
+++ b/modules/sale_supply/sale.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+ sale.line
+
+ sale_line_form
+
+
+
+ Purchase Requests
+ purchase.request
+
+
+
+ form_relate
+ sale.sale,-1
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply/setup.py b/modules/sale_supply/setup.py
new file mode 100755
index 0000000000..b0baeba63f
--- /dev/null
+++ b/modules/sale_supply/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 find_packages, setup
+
+
+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_sale_supply'
+
+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 for sale supply',
+ 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/sale_supply',
+ },
+ keywords='tryton sale supply',
+ package_dir={'trytond.modules.sale_supply': '.'},
+ packages=(
+ ['trytond.modules.sale_supply']
+ + ['trytond.modules.sale_supply.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.sale_supply': (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',
+ '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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ 'Topic :: Office/Business :: Financial :: Accounting',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ sale_supply = trytond.modules.sale_supply
+ """,
+ )
diff --git a/modules/sale_supply/stock.py b/modules/sale_supply/stock.py
new file mode 100644
index 0000000000..4d2494489b
--- /dev/null
+++ b/modules/sale_supply/stock.py
@@ -0,0 +1,54 @@
+# 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.model import Model, ModelView, Workflow
+from trytond.pool import Pool, PoolMeta
+
+
+class ShipmentIn(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in'
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def done(cls, shipments):
+ super(ShipmentIn, cls).done(shipments)
+
+ # Assigned sale move lines
+ for shipment in shipments:
+ shipment.assign_supplied()
+
+ def assign_supplied(self, grouping=('product',), filter_=None):
+ pool = Pool()
+ SaleLine = pool.get('sale.line')
+
+ def filter_func(move):
+ if filter_ is None:
+ return True
+ for fieldname, values in filter_:
+ value = getattr(move, fieldname)
+ if isinstance(value, Model):
+ value = value.id
+ if value not in values:
+ return False
+
+ def get_key(move):
+ key = (move.to_location.id,)
+ for field in grouping:
+ value = getattr(move, field)
+ if isinstance(value, Model):
+ value = value.id
+ key += (value,)
+ return key
+ move_ids = [m.id for m in filter(filter_func, self.incoming_moves)]
+ sale_lines = SaleLine.search([
+ ('purchase_request.purchase_line.moves', 'in', move_ids),
+ ('purchase_request.origin', 'like', 'sale.sale,%'),
+ ])
+ pbl = defaultdict(lambda: defaultdict(int))
+ for move in filter(filter_func, self.inventory_moves):
+ pbl[move.product][get_key(move)] += move.internal_quantity
+ for sale_line in sale_lines:
+ sale_line.assign_supplied(
+ pbl[sale_line.product], grouping=grouping)
diff --git a/modules/sale_supply/tests/__init__.py b/modules/sale_supply/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/sale_supply/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/sale_supply/tests/scenario_sale_supply.rst b/modules/sale_supply/tests/scenario_sale_supply.rst
new file mode 100644
index 0000000000..f1b90c979a
--- /dev/null
+++ b/modules/sale_supply/tests/scenario_sale_supply.rst
@@ -0,0 +1,261 @@
+====================
+Sale Supply 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_fiscalyear, \
+ ... create_chart, get_accounts
+ >>> from trytond.modules.account_invoice.tests.tools import \
+ ... set_fiscalyear_invoice_sequences, create_payment_term
+ >>> today = datetime.date.today()
+
+Activate modules::
+
+ >>> config = activate_modules(['sale_supply', 'sale', 'purchase'])
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create sale user::
+
+ >>> User = Model.get('res.user')
+ >>> Group = Model.get('res.group')
+ >>> admin_user, = User.find([('login', '=', 'admin')])
+ >>> sale_user = User()
+ >>> sale_user.name = 'Sale'
+ >>> sale_user.login = 'sale'
+ >>> sale_group, = Group.find([('name', '=', 'Sales')])
+ >>> sale_user.groups.append(sale_group)
+ >>> sale_user.save()
+
+Create purchase user::
+
+ >>> purchase_user = User()
+ >>> purchase_user.name = 'Purchase'
+ >>> purchase_user.login = 'purchase'
+ >>> purchase_group, = Group.find([('name', '=', 'Purchase')])
+ >>> purchase_user.groups.append(purchase_group)
+ >>> purchase_request_group, = Group.find(
+ ... [('name', '=', 'Purchase Request')])
+ >>> purchase_user.groups.append(purchase_request_group)
+ >>> purchase_user.save()
+
+Create stock user::
+
+ >>> stock_user = User()
+ >>> stock_user.name = 'Stock'
+ >>> stock_user.login = 'stock'
+ >>> stock_group, = Group.find([('name', '=', 'Stock')])
+ >>> stock_user.groups.append(stock_group)
+ >>> stock_user.save()
+
+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)
+ >>> revenue = accounts['revenue']
+ >>> expense = accounts['expense']
+
+Create parties::
+
+ >>> Party = Model.get('party.party')
+ >>> supplier = Party(name='Supplier')
+ >>> supplier.save()
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_expense = expense
+ >>> account_category.account_revenue = revenue
+ >>> account_category.save()
+
+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.purchasable = True
+ >>> template.salable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.supply_on_sale = True
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+Create payment term::
+
+ >>> payment_term = create_payment_term()
+ >>> payment_term.save()
+
+Sale 250 products::
+
+ >>> set_user(sale_user)
+ >>> Sale = Model.get('sale.sale')
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.payment_term = payment_term
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = product
+ >>> sale_line.quantity = 250
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.state
+ 'processing'
+ >>> shipment, = sale.shipments
+ >>> move, = shipment.outgoing_moves
+ >>> move.state
+ 'staging'
+ >>> move, = shipment.inventory_moves
+ >>> move.state
+ 'staging'
+
+Delete Purchase Request::
+
+ >>> set_user(purchase_user)
+ >>> PurchaseRequest = Model.get('purchase.request')
+ >>> purchase_request, = PurchaseRequest.find()
+ >>> purchase_request.quantity
+ 250.0
+ >>> purchase_request.delete()
+ >>> purchase_request, = PurchaseRequest.find()
+ >>> purchase_request.quantity
+ 250.0
+
+Create Purchase from Request::
+
+ >>> set_user(purchase_user)
+ >>> Purchase = Model.get('purchase.purchase')
+ >>> purchase_request, = PurchaseRequest.find()
+ >>> purchase_request.quantity
+ 250.0
+ >>> create_purchase = Wizard('purchase.request.create_purchase',
+ ... [purchase_request])
+ >>> create_purchase.form.party = supplier
+ >>> create_purchase.execute('start')
+ >>> purchase, = Purchase.find()
+ >>> purchase.payment_term = payment_term
+ >>> purchase.click('quote')
+ >>> purchase.click('confirm')
+ >>> purchase.state
+ 'processing'
+ >>> set_user(sale_user)
+ >>> sale.reload()
+ >>> shipment, = sale.shipments
+ >>> move, = shipment.outgoing_moves
+ >>> move.state
+ 'draft'
+ >>> move, = shipment.inventory_moves
+ >>> move.state
+ 'draft'
+
+Receive 100 products::
+
+ >>> set_user(stock_user)
+ >>> ShipmentIn = Model.get('stock.shipment.in')
+ >>> Move = Model.get('stock.move')
+ >>> shipment = ShipmentIn(supplier=supplier)
+ >>> move, = shipment.incoming_moves.find()
+ >>> shipment.incoming_moves.append(move)
+ >>> move.quantity = 100
+ >>> shipment.click('receive')
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+ >>> set_user(sale_user)
+ >>> sale.reload()
+ >>> shipment, = sale.shipments
+ >>> move, = [x for x in shipment.inventory_moves
+ ... if x.state == 'assigned']
+ >>> move.quantity
+ 100.0
+ >>> move, = [x for x in shipment.inventory_moves
+ ... if x.state == 'draft']
+ >>> move.quantity
+ 150.0
+
+Switching from not supplying on sale to supplying on sale for product should
+not create a new purchase request::
+
+ >>> set_user(admin_user)
+
+ >>> changing_template = ProductTemplate()
+ >>> changing_template.name = 'product'
+ >>> changing_template.default_uom = unit
+ >>> changing_template.type = 'goods'
+ >>> changing_template.purchasable = True
+ >>> changing_template.salable = True
+ >>> changing_template.list_price = Decimal('10')
+ >>> changing_template.account_category = account_category
+ >>> changing_template.supply_on_sale = False
+ >>> changing_template.save()
+ >>> changing_product, = changing_template.products
+
+ >>> set_user(sale_user)
+ >>> Sale = Model.get('sale.sale')
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.payment_term = payment_term
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = changing_product
+ >>> sale_line.quantity = 100
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.state
+ 'processing'
+ >>> shipment, = sale.shipments
+ >>> set_user(stock_user)
+ >>> Inventory = Model.get('stock.inventory')
+ >>> Location = Model.get('stock.location')
+ >>> storage, = Location.find([
+ ... ('code', '=', 'STO'),
+ ... ])
+ >>> inventory = Inventory()
+ >>> inventory.location = storage
+ >>> inventory.save()
+ >>> inventory_line = inventory.lines.new()
+ >>> inventory_line.product = changing_product
+ >>> inventory_line.quantity = 100.0
+ >>> inventory_line.expected_quantity = 0.0
+ >>> inventory.save()
+ >>> inventory.click('confirm')
+ >>> inventory.state
+ 'done'
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.click('pick')
+ >>> shipment.click('pack')
+
+ >>> set_user(admin_user)
+ >>> changing_template.supply_on_sale = True
+ >>> changing_template.save()
+
+ >>> set_user(stock_user)
+ >>> shipment.click('done')
+ >>> set_user(purchase_user)
+ >>> len(PurchaseRequest.find([('product', '=', changing_product.id)]))
+ 0
diff --git a/modules/sale_supply/tests/scenario_sale_supply_shipment_on_invoice.rst b/modules/sale_supply/tests/scenario_sale_supply_shipment_on_invoice.rst
new file mode 100644
index 0000000000..67349f3484
--- /dev/null
+++ b/modules/sale_supply/tests/scenario_sale_supply_shipment_on_invoice.rst
@@ -0,0 +1,130 @@
+=============================================
+Sale Supply with Shipment on Invoice 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, create_payment_term
+
+Activate modules::
+
+ >>> config = activate_modules('sale_supply')
+
+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)
+
+ >>> Journal = Model.get('account.journal')
+ >>> PaymentMethod = Model.get('account.invoice.payment.method')
+ >>> cash_journal, = Journal.find([('type', '=', 'cash')])
+ >>> cash_journal.save()
+ >>> payment_method = PaymentMethod()
+ >>> payment_method.name = 'Cash'
+ >>> payment_method.journal = cash_journal
+ >>> payment_method.credit_account = accounts['cash']
+ >>> payment_method.debit_account = accounts['cash']
+ >>> payment_method.save()
+
+Create parties::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create account category::
+
+ >>> 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 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.salable = True
+ >>> template.purchasable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.supply_on_sale = True
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+Sale 5 products with shipment method on invoice::
+
+ >>> Sale = Model.get('sale.sale')
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.shipment_method = 'invoice'
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = product
+ >>> sale_line.quantity = 5
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.click('process')
+ >>> sale.state
+ 'processing'
+ >>> len(sale.shipments)
+ 0
+ >>> invoice, = sale.invoices
+ >>> sale_line, = sale.lines
+ >>> sale_line.purchase_request
+
+Pay for 4 products::
+
+ >>> invoice_line, = invoice.lines
+ >>> invoice_line.quantity = 4
+ >>> invoice.click('post')
+ >>> pay = Wizard('account.invoice.pay', [invoice])
+ >>> pay.form.payment_method = payment_method
+ >>> pay.execute('choice')
+
+Not yet a purchase request::
+
+ >>> sale_line.reload()
+ >>> sale_line.purchase_request
+
+Pay for remaining products::
+
+ >>> sale.reload()
+ >>> _, invoice = sale.invoices
+ >>> invoice.click('post')
+ >>> pay = Wizard('account.invoice.pay', [invoice])
+ >>> pay.form.payment_method = payment_method
+ >>> pay.execute('choice')
+
+Check purchase request::
+
+ >>> sale_line.reload()
+ >>> bool(sale_line.purchase_request)
+ True
+ >>> sale_line.purchase_request.quantity
+ 5.0
diff --git a/modules/sale_supply/tests/test_module.py b/modules/sale_supply/tests/test_module.py
new file mode 100644
index 0000000000..a26dafb443
--- /dev/null
+++ b/modules/sale_supply/tests/test_module.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.tests.test_tryton import ModuleTestCase
+
+
+class SaleSupplyTestCase(ModuleTestCase):
+ 'Test SaleSupply module'
+ module = 'sale_supply'
+
+
+del ModuleTestCase
diff --git a/modules/sale_supply/tests/test_scenario.py b/modules/sale_supply/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/sale_supply/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/sale_supply/tox.ini b/modules/sale_supply/tox.ini
new file mode 100644
index 0000000000..5e3bf82840
--- /dev/null
+++ b/modules/sale_supply/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/sale_supply/* -m unittest discover -s tests
+ coverage report --include=./**/sale_supply/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/sale_supply/tryton.cfg b/modules/sale_supply/tryton.cfg
new file mode 100644
index 0000000000..1c54bdf9a3
--- /dev/null
+++ b/modules/sale_supply/tryton.cfg
@@ -0,0 +1,11 @@
+[tryton]
+version=6.7.0
+depends:
+ ir
+ purchase
+ purchase_request
+ sale
+ stock
+xml:
+ product.xml
+ sale.xml
diff --git a/modules/sale_supply/view/sale_line_form.xml b/modules/sale_supply/view/sale_line_form.xml
new file mode 100644
index 0000000000..e8e5d49b64
--- /dev/null
+++ b/modules/sale_supply/view/sale_line_form.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply/view/template_form.xml b/modules/sale_supply/view/template_form.xml
new file mode 100644
index 0000000000..243caf86b3
--- /dev/null
+++ b/modules/sale_supply/view/template_form.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/.drone.yml b/modules/sale_supply_drop_shipment/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/sale_supply_drop_shipment/.flake8 b/modules/sale_supply_drop_shipment/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/sale_supply_drop_shipment/.isort.cfg b/modules/sale_supply_drop_shipment/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/sale_supply_drop_shipment/CHANGELOG b/modules/sale_supply_drop_shipment/CHANGELOG
new file mode 100644
index 0000000000..281c29417d
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/CHANGELOG
@@ -0,0 +1,74 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Improve moves synchronisation on drop shipment
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Recompute cost price of drop shipment
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+* Allow drop shipment's effective date to be defined
+* Add relate from party to drop shipments
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+* Rename drop shipment state from cancel to cancelled
+
+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)
+* Check pending drop shipment to erase party
+* Create drop shipment depending on the shipment method
+
+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)
+* Split moves into supplier and customer moves
+
+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)
+* Propagate exception handling from sale to purchase
+
+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/sale_supply_drop_shipment/COPYRIGHT b/modules/sale_supply_drop_shipment/COPYRIGHT
new file mode 100644
index 0000000000..51a574630e
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2011-2022 Cédric Krier.
+Copyright (C) 2011-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/sale_supply_drop_shipment/LICENSE b/modules/sale_supply_drop_shipment/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/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/sale_supply_drop_shipment/MANIFEST.in b/modules/sale_supply_drop_shipment/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/sale_supply_drop_shipment/README.rst b/modules/sale_supply_drop_shipment/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/sale_supply_drop_shipment/__init__.py b/modules/sale_supply_drop_shipment/__init__.py
new file mode 100644
index 0000000000..16194fbfcd
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/__init__.py
@@ -0,0 +1,32 @@
+# 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 party, product, purchase, sale, stock
+
+
+def register():
+ Pool.register(
+ stock.Configuration,
+ stock.ConfigurationSequence,
+ stock.Move,
+ stock.ShipmentDrop,
+ sale.Configuration,
+ sale.ConfigurationSaleDropLocation,
+ sale.Sale,
+ sale.Line,
+ purchase.Request,
+ purchase.Configuration,
+ purchase.ConfigurationPurchaseDropLocation,
+ purchase.Purchase,
+ purchase.Line,
+ purchase.ProductSupplier,
+ product.Product,
+ module='sale_supply_drop_shipment', type_='model')
+ Pool.register(
+ purchase.RequestCreatePurchase,
+ purchase.HandleShipmentException,
+ party.Replace,
+ party.Erase,
+ module='sale_supply_drop_shipment', type_='wizard')
diff --git a/modules/sale_supply_drop_shipment/doc/index.rst b/modules/sale_supply_drop_shipment/doc/index.rst
new file mode 100644
index 0000000000..702cfe1f6a
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/doc/index.rst
@@ -0,0 +1,38 @@
+Sale Supply Drop Shipment Model
+###############################
+
+The Sale Supply Drop Shipment module adds a drop shipment option on product
+supplier if "supply on request" is checked. When checked, the purchase request
+and the linked purchase have the address of customer as Delivery Address;
+at the confirmation of the purchase a drop shipment is created and linked to
+both the purchase and the sale.
+
+Drop Shipment
+*************
+
+A drop shipment is used when products are sent directly from the supplier to
+the customer without going through the warehouse.
+It is mainly composed of a supplier, a customer and a list of moves.
+
+The drop shipment can be in one of this states:
+
+* Draft
+
+ All moves are in draft.
+
+* Waiting
+
+ All moves are in draft, the synchronization between the moves of the supplier
+ and the moves to the customer has occurred.
+
+* Shipped
+
+ All moves from the supplier are done.
+
+* Done
+
+ All moves are in state Done.
+
+* Cancelled
+
+ All moves are cancelled.
diff --git a/modules/sale_supply_drop_shipment/icons/LICENSE b/modules/sale_supply_drop_shipment/icons/LICENSE
new file mode 100644
index 0000000000..7a4a3ea242
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/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/sale_supply_drop_shipment/icons/tryton-shipment-drop.svg b/modules/sale_supply_drop_shipment/icons/tryton-shipment-drop.svg
new file mode 100644
index 0000000000..411d75701b
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/icons/tryton-shipment-drop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/modules/sale_supply_drop_shipment/locale/bg.po b/modules/sale_supply_drop_shipment/locale/bg.po
new file mode 100644
index 0000000000..57b670607e
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/bg.po
@@ -0,0 +1,313 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Клиент"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Адрес за доствка"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Клиент"
+
+#, fuzzy
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Адрес за доствка"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Движения"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Адрес за контакт"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Клиент"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Адрес за доствка"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Ефективна дата"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Планирана дата"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Препратка"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Щат"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Очакване"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+#, fuzzy
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Приключено"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Очакване"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Drop Shipment"
diff --git a/modules/sale_supply_drop_shipment/locale/ca.po b/modules/sale_supply_drop_shipment/locale/ca.po
new file mode 100644
index 0000000000..3d5751af58
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/ca.po
@@ -0,0 +1,289 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Ubicació compra directa"
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Ubicació compra directa"
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Enviament directe"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr "Enviament directe disponible"
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adreça d'enviament"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "Ubicació enviament directe"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Enviaments directes"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adreça d'enviament"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Ubicació venda directa"
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Ubicació venda directa"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "Ubicació enviament directe"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Enviaments directes"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Seqüència d'enviament directe"
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Seqüència d'enviament directe"
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr "Client d'enviament directe"
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Moviments d'enviament directe"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr "Origen enviament directe"
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Adreça de contacte"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr "Movimients de client"
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adreça d'enviament"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Data efectiva"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Data estimada"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr "Moviments de proveïdor"
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Quan s'han enviat realment les existències."
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr "El identificador principal de l'albarà."
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Enviaments directes"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Compres"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Enviaments directes"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Vendes"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Enviaments directes"
+
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Enviaments directes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Enviat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+"Per obtenir un pressupost de la compra \"%(compra)s\" heu de proporcionar "
+"una direcció d'entrega."
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr "Per eliminar l'enviament directe \"%(shipmetn)s\" heu de cancel·lar-lo."
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+"No podeu restablir a esborrany el moviment \"%(move)s\" perquè ha estat "
+"generat per una venda o una compra."
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Esteu segurs que voleu completar l'albarà?"
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr "Esteu segurs que voleu enviar l'albarà?"
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Finalitza"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Envia"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "En espera"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Enviament directe"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Enviament directe"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Enviaments directes"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr "Configuració de la ubicació d'enviament directe per les compres"
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr "Configuració de la ubicació d'enviament directe per les vendes"
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Enviament directe"
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Enviament directe"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Enviat"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Seqüència d'enviament directe"
diff --git a/modules/sale_supply_drop_shipment/locale/cs.po b/modules/sale_supply_drop_shipment/locale/cs.po
new file mode 100644
index 0000000000..0a9913a47a
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/cs.po
@@ -0,0 +1,296 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr ""
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+#, fuzzy
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Drop Shipment"
diff --git a/modules/sale_supply_drop_shipment/locale/de.po b/modules/sale_supply_drop_shipment/locale/de.po
new file mode 100644
index 0000000000..227cf41131
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/de.po
@@ -0,0 +1,292 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Lagerort Direktlieferung Einkauf"
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Lagerort Direktlieferung Einkauf"
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Direktlieferung"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr "Direktlieferung möglich"
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Lieferadresse"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "Lagerort Direktlieferung"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Direktlieferungen"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Lieferadresse"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Lagerort Direktlieferung Verkauf"
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Lagerort Direktlieferung Verkauf"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "Lagerort Direktlieferung"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Direktlieferungen"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Nummernkreis Direktlieferung"
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Nummernkreis Direktlieferung"
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr "Direktkunde"
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Warenbewegungen Direktlieferung"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr "Herkunft Direktlieferung"
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Kontaktadresse"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr "Warenbewegungen zu Kunden"
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Lieferadresse"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Effektives Datum"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Geplantes Datum"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Referenz"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr "Warenbewegungen von Lieferanten"
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Zeitpunkt an dem die Ware tatsächlich versandt wurde."
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr "Das Hauptidentifizierungsmerkmal für die Lieferung."
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Direktlieferungen"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Einkäufe"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Direktlieferungen"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Verkäufe"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Direktlieferungen"
+
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Direktlieferungen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Versendet"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+"Um eine Angebotsanfrage für Einkauf \"%(purchase)s\" erstellen zu können, "
+"muss zuerst eine Lieferadresse erfasst werden."
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+"Damit die Direktlieferung \"%(shipment)s\" gelöscht werden kann, muss sie "
+"zuerst annulliert werden."
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+"Die Warenbewegung \"%(move)s\" kann nicht in den Entwurfsstatus "
+"zurückgesetzt werden, weil sie automatisch aus einem Verkauf oder Einkauf "
+"erstellt wurde."
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Lieferung wirklich abschließen?"
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr "Lieferung wirklich abschließen?"
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Versenden"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Warten"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Direktlieferung"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Direktlieferung"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Direktlieferungen"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr "Einstellungen Einkauf Lagerort Direktlieferung"
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr "Einstellungen Verkauf Lagerort Direktlieferung"
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Direktlieferung"
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Direktlieferung"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Versendet"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Nummernkreis Direktlieferung"
diff --git a/modules/sale_supply_drop_shipment/locale/es.po b/modules/sale_supply_drop_shipment/locale/es.po
new file mode 100644
index 0000000000..de1ce43b31
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/es.po
@@ -0,0 +1,289 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Ubicación compra directa"
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Ubicación compra directa"
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Envío directo"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr "Envío directo disponible"
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Dirección de envío"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "Ubicación envío directo"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Envíos directos"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Dirección de envío"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Ubicación venta directa"
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Ubicación venta directa"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "Ubicación envío directo"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Envíos directos"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Secuencia de envío directo"
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Secuencia de envío directo"
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr "Cliente de envío directo"
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Movimientos de envío directo"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr "Origen envío directo"
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Dirección de contacto"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr "Movimientos de cliente"
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Dirección de envío"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Fecha efectiva"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Fecha estimada"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr "Movimientos de proveedor"
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Cuando se enviaron realmente las existencias."
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr "El identificador principal del albarán."
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Envíos directos"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Compras"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Envíos directos"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Ventas"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Envíos directos"
+
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Envíos directos"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Enviado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+"Para obtener un presupuesto para la compra \"%(purchase)s\" debe "
+"proporcionar una dirección de entrega."
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr "Para eliminar el envío directo \"%(shipment)s\" debe cancelarlo."
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+"No puede restaurar a borrador el movimiento \"%(move)s\" porque fue generado"
+" por una venta o una compra."
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "¿Estás seguro que quieres finalizar el albarán?"
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr "¿Estás seguro que quieres enviar el albarán?"
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Finalizar"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Enviar"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "En espera"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Envío directo"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Envío directo"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Envíos directos"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr "Configuración de la ubicación de envío directo para las compras"
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr "Configuración de la ubicación de envío directo para las ventas"
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Envío directo"
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Envío directo"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Enviado"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Secuencia de envío directo"
diff --git a/modules/sale_supply_drop_shipment/locale/es_419.po b/modules/sale_supply_drop_shipment/locale/es_419.po
new file mode 100644
index 0000000000..97b86eb7c9
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/es_419.po
@@ -0,0 +1,288 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Ubicación de compra directa"
+
+#, fuzzy
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Ubicación de compra directa"
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Dirección de entrega"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "Ubicación de envío directo"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Dirección de entrega"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Ubicación de venta directa"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Ubicación de venta directa"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "Ubicación de envío directo"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr ""
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Dirección de entrega"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Fecha planificada"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Realizado"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr ""
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Realizado"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr ""
diff --git a/modules/sale_supply_drop_shipment/locale/et.po b/modules/sale_supply_drop_shipment/locale/et.po
new file mode 100644
index 0000000000..804198fad6
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/et.po
@@ -0,0 +1,289 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Saabumisala"
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Saabumisala"
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Klient"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Klient"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Väljastusala"
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Väljastusala"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr ""
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Klient"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Tarnitud"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Tarni"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Oota"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr ""
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Tarnitud"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr ""
diff --git a/modules/sale_supply_drop_shipment/locale/fa.po b/modules/sale_supply_drop_shipment/locale/fa.po
new file mode 100644
index 0000000000..3b3e8356b8
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/fa.po
@@ -0,0 +1,293 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "مکان دراپ شیپینگ"
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "مکان خرید دراپ"
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "دراپ شیپینگ"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr "دراپ شیپینگ در دسترس"
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "مشتری"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "آدرس تحویل"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "مکان دراپ"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "دراپ شیپینگ ها"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "مشتری"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "آدرس تحویل"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "محل فروش دراپ"
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "محل فروش دراپ"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "مکان دراپ"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "دراپ شیپینگ ها"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "ادامه دراپ شیپینگ"
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "ادامه دراپ شیپینگ"
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr "مشتری دراپ"
+
+#, fuzzy
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "آدرس تماس"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "مشتری"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr "جابجایی های مشتری"
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "آدرس تحویل"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "تاریخ موثر"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "تاریخ برنامه ریزی شده"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "مرجع"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "تامین کننده"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr "جابجایی های تامین کننده"
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "دراپ شیپینگ ها"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "دراپ شیپینگ ها"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "دراپ شیپینگ ها"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "دراپ شیپینگ ها"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "ارسال شد"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "در انتظار"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+"برای دریافت یک نقل قول برای خرید :\"%(purchase)s\" شما باید یک آدرس تحویل "
+"ارائه دهید."
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr "برای حذف حمل و نقل قطره :\"%(shipment)s\" شما باید ابتدا آنرا لغو کنید."
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+"شما نمیتوانید جابجایی :\"%(move)s\"را به حالت پیش نویس بازنشانی کنید، چراکه "
+"آن توسط یک فروش یا خرید تولید شده است."
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "دراپ شیپینگ"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "دراپ شیپینگ"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "دراپ شیپینگ ها"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr "پیکربندی خرید ؛ مکان خرید دراپ"
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr "پیکربندی فروش : مکان فروش دراپ"
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "دراپ"
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "دراپ شیپینگ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "ارسال شد"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "در انتظار"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "ادامه دراپ شیپینگ"
diff --git a/modules/sale_supply_drop_shipment/locale/fi.po b/modules/sale_supply_drop_shipment/locale/fi.po
new file mode 100644
index 0000000000..0a9913a47a
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/fi.po
@@ -0,0 +1,296 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr ""
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+#, fuzzy
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Drop Shipment"
diff --git a/modules/sale_supply_drop_shipment/locale/fr.po b/modules/sale_supply_drop_shipment/locale/fr.po
new file mode 100644
index 0000000000..5028f3aee2
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/fr.po
@@ -0,0 +1,290 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Emplacement de livraison directe d'achat"
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Emplacement de livraison directe d'achat"
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Livraison directe"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr "Livraison directe disponible"
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adresse de livraison"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "Emplacement de livraison directe"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Livraisons directes"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adresse de livraison"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Emplacement de livraison directe de vente"
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Emplacement de livraison directe de vente"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "Emplacement de livraison directe"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Livraisons directes"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Séquence de livraison directe"
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Séquence de livraison directe"
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr "Livraison directe cliente"
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Mouvements directes"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr "Origine directe"
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Adresse de contact"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr "Mouvements clients"
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adresse de livraison"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Date effective"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Date planifiée"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr "Mouvements fournisseurs"
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Quand le stock a été effectivement envoyé."
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identifiant principal de l'expédition."
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Livraisons directes"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Achats"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Livraisons directes"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Ventes"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Livraisons directes"
+
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Livraisons directes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "Toutes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Livrées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "En attentes"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+"Pour avoir un devis de l'achat « %(purchase)s », vous devez fournir une "
+"adresse de livraison."
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+"Pour supprimer la livraison directes « %(shipment)s », vous devez l'annuler."
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+"Vous ne pouvez pas réinitialiser à l'état brouillon le mouvement "
+"« %(move)s » car il a été généré par une vente ou un achat."
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Êtes-vous sûr de vouloir terminer l'expédition ?"
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr "Êtes-vous sûr de vouloir livrer l'expédition ?"
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Livrer"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Attendre"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Livraison directe"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Livraison directe"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Livraisons directes"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr "Configuration d'achat Emplacement de livraison directe d'achat"
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr "Configuration de vente Emplacement de livraison directe de vente"
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Livraison directe"
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Livraison directe"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Annulée"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Effectué"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Livré"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Séquence de livraison directe"
diff --git a/modules/sale_supply_drop_shipment/locale/hu.po b/modules/sale_supply_drop_shipment/locale/hu.po
new file mode 100644
index 0000000000..c6dff1aaf1
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/hu.po
@@ -0,0 +1,305 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Vevő"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Vevő"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Raktár mozgás"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Társaság"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Vevő"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Raktár mozgás"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Állapot"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Beszállítók"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "Összes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+#, fuzzy
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Mégse"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Kész"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Drop Shipment"
diff --git a/modules/sale_supply_drop_shipment/locale/id.po b/modules/sale_supply_drop_shipment/locale/id.po
new file mode 100644
index 0000000000..8be07d7c10
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/id.po
@@ -0,0 +1,288 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Pelanggan"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Alamat Pengiriman"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Pelanggan"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Alamat Pengiriman"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Pelanggan"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Alamat Pengiriman"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Tanggal Efektif"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Referensi"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr ""
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Batal"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr ""
diff --git a/modules/sale_supply_drop_shipment/locale/it.po b/modules/sale_supply_drop_shipment/locale/it.po
new file mode 100644
index 0000000000..e595c95255
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/it.po
@@ -0,0 +1,303 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Locazione per acquisto diretto."
+
+#, fuzzy
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Locazione per acquisto diretto."
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Consegna diretta."
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Indirizzo di spedizione"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "Locazione di consegna"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Spedizioni dirette"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Indirizzo di spedizione"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Locazione di vendita diretta"
+
+#, fuzzy
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Locazione di vendita diretta"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "Locazione di consegna"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Spedizioni dirette"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Sequenza di dropshipment"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Sequenza di dropshipment"
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr "Cliente di consegna diretta"
+
+#, fuzzy
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Indirizzo contatto"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr "Movimenti cliente"
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Indirizzo di spedizione"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Decorrenza"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Data prevista"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Riferimento"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr "Movimenti fornitore"
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Acquisti"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Spedizioni dirette"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Versamento"
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Consegna diretta"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Eseguito"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Spedito"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "In attesa"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Sequenza di dropshipment"
diff --git a/modules/sale_supply_drop_shipment/locale/lo.po b/modules/sale_supply_drop_shipment/locale/lo.po
new file mode 100644
index 0000000000..9f9b2d3b43
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/lo.po
@@ -0,0 +1,305 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "ວັນທີມີຜົນ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "ເອກະສານອ້າງອີງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+#, fuzzy
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກແລ້ວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Drop Shipment"
diff --git a/modules/sale_supply_drop_shipment/locale/lt.po b/modules/sale_supply_drop_shipment/locale/lt.po
new file mode 100644
index 0000000000..4bea224b03
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/lt.po
@@ -0,0 +1,296 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Siuntimo adresas"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Siuntimo adresas"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr ""
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Kontaktinis adresas"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Siuntimo adresas"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Faktinė data"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Pirkimai"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Pardavimai"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+#, fuzzy
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Drop Shipment"
diff --git a/modules/sale_supply_drop_shipment/locale/nl.po b/modules/sale_supply_drop_shipment/locale/nl.po
new file mode 100644
index 0000000000..32acd5e5f6
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/nl.po
@@ -0,0 +1,290 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Opslaglocatie Directe levering Inkoop"
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Opslaglocatie Directe levering Inkoop"
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Directe levering"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr "Directe levering beschikbaar"
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Klant"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Leveringsadres"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "Directe leveringslocatie (drop location)"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Directe leveringen"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Klant"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Leveringsadres"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Opslaglocatie directe verkoop"
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Opslaglocatie directe verkoop"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "Directe leveringslocatie (drop location)"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Directe leveringen"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Directe leveringsvolgorde"
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Directe leveringsvolgorde"
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr "spoed levering klant"
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Directe Levering Boekingen"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr "Directe Levering Oorsprong"
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "contact adres"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Klant"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr "klant boekingen/bewegingen"
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Leveringsadres"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Effectieve datum"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Boekingen"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Geplande datum"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr "Leverancier mutaties"
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Wanneer de voorraad daadwerkelijk werd verzonden."
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr "De hoofdidentificatie voor de zending."
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Directe leveringen"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Inkopen"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Directe leveringen"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Verkoop"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Directe leveringen"
+
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Directe leveringen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "verzonden"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+"Om een offerte te krijgen voor aankoop \"% (purchase) s\" moet u een "
+"afleveradres opgeven."
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+"Om spoed-verzending \"%(shipment)s\" te verwijderen, moet u deze annuleren."
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+"U kunt de beweging \"%(move)s\" niet terugzetten naar concept omdat deze is "
+"gegenereerd door een verkoop of een aankoop."
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Weet u zeker dat u de zending wilt voltooien?"
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr "Weet u zeker dat u de zending wilt verzenden?"
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "verzenden"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "wachten"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Directe levering"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Directe levering"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Directe leveringen"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr "Instellingen Aankoop Opslag Locatie Directe levering"
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr "Instellingen Verkoop Opslag Directe levering"
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Directe levering"
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Directe leveringen"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "verzonden"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Directe levering reeks"
diff --git a/modules/sale_supply_drop_shipment/locale/pl.po b/modules/sale_supply_drop_shipment/locale/pl.po
new file mode 100644
index 0000000000..e5aa808880
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/pl.po
@@ -0,0 +1,303 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Odbiorca"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adres dostawy"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "Porzuć lokalizację"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Porzuć wysyłki"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Odbiorca"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adres dostawy"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "Porzuć lokalizację"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Porzuć wysyłki"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr "Porzuć odbiorcę"
+
+#, fuzzy
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Ruchy"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Adres kontaktowy"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Odbiorca"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr "Ruchy odbiorcy"
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adres dostawy"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Data rzeczywista"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Data planowana"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Referencja"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Dostawca"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr "Ruchy dostawcy"
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Porzuć wysyłki"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Porzuć wysyłki"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Porzuć wysyłki"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Porzuć wysyłki"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Porzuć wysyłki"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+#, fuzzy
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Drop Shipment"
diff --git a/modules/sale_supply_drop_shipment/locale/pt.po b/modules/sale_supply_drop_shipment/locale/pt.po
new file mode 100644
index 0000000000..d018ed8489
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/pt.po
@@ -0,0 +1,300 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Localização de Envio Direto"
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Localização de Compra do Envio Direto"
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Envio Direto"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr "Envio Direto Disponível"
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Endereço de Entrega"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "Localização de Envio Direto"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Envios Diretos"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Endereço de Entrega"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Localização de Envio Direto de Venda"
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Localização de Envio Direto de Venda"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "Envio Direto"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Envios Diretos"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Sequência de Envio Direto"
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Sequência de Envio Direto"
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr "Cliente de Envio Direto"
+
+#, fuzzy
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Movimentações"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Endereço de Contato"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr "Movimentações do Cliente"
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Endereço de Entrega"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Data efetiva"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Data Planejada"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Referência"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Fornecedor"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr "Movimentações do Fornecedor"
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Envios Diretos"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr "Configurações de Compras Compra por Envio Direto"
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr "Configurações de Venda Envio Direto"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Envio Direto"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Concluído"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Enviado"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Em espera"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Sequência de Envio Direto"
diff --git a/modules/sale_supply_drop_shipment/locale/ro.po b/modules/sale_supply_drop_shipment/locale/ro.po
new file mode 100644
index 0000000000..bbf68fe052
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/ro.po
@@ -0,0 +1,285 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr ""
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Vânzări"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr ""
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr ""
diff --git a/modules/sale_supply_drop_shipment/locale/ru.po b/modules/sale_supply_drop_shipment/locale/ru.po
new file mode 100644
index 0000000000..7388d364b9
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/ru.po
@@ -0,0 +1,314 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Заказчик"
+
+#, fuzzy
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Адрес доставки"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Заказчик"
+
+#, fuzzy
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Адрес доставки"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Перемещения"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Учет.орг."
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Контактный адрес"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Заказчик"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Адрес доставки"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Учетная дата"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Плановая дата"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Ссылка"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Штат"
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Поставщик"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "Все"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Ожидание"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+#, fuzzy
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Отменено"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Ожидание"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Drop Shipment"
diff --git a/modules/sale_supply_drop_shipment/locale/sl.po b/modules/sale_supply_drop_shipment/locale/sl.po
new file mode 100644
index 0000000000..2b5e8f50ea
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/sl.po
@@ -0,0 +1,300 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Nabavna dostavna lokacija"
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr "Nabavna dostavna lokacija"
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Dostava"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr "Dostava na voljo"
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr "Kupec"
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr "Prejemnik"
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr "Dostavna lokacija"
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Dostave"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr "Kupec"
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr "Prejemnik"
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Prodajna dostavna lokacija"
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr "Prodajna dostavna lokacija"
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr "Dostavna lokacija"
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Dostave"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Štetje dostav"
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr "Štetje dostav"
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr "Dostava kupcu"
+
+#, fuzzy
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr "Promet"
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr "Kontakt"
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr "Kupec"
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr "Promet kupca"
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr "Prejemnik"
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr "Dejanski datum"
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr "Načrtovan datum"
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr "Sklic"
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr "Dobavitelj"
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr "Promet dobavitelja"
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Dostave"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr "Konfiguracija nabavne dostavne lokacije"
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr "Konfiguracija prodajne dostavne lokacije"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Dostava"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Odpremljeno"
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Čakajoče"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Štetje dostav"
diff --git a/modules/sale_supply_drop_shipment/locale/tr.po b/modules/sale_supply_drop_shipment/locale/tr.po
new file mode 100644
index 0000000000..0a9913a47a
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/tr.po
@@ -0,0 +1,296 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr ""
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "Purchases"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+#, fuzzy
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Drop Shipment"
diff --git a/modules/sale_supply_drop_shipment/locale/uk.po b/modules/sale_supply_drop_shipment/locale/uk.po
new file mode 100644
index 0000000000..8c77d09a27
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/uk.po
@@ -0,0 +1,285 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr ""
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr ""
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr ""
+
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr ""
+
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr ""
diff --git a/modules/sale_supply_drop_shipment/locale/zh_CN.po b/modules/sale_supply_drop_shipment/locale/zh_CN.po
new file mode 100644
index 0000000000..05a9d58d36
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/locale/zh_CN.po
@@ -0,0 +1,298 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:purchase.configuration,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+msgctxt ""
+"field:purchase.configuration.purchase_drop_location,purchase_drop_location:"
+msgid "Purchase Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.product_supplier,drop_shipment:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "field:purchase.product_supplier,drop_shipment_available:"
+msgid "Drop Shipment Available"
+msgstr ""
+
+msgctxt "field:purchase.purchase,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.purchase,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:purchase.purchase,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:purchase.purchase,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:purchase.request,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:purchase.request,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:sale.configuration,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.configuration.sale_drop_location,sale_drop_location:"
+msgid "Sale Drop Location"
+msgstr ""
+
+msgctxt "field:sale.sale,drop_location:"
+msgid "Drop Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:sale.sale,drop_shipments:"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "field:stock.configuration,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_drop_sequence:"
+msgid "Drop Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,customer_drop:"
+msgid "Drop Customer"
+msgstr ""
+
+msgctxt "field:stock.move,moves_drop:"
+msgid "Drop Moves"
+msgstr ""
+
+msgctxt "field:stock.move,origin_drop:"
+msgid "Drop Origin"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,customer_moves:"
+msgid "Customer Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,reference:"
+msgid "Reference"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.drop,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:stock.shipment.drop,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.drop,supplier_moves:"
+msgid "Supplier Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.drop,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_purchase_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_purchase_shipments_relate"
+msgid "Purchases"
+msgstr "采购"
+
+msgctxt "model:ir.action,name:act_sale_drop_shipment_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:ir.action,name:act_sale_shipments_relate"
+msgid "Sales"
+msgstr "Sales"
+
+msgctxt "model:ir.action,name:act_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_drop_relate_party"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_all"
+msgid "All"
+msgstr "全部"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_drop_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.message,text:msg_delivery_address_required_quotation_purchase"
+msgid ""
+"To get a quotation for purchase \"%(purchase)s\" you must provide a delivery"
+" address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_drop_shipment_delete_cancel"
+msgid "To delete drop shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_reset_move"
+msgid ""
+"You cannot reset move \"%(move)s\" to draft because it was generated by a "
+"sale or a purchase."
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_drop_ship_button"
+msgid "Are you sure you want to ship the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_drop_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_drop_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_drop_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_drop_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_drop_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_drop_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_drop"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_drop_form"
+msgid "Drop Shipments"
+msgstr "Drop Shipments"
+
+msgctxt "model:purchase.configuration.purchase_drop_location,name:"
+msgid "Purchase Configuration Purchase Drop Location"
+msgstr ""
+
+msgctxt "model:sale.configuration.sale_drop_location,name:"
+msgid "Sale Configuration Sale Drop Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_drop"
+msgid "Drop"
+msgstr "Drop"
+
+#, fuzzy
+msgctxt "model:stock.shipment.drop,name:"
+msgid "Drop Shipment"
+msgstr "Drop Shipment"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Cancelled"
+msgstr "取消"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Done"
+msgstr "完成"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.drop,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Drop Shipment Sequence"
+msgstr "Drop Shipment"
diff --git a/modules/sale_supply_drop_shipment/message.xml b/modules/sale_supply_drop_shipment/message.xml
new file mode 100644
index 0000000000..6b41a1d8fa
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/message.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ To get a quotation for purchase "%(purchase)s" you must provide a delivery address.
+
+
+ You cannot reset move "%(move)s" to draft because it was generated by a sale or a purchase.
+
+
+ To delete drop shipment "%(shipment)s" you must cancel it.
+
+
+
diff --git a/modules/sale_supply_drop_shipment/party.py b/modules/sale_supply_drop_shipment/party.py
new file mode 100644
index 0000000000..b9ae84ace0
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/party.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.i18n import gettext
+from trytond.modules.party.exceptions import EraseError
+from trytond.pool import Pool, PoolMeta
+
+
+class Replace(metaclass=PoolMeta):
+ __name__ = 'party.replace'
+
+ @classmethod
+ def fields_to_replace(cls):
+ return super().fields_to_replace() + [
+ ('purchase.request', 'customer'),
+ ('purchase.purchase', 'customer'),
+ ('stock.shipment.drop', 'supplier'),
+ ('stock.shipment.drop', 'customer'),
+ ]
+
+
+class Erase(metaclass=PoolMeta):
+ __name__ = 'party.erase'
+
+ def check_erase_company(self, party, company):
+ pool = Pool()
+ ShipmentDrop = pool.get('stock.shipment.drop')
+ super().check_erase_company(party, company)
+
+ shipments = ShipmentDrop.search([
+ ['OR',
+ ('supplier', '=', party.id),
+ ('customer', '=', party.id),
+ ],
+ ('company', '=', company.id),
+ ('state', 'not in', ['done', 'cancelled']),
+ ])
+ if shipments:
+ raise EraseError(
+ gettext('stock.msg_erase_party_shipment',
+ party=party.rec_name,
+ company=company.rec_name))
diff --git a/modules/sale_supply_drop_shipment/party.xml b/modules/sale_supply_drop_shipment/party.xml
new file mode 100644
index 0000000000..e5c6732c93
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/party.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ party.party
+
+ party_form
+
+
+
diff --git a/modules/sale_supply_drop_shipment/product.py b/modules/sale_supply_drop_shipment/product.py
new file mode 100644
index 0000000000..fbd774b8fa
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/product.py
@@ -0,0 +1,29 @@
+# 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
+from trytond.tools import grouped_slice
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
+
+ @classmethod
+ def recompute_cost_price(cls, products, start=None):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Shipment = pool.get('stock.shipment.drop')
+ shipments = set()
+ for sub_products in grouped_slice(products):
+ domain = [
+ ('unit_price_updated', '=', True),
+ cls._domain_moves_cost(),
+ ('product', 'in', [p.id for p in sub_products]),
+ ('shipment', 'like', 'stock.shipment.drop,%'),
+ ]
+ if start:
+ domain.append(('effective_date', '>=', start))
+ for move in Move.search(domain, order=[]):
+ shipments.add(move.shipment)
+ shipments = Shipment.browse(list(shipments))
+ Shipment.set_cost(shipments)
+ super().recompute_cost_price(products, start=start)
diff --git a/modules/sale_supply_drop_shipment/purchase.py b/modules/sale_supply_drop_shipment/purchase.py
new file mode 100644
index 0000000000..6d0b6dbf66
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/purchase.py
@@ -0,0 +1,264 @@
+# 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.i18n import gettext
+from trytond.model import ModelSQL, ValueMixin, fields
+from trytond.model.exceptions import RequiredValidationError
+from trytond.modules.product import round_price
+from trytond.modules.purchase.purchase import (
+ get_shipments_returns, search_shipments_returns)
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Eval
+from trytond.tools.multivalue import migrate_property
+from trytond.transaction import Transaction
+
+purchase_drop_location = fields.Many2One(
+ 'stock.location', "Purchase Drop Location", domain=[('type', '=', 'drop')])
+
+
+class Request(metaclass=PoolMeta):
+ __name__ = 'purchase.request'
+
+ customer = fields.Many2One('party.party', 'Customer', readonly=True,
+ states={
+ 'invisible': ~Eval('customer'),
+ },
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'})
+ delivery_address = fields.Many2One('party.address', 'Delivery Address',
+ domain=[('party', '=', Eval('customer'))],
+ states={
+ 'invisible': ~Eval('customer'),
+ 'readonly': Eval('state') != 'draft',
+ })
+
+
+class Configuration(metaclass=PoolMeta):
+ __name__ = 'purchase.configuration'
+
+ purchase_drop_location = fields.MultiValue(purchase_drop_location)
+
+ @classmethod
+ def default_purchase_drop_location(cls, **pattern):
+ return cls.multivalue_model(
+ 'purchase_drop_location').default_purchase_drop_location()
+
+
+class ConfigurationPurchaseDropLocation(ModelSQL, ValueMixin):
+ "Purchase Configuration Purchase Drop Location"
+ __name__ = 'purchase.configuration.purchase_drop_location'
+ purchase_drop_location = purchase_drop_location
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+
+ super().__register__(module_name)
+
+ if not exist:
+ cls._migrate_property([], [], [])
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.append('purchase_drop_location')
+ value_names.append('purchase_drop_location')
+ migrate_property(
+ 'purchase.configuration', field_names, cls, value_names,
+ fields=fields)
+
+ @classmethod
+ def default_purchase_drop_location(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id(
+ 'sale_supply_drop_shipment', 'location_drop')
+ except KeyError:
+ return None
+
+
+class Purchase(metaclass=PoolMeta):
+ __name__ = 'purchase.purchase'
+
+ customer = fields.Many2One('party.party', 'Customer', readonly=True,
+ states={
+ 'invisible': ~Eval('customer'),
+ },
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'})
+ delivery_address = fields.Many2One('party.address', 'Delivery Address',
+ domain=[('party', '=', Eval('customer'))],
+ states={
+ 'readonly': Eval('state') != 'draft',
+ 'invisible': ~Eval('customer'),
+ })
+ drop_shipments = fields.Function(fields.Many2Many('stock.shipment.drop',
+ None, None, "Drop Shipments",
+ states={
+ 'invisible': ~Eval('customer'),
+ }),
+ 'get_drop_shipments', searcher='search_drop_shipments')
+ drop_location = fields.Many2One('stock.location', 'Drop Location',
+ domain=[('type', '=', 'drop')],
+ states={
+ 'invisible': ~Eval('customer', False),
+ 'required': Eval('customer', False),
+ })
+
+ @staticmethod
+ def default_drop_location():
+ pool = Pool()
+ PurchaseConfig = pool.get('purchase.configuration')
+
+ config = PurchaseConfig(1)
+ if config.purchase_drop_location:
+ return config.purchase_drop_location.id
+
+ @fields.depends('customer', 'delivery_address')
+ def on_change_customer(self):
+ self.delivery_address = None
+ if self.customer:
+ self.delivery_address = self.customer.address_get(type='delivery')
+
+ @property
+ def delivery_full_address(self):
+ address = super(Purchase, self).delivery_full_address
+ if self.customer and self.delivery_address:
+ address = self.delivery_address.full_address
+ return address
+
+ get_drop_shipments = get_shipments_returns('stock.shipment.drop')
+ search_drop_shipments = search_shipments_returns('stock.shipment.drop')
+
+ def check_for_quotation(self):
+ super(Purchase, self).check_for_quotation()
+ if self.customer and not self.delivery_address:
+ raise RequiredValidationError(
+ gettext('sale_supply_drop_shipment'
+ '.msg_delivery_address_required_quotation_purchase') % {
+ 'purchase': self.rec_name,
+ })
+
+ @classmethod
+ def _process_shipment(cls, purchases):
+ pool = Pool()
+ DropShipment = pool.get('stock.shipment.drop')
+
+ drop_shipments = []
+ for purchase in purchases:
+ if purchase.customer:
+ moves = purchase.create_move('in')
+ if moves:
+ drop_shipment = purchase.create_drop_shipment()
+ drop_shipment.supplier_moves = moves
+ drop_shipments.append(drop_shipment)
+ DropShipment.save(drop_shipments)
+ DropShipment.wait(drop_shipments)
+ super()._process_shipment(purchases)
+
+ def create_drop_shipment(self):
+ pool = Pool()
+ DropShipment = pool.get('stock.shipment.drop')
+
+ return DropShipment(
+ company=self.company,
+ supplier=self.party,
+ contact_address=self.party.address_get(),
+ customer=self.customer,
+ delivery_address=self.delivery_address,
+ )
+
+
+class Line(metaclass=PoolMeta):
+ __name__ = 'purchase.line'
+
+ def get_to_location(self, name):
+ result = super().get_to_location(name)
+ if self.purchase.customer:
+ return self.purchase.drop_location.id
+ return result
+
+ def get_move(self, move_type):
+ pool = Pool()
+ Currency = pool.get('currency.currency')
+ move = super().get_move(move_type)
+ if move and self.purchase.customer:
+ cost_price = Currency.compute(
+ move.currency, move.unit_price, move.company.currency)
+ move.cost_price = round_price(cost_price)
+ return move
+
+
+class ProductSupplier(metaclass=PoolMeta):
+ __name__ = 'purchase.product_supplier'
+
+ drop_shipment = fields.Boolean('Drop Shipment',
+ states={
+ 'invisible': ~Eval('drop_shipment_available', False),
+ })
+ drop_shipment_available = fields.Function(
+ fields.Boolean("Drop Shipment Available"),
+ 'on_change_with_drop_shipment_available')
+
+ @fields.depends('product', 'template',
+ '_parent_product.type', '_parent_product.supply_on_sale',
+ '_parent_template.type', '_parent_template.supply_on_sale')
+ def on_change_with_drop_shipment_available(self, name=None):
+ product = self.product or self.template
+ if product and product.type in {'goods', 'assets'}:
+ return product.supply_on_sale
+
+
+class RequestCreatePurchase(metaclass=PoolMeta):
+ __name__ = 'purchase.request.create_purchase'
+
+ @classmethod
+ def _group_purchase_key(cls, requests, request):
+ result = super()._group_purchase_key(requests, request)
+ result += (
+ ('customer', request.customer.id if request.customer else None),
+ ('delivery_address', request.delivery_address.id
+ if request.delivery_address else None),
+ )
+ return result
+
+
+class HandleShipmentException(metaclass=PoolMeta):
+ __name__ = 'purchase.handle.shipment.exception'
+
+ def transition_handle(self):
+ pool = Pool()
+ Sale = pool.get('sale.sale')
+ Move = pool.get('stock.move')
+ transaction = Transaction()
+ context = transaction.context
+
+ super().transition_handle()
+
+ sales = set()
+ moves = set()
+ to_recreate = set(self.ask.recreate_moves)
+ domain_moves = set(self.ask.domain_moves)
+
+ for line in self.record.lines:
+ if not set(line.moves) & domain_moves:
+ continue
+ if not any(m in to_recreate for m in line.moves):
+ for request in line.requests:
+ for sale_line in request.sale_lines:
+ moves.update({m for m in sale_line.moves
+ if (m.state != 'done'
+ and m.from_location.type == 'drop')})
+ sales.add(sale_line.sale)
+
+ if moves:
+ Move.cancel(moves)
+ if sales:
+ with transaction.set_context(
+ queue_batch=context.get('queue_batch', True)):
+ Sale.__queue__.process(sales)
+ return 'end'
diff --git a/modules/sale_supply_drop_shipment/purchase.xml b/modules/sale_supply_drop_shipment/purchase.xml
new file mode 100644
index 0000000000..2f60cb7cad
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/purchase.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+ purchase.purchase
+
+ purchase_form
+
+
+ purchase.configuration
+
+ purchase_configuration_form
+
+
+
+ Drop Shipments
+ stock.shipment.drop
+
+
+
+ form_relate
+ purchase.purchase,-1
+
+
+
+
+ purchase.product_supplier
+
+ product_supplier_form
+
+
+
+ purchase.request
+
+ purchase_request_form
+
+
+
+ purchase.request
+
+ purchase_request_tree
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/sale.py b/modules/sale_supply_drop_shipment/sale.py
new file mode 100644
index 0000000000..414f3b3bcb
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/sale.py
@@ -0,0 +1,158 @@
+# 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 ModelSQL, ValueMixin, fields
+from trytond.modules.sale.sale import (
+ get_shipments_returns, search_shipments_returns)
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Eval
+from trytond.tools.multivalue import migrate_property
+from trytond.transaction import Transaction
+
+sale_drop_location = fields.Many2One(
+ 'stock.location', "Sale Drop Location", domain=[('type', '=', 'drop')])
+
+
+class Configuration(metaclass=PoolMeta):
+ __name__ = 'sale.configuration'
+
+ sale_drop_location = fields.MultiValue(sale_drop_location)
+
+ @classmethod
+ def default_sale_drop_location(cls, **pattern):
+ return cls.multivalue_model(
+ 'sale_drop_location').default_sale_drop_location()
+
+
+class ConfigurationSaleDropLocation(ModelSQL, ValueMixin):
+ "Sale Configuration Sale Drop Location"
+ __name__ = 'sale.configuration.sale_drop_location'
+ sale_drop_location = sale_drop_location
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+
+ super().__register__(module_name)
+
+ if not exist:
+ cls._migrate_property([], [], [])
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.append('sale_drop_location')
+ value_names.append('sale_drop_location')
+ migrate_property(
+ 'sale.configuration', field_names, cls, value_names,
+ fields=fields)
+
+ @classmethod
+ def default_sale_drop_location(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id(
+ 'sale_supply_drop_shipment', 'location_drop')
+ except KeyError:
+ return None
+
+
+class Sale(metaclass=PoolMeta):
+ __name__ = 'sale.sale'
+
+ drop_shipments = fields.Function(fields.Many2Many(
+ 'stock.shipment.drop', None, None, 'Drop Shipments',
+ states={
+ 'invisible': ~Eval('drop_shipments'),
+ }),
+ 'get_drop_shipments', searcher='search_drop_shipments')
+ drop_location = fields.Many2One('stock.location', 'Drop Location',
+ domain=[('type', '=', 'drop')])
+
+ @staticmethod
+ def default_drop_location():
+ pool = Pool()
+ Config = pool.get('sale.configuration')
+
+ config = Config(1)
+ if config.sale_drop_location:
+ return config.sale_drop_location.id
+
+ get_drop_shipments = get_shipments_returns('stock.shipment.drop')
+ search_drop_shipments = search_shipments_returns('stock.shipment.drop')
+
+ @classmethod
+ def _process_shipment(cls, sales):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ super()._process_shipment(sales)
+ moves = []
+ with Transaction().set_context(_drop_shipment=True):
+ for sale in sales:
+ moves.extend(sale.create_drop_shipment_moves())
+ Move.save(moves)
+
+ def create_drop_shipment_moves(self):
+ moves = []
+ for line in self.lines:
+ moves += line.get_drop_moves()
+ return moves
+
+
+class Line(metaclass=PoolMeta):
+ __name__ = 'sale.line'
+
+ @property
+ def supply_on_sale(self):
+ supply_on_sale = super().supply_on_sale
+ return bool(supply_on_sale
+ or (self.moves and all(m.from_location.type == 'drop'
+ for m in self.moves)))
+
+ @property
+ def supply_on_sale_drop_move(self):
+ "Return True if the sale line can have drop move"
+ if not self.supply_on_sale:
+ return False
+ if self.purchase_request and not self.purchase_request.customer:
+ return False
+ if self.supply_state == 'cancelled':
+ return False
+ if self.purchase_request:
+ purchase_line = self.purchase_request.purchase_line
+ if purchase_line and purchase_line.move_done:
+ return False
+ return True
+
+ def get_move(self, shipment_type):
+ result = super().get_move(shipment_type)
+ if (shipment_type == 'out'
+ and not Transaction().context.get('_drop_shipment')):
+ if self.supply_on_sale_drop_move:
+ return
+ return result
+
+ def get_purchase_request(self):
+ request = super().get_purchase_request()
+ if request and request.party:
+ if self.product and self.product.type in ('goods', 'assets'):
+ product_supplier = request.find_best_product_supplier(
+ self.product, self.shipping_date,
+ **self._get_purchase_request_product_supplier_pattern())
+ if product_supplier.drop_shipment:
+ request.customer = (
+ self.sale.shipment_party or self.sale.party)
+ request.delivery_address = self.sale.shipment_address
+ return request
+
+ def get_drop_moves(self):
+ if (self.type != 'line'
+ or not self.product):
+ return []
+ moves = []
+ if self.supply_on_sale_drop_move:
+ move = self.get_move('out')
+ if move is not None:
+ move.from_location = self.sale.drop_location
+ moves.append(move)
+ return moves
diff --git a/modules/sale_supply_drop_shipment/sale.xml b/modules/sale_supply_drop_shipment/sale.xml
new file mode 100644
index 0000000000..d5409a6923
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/sale.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ sale.sale
+
+ sale_form
+
+
+
+ sale.configuration
+
+ sale_configuration_form
+
+
+
+ Drop Shipments
+ stock.shipment.drop
+
+
+
+ form_relate
+ sale.sale,-1
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/setup.py b/modules/sale_supply_drop_shipment/setup.py
new file mode 100755
index 0000000000..4047bdfee0
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/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 find_packages, setup
+
+
+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_sale_supply_drop_shipment'
+
+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 for sale supply drop shipment',
+ 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/sale_supply_drop_shipment'),
+ },
+ keywords='tryton sale supply drop shipment',
+ package_dir={'trytond.modules.sale_supply_drop_shipment': '.'},
+ packages=(
+ ['trytond.modules.sale_supply_drop_shipment']
+ + ['trytond.modules.sale_supply_drop_shipment.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.sale_supply_drop_shipment': (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',
+ '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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ 'Topic :: Office/Business :: Financial :: Accounting',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ sale_supply_drop_shipment = trytond.modules.sale_supply_drop_shipment
+ """,
+ )
diff --git a/modules/sale_supply_drop_shipment/stock.py b/modules/sale_supply_drop_shipment/stock.py
new file mode 100644
index 0000000000..4de6cb4a77
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/stock.py
@@ -0,0 +1,700 @@
+# 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 itertools import groupby
+
+from sql import Column
+from sql.aggregate import Count
+from sql.conditionals import Coalesce
+from sql.functions import CharLength
+from sql.operators import Concat
+
+from trytond import backend
+from trytond.i18n import gettext
+from trytond.model import Index, ModelSQL, ModelView, Workflow, fields
+from trytond.model.exceptions import AccessError
+from trytond.modules.product import round_price
+from trytond.modules.purchase.stock import process_purchase
+from trytond.modules.sale.stock import process_sale
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Eval, Id, If
+from trytond.tools import cursor_dict, grouped_slice
+from trytond.transaction import Transaction
+
+
+class Configuration(metaclass=PoolMeta):
+ __name__ = 'stock.configuration'
+
+ shipment_drop_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Drop Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in',
+ [Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('sale_supply_drop_shipment',
+ 'sequence_type_shipment_drop')),
+ ]))
+
+ @classmethod
+ def multivalue_model(cls, field):
+ pool = Pool()
+ if field == 'shipment_drop_sequence':
+ return pool.get('stock.configuration.sequence')
+ return super(Configuration, cls).multivalue_model(field)
+
+ @classmethod
+ def default_shipment_drop_sequence(cls, **pattern):
+ return cls.multivalue_model(
+ 'shipment_drop_sequence').default_shipment_drop_sequence()
+
+
+class ConfigurationSequence(metaclass=PoolMeta):
+ __name__ = 'stock.configuration.sequence'
+ shipment_drop_sequence = fields.Many2One(
+ 'ir.sequence', "Drop Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('sale_supply_drop_shipment',
+ 'sequence_type_shipment_drop')),
+ ])
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+ if exist:
+ table = cls.__table_handler__(module_name)
+ exist &= table.column_exist('shipment_drop_sequence')
+
+ 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('shipment_drop_sequence')
+ value_names.append('shipment_drop_sequence')
+ super(ConfigurationSequence, cls)._migrate_property(
+ field_names, value_names, fields)
+
+ @classmethod
+ def default_shipment_drop_sequence(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id(
+ 'sale_supply_drop_shipment', 'sequence_shipment_drop')
+ except KeyError:
+ return None
+
+
+class ShipmentDrop(Workflow, ModelSQL, ModelView):
+ "Drop Shipment"
+ __name__ = 'stock.shipment.drop'
+ _rec_name = 'number'
+ effective_date = fields.Date(
+ "Effective Date",
+ states={
+ 'readonly': Eval('state').in_(['cancelled', 'done']),
+ },
+ help="When the stock was actually sent.")
+ planned_date = fields.Date('Planned Date', states={
+ 'readonly': Eval('state') != 'draft',
+ })
+ company = fields.Many2One('company.company', 'Company', required=True,
+ states={
+ 'readonly': Eval('state') != 'draft',
+ })
+ reference = fields.Char(
+ "Reference",
+ states={
+ 'readonly': Eval('state') != 'draft',
+ })
+ supplier = fields.Many2One('party.party', 'Supplier', required=True,
+ states={
+ 'readonly': (((Eval('state') != 'draft')
+ | Eval('supplier_moves', [0]))
+ & Eval('supplier')),
+ },
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'})
+ contact_address = fields.Many2One('party.address', 'Contact Address',
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ domain=[('party', '=', Eval('supplier'))])
+ customer = fields.Many2One('party.party', 'Customer', required=True,
+ states={
+ 'readonly': (((Eval('state') != 'draft')
+ | Eval('customer_moves', [0]))
+ & Eval('customer')),
+ },
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'})
+ delivery_address = fields.Many2One('party.address', 'Delivery Address',
+ required=True,
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ domain=[('party', '=', Eval('customer'))])
+ moves = fields.One2Many('stock.move', 'shipment', 'Moves',
+ domain=[
+ ('company', '=', Eval('company')),
+ ['OR',
+ [
+ ('from_location.type', '=', 'supplier'),
+ ('to_location.type', '=', 'drop'),
+ ],
+ [
+ ('from_location.type', '=', 'drop'),
+ ('to_location.type', '=', 'customer'),
+ ],
+ ],
+ ],
+ readonly=True)
+ supplier_moves = fields.One2Many('stock.move', 'shipment',
+ 'Supplier Moves',
+ filter=[('to_location.type', '=', 'drop')],
+ states={
+ 'readonly': Eval('state').in_(['shipped', 'done', 'cancelled']),
+ },
+ depends={'supplier'})
+ customer_moves = fields.One2Many('stock.move', 'shipment',
+ 'Customer Moves',
+ filter=[('from_location.type', '=', 'drop')],
+ states={
+ 'readonly': Eval('state') != 'shipped',
+ },
+ depends={'customer'})
+ number = fields.Char(
+ "Number", readonly=True,
+ help="The main identifier for the shipment.")
+ state = fields.Selection([
+ ('draft', 'Draft'),
+ ('waiting', 'Waiting'),
+ ('shipped', 'Shipped'),
+ ('done', 'Done'),
+ ('cancelled', 'Cancelled'),
+ ], "State", readonly=True, sort=False)
+
+ @classmethod
+ def __register__(cls, module_name):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ PurchaseLine = pool.get('purchase.line')
+ PurchaseRequest = pool.get('purchase.request')
+ SaleLine = pool.get('sale.line')
+ Location = pool.get('stock.location')
+ table = cls.__table__()
+ move = Move.__table__()
+ purchase_line = PurchaseLine.__table__()
+ purchase_request = PurchaseRequest.__table__()
+ sale_line = SaleLine.__table__()
+ location = Location.__table__()
+ cursor = Transaction().connection.cursor()
+
+ table_h = cls.__table_handler__(module_name)
+ # Migration from 5.8: rename code into number
+ if table_h.column_exist('code'):
+ table_h.column_rename('code', 'number')
+
+ super(ShipmentDrop, cls).__register__(module_name)
+
+ # Migration from 3.6
+ cursor.execute(*location.select(Count(location.id),
+ where=(location.type == 'drop')))
+ has_drop_shipment, = cursor.fetchone()
+
+ if not has_drop_shipment:
+ drop_shipment = Location(name='Migration Drop Shipment',
+ type='drop', active=False)
+ drop_shipment.save()
+ drop_shipment_location = drop_shipment.id
+
+ move_sale_query = move.join(purchase_line,
+ condition=move.origin == Concat('purchase.line,',
+ purchase_line.id)
+ ).join(purchase_request,
+ condition=purchase_request.purchase_line == purchase_line.id
+ ).join(sale_line,
+ condition=sale_line.purchase_request == purchase_request.id
+ ).select(
+ move.id, move.to_location, sale_line.id,
+ where=move.shipment.like('stock.shipment.drop,%'))
+ cursor.execute(*move_sale_query)
+ move_sales = cursor.fetchall()
+
+ for sub_move in grouped_slice(move_sales):
+ sub_ids = [s[0] for s in sub_move]
+ cursor.execute(*move.update(
+ columns=[move.to_location],
+ values=[drop_shipment_location],
+ where=move.id.in_(sub_ids)))
+
+ cursor.execute(*move.select(limit=1))
+ moves = list(cursor_dict(cursor))
+ if moves:
+ move_columns = moves[0].keys()
+ columns = [Column(move, c) for c in move_columns if c != 'id']
+ create_move = move.insert(
+ columns=columns, values=move.select(
+ *columns,
+ where=move.shipment.like('stock.shipment.drop,%')))
+ cursor.execute(*create_move)
+
+ for move_id, customer_location, line_id in move_sales:
+ cursor.execute(*move.update(
+ columns=[move.origin, move.from_location,
+ move.to_location],
+ values=[Concat('sale.line,', str(line_id)),
+ drop_shipment_location, customer_location],
+ where=(move.id == move_id)))
+
+ # Migration from 5.6: rename state cancel to cancelled
+ cursor.execute(*table.update(
+ [table.state], ['cancelled'],
+ where=table.state == 'cancel'))
+
+ @classmethod
+ def __setup__(cls):
+ cls.number.search_unaccented = False
+ cls.reference.search_unaccented = False
+ super(ShipmentDrop, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.update({
+ Index(t, (t.reference, Index.Similarity())),
+ Index(
+ t, (t.state, Index.Equality()),
+ where=t.state.in_(['draft', 'waiting', 'shipped'])),
+ })
+ cls._order = [
+ ('effective_date', 'ASC NULLS LAST'),
+ ('id', 'DESC'),
+ ]
+ cls._transitions |= set((
+ ('draft', 'waiting'),
+ ('waiting', 'shipped'),
+ ('draft', 'cancelled'),
+ ('waiting', 'cancelled'),
+ ('waiting', 'draft'),
+ ('cancelled', 'draft'),
+ ('shipped', 'done'),
+ ('shipped', 'cancelled'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': Eval('state').in_(['cancelled', 'done']),
+ 'depends': ['state'],
+ },
+ 'draft': {
+ 'invisible': ~Eval('state').in_(['cancelled', 'draft',
+ 'waiting']),
+ 'icon': If(Eval('state') == 'cancelled',
+ 'tryton-undo', 'tryton-back'),
+ 'depends': ['state'],
+ },
+ 'wait': {
+ 'invisible': Eval('state') != 'draft',
+ 'depends': ['state'],
+ },
+ 'ship': {
+ 'invisible': Eval('state') != 'waiting',
+ 'depends': ['state'],
+ },
+ 'done': {
+ 'invisible': Eval('state') != 'shipped',
+ 'depends': ['state'],
+ },
+ })
+
+ @classmethod
+ def order_number(cls, tables):
+ table, _ = tables[None]
+ return [CharLength(table.number), table.number]
+
+ @classmethod
+ def order_effective_date(cls, tables):
+ table, _ = tables[None]
+ return [Coalesce(table.effective_date, table.planned_date)]
+
+ @staticmethod
+ def default_state():
+ return 'draft'
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @fields.depends('supplier')
+ def on_change_supplier(self):
+ if self.supplier:
+ self.contact_address = self.supplier.address_get()
+ else:
+ self.contact_address = None
+
+ @fields.depends('customer')
+ def on_change_customer(self):
+ if self.customer:
+ self.delivery_address = self.customer.address_get(type='delivery')
+ else:
+ self.delivery_address = None
+
+ def _get_move_planned_date(self):
+ '''
+ Return the planned date for moves
+ '''
+ return self.planned_date
+
+ @classmethod
+ def _set_move_planned_date(cls, shipments):
+ '''
+ Set planned date of moves for the shipments
+ '''
+ Move = Pool().get('stock.move')
+ to_write = []
+ for shipment in shipments:
+ planned_date = shipment._get_move_planned_date()
+ to_write.extend(([m for m in shipment.moves
+ if m.state not in ('assigned', 'done', 'cancelled')
+ ], {
+ 'planned_date': planned_date,
+ }))
+ if to_write:
+ Move.write(*to_write)
+
+ @classmethod
+ def create(cls, vlist):
+ pool = Pool()
+ Config = pool.get('stock.configuration')
+
+ vlist = [x.copy() for x in vlist]
+ config = Config(1)
+ default_company = cls.default_company()
+ for values in vlist:
+ values['number'] = config.get_multivalue(
+ 'shipment_drop_sequence',
+ company=values.get('company', default_company)).get()
+ shipments = super(ShipmentDrop, cls).create(vlist)
+ cls._set_move_planned_date(shipments)
+ return shipments
+
+ @classmethod
+ def write(cls, *args):
+ super(ShipmentDrop, cls).write(*args)
+ cls._set_move_planned_date(sum(args[::2], []))
+
+ @classmethod
+ def copy(cls, shipments, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('moves', None)
+ default.setdefault('supplier_moves', None)
+ default.setdefault('customer_moves', None)
+ return super(ShipmentDrop, cls).copy(shipments, default=default)
+
+ @classmethod
+ def delete(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+
+ cls.cancel(shipments)
+ for shipment in shipments:
+ if shipment.state != 'cancelled':
+ raise AccessError(
+ gettext('sale_supply_drop_shipment'
+ '.msg_drop_shipment_delete_cancel') % {
+ 'shipment': shipment.rec_name,
+ })
+ Move.delete([m for s in shipments for m in s.supplier_moves])
+ super(ShipmentDrop, cls).delete(shipments)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ @process_sale('customer_moves')
+ @process_purchase('supplier_moves')
+ def cancel(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.cancel([m for s in shipments for m in s.supplier_moves])
+ Move.cancel([m for s in shipments for m in s.customer_moves
+ if s.state == 'shipped'])
+ Move.write([m for s in shipments for m in s.customer_moves
+ if s.state != 'shipped'], {
+ 'shipment': None,
+ 'origin_drop': None,
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ PurchaseLine = pool.get('purchase.line')
+ SaleLine = pool.get('sale.line')
+ for shipment in shipments:
+ for move in shipment.moves:
+ if (move.state == 'cancelled'
+ and isinstance(move.origin, (PurchaseLine, SaleLine))):
+ raise AccessError(
+ gettext('sale_supply_drop_shipment.msg_reset_move',
+ move=move.rec_name))
+ Move.draft([m for s in shipments for m in s.moves
+ if m.state != 'staging'])
+
+ @classmethod
+ def _synchronize_moves(cls, shipments):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Move = pool.get('stock.move')
+
+ def active(move):
+ return move.state != 'cancelled'
+
+ moves = []
+ for shipment in shipments:
+ customer_moves = {m: m for m in shipment.customer_moves}
+ supplier_qty = defaultdict(lambda: defaultdict(int))
+
+ for move in filter(active, shipment.customer_moves):
+ key = shipment._sync_move_key(move)
+ supplier_qty[move][key] = 0
+ for move in filter(active, shipment.supplier_moves):
+ key = shipment._sync_move_key(move)
+ qty_default_uom = Uom.compute_qty(
+ move.uom, move.quantity,
+ move.product.default_uom, round=False)
+ for customer_move in move.moves_drop:
+ customer_move = customer_moves.get(customer_move)
+ if customer_move.uom.category != move.uom.category:
+ continue
+ c_qty_default_uom = Uom.compute_qty(
+ customer_move.uom, customer_move.quantity,
+ customer_move.product.default_uom, round=False)
+ qty = min(qty_default_uom, c_qty_default_uom)
+ supplier_qty[customer_move][key] += qty
+ qty_default_uom -= qty
+ if qty_default_uom <= 0:
+ break
+ else:
+ supplier_qty[None][key] += qty_default_uom
+
+ for customer_move in supplier_qty:
+ if customer_move:
+ customer_key = shipment._sync_move_key(customer_move)
+ for key, qty in supplier_qty[customer_move].items():
+ if customer_move and key == customer_key:
+ move = customer_move
+ else:
+ move = shipment._sync_customer_move(customer_move)
+ for name, value in key:
+ setattr(move, name, value)
+ qty = Uom.compute_qty(
+ move.product.default_uom, qty, move.uom)
+ if move.quantity != qty:
+ move.quantity = qty
+ moves.append(move)
+ Move.save(moves)
+
+ def _sync_move_key(self, move):
+ return (
+ ('product', move.product),
+ ('uom', move.uom),
+ )
+
+ def _sync_customer_move(self, template=None):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Purchase = pool.get('purchase.purchase')
+ move = Move(
+ from_location=Purchase.default_drop_location(),
+ to_location=self.customer.customer_location,
+ quantity=0,
+ shipment=self,
+ planned_date=self.planned_date,
+ company=self.company,
+ )
+ if template:
+ move.from_location = template.from_location
+ move.to_location = template.to_location
+ move.origin = template.origin
+ move.origin_drop = template.origin_drop
+ if move.on_change_with_unit_price_required():
+ if template:
+ move.unit_price = template.unit_price
+ move.currency = template.currency
+ else:
+ move.unit_price = 0
+ move.currency = self.company.currency
+ return move
+
+ @classmethod
+ def set_cost(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ UoM = pool.get('product.uom')
+
+ to_save = []
+ for shipment in shipments:
+ product_cost = defaultdict(int)
+ s_product_qty = defaultdict(int)
+ for s_move in shipment.supplier_moves:
+ if s_move.state == 'cancelled':
+ continue
+ internal_quantity = Decimal(str(s_move.internal_quantity))
+ product_cost[s_move.product] += (
+ s_move.get_cost_price() * internal_quantity)
+
+ quantity = UoM.compute_qty(
+ s_move.uom, s_move.quantity, s_move.product.default_uom,
+ round=False)
+ s_product_qty[s_move.product] += quantity
+
+ for product, cost in product_cost.items():
+ qty = Decimal(str(s_product_qty[product]))
+ if qty:
+ product_cost[product] = round_price(cost / qty)
+
+ for move in shipment.moves:
+ cost_price = product_cost[move.product]
+ if cost_price != move.cost_price:
+ move.cost_price = cost_price
+ to_save.append(move)
+ if to_save:
+ Move.save(to_save)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('waiting')
+ def wait(cls, shipments):
+ pool = Pool()
+ PurchaseRequest = pool.get('purchase.request')
+ SaleLine = pool.get('sale.line')
+ Move = pool.get('stock.move')
+
+ requests = []
+ for sub_lines in grouped_slice([m.origin.id for s in shipments
+ for m in s.supplier_moves if m.origin]):
+ requests += PurchaseRequest.search([
+ ('purchase_line', 'in', list(sub_lines)),
+ ])
+ pline2requests = defaultdict(list)
+ for request in requests:
+ pline2requests[request.purchase_line].append(request)
+ sale_lines = []
+ for sub_requests in grouped_slice([r.id for r in requests]):
+ sale_lines += SaleLine.search([
+ ('purchase_request', 'in', list(sub_requests)),
+ ])
+ request2slines = defaultdict(list)
+ for sale_line in sale_lines:
+ request2slines[sale_line.purchase_request].append(sale_line)
+
+ to_save = []
+ for shipment in shipments:
+ for s_move in shipment.supplier_moves:
+ if not s_move.origin:
+ continue
+ for request in pline2requests[s_move.origin]:
+ for sale_line in request2slines[request]:
+ for c_move in sale_line.moves:
+ if (c_move.state not in ('cancelled', 'done')
+ and not c_move.shipment
+ and c_move.from_location.type == 'drop'):
+ c_move.shipment = shipment
+ c_move.origin_drop = s_move
+ to_save.append(c_move)
+ Move.save(to_save)
+ Move.draft(to_save)
+ cls._synchronize_moves(shipments)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('shipped')
+ @process_sale('customer_moves')
+ @process_purchase('supplier_moves')
+ def ship(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Move.do([m for s in shipments for m in s.supplier_moves])
+ cls._synchronize_moves(shipments)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @process_sale('customer_moves')
+ def done(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ cls.set_cost(shipments)
+ Move.delete([
+ m for s in shipments for m in s.customer_moves
+ if not m.quantity])
+ Move.do([m for s in shipments for m in s.customer_moves])
+ for company, shipments in groupby(shipments, key=lambda s: s.company):
+ with Transaction().set_context(company=company.id):
+ today = Date.today()
+ cls.write([s for s in shipments if not s.effective_date], {
+ 'effective_date': today,
+ })
+
+
+class Move(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+
+ origin_drop = fields.Many2One(
+ 'stock.move', "Drop Origin", readonly=True,
+ domain=[
+ ('shipment', '=', Eval('shipment', -1)),
+ ],
+ states={
+ 'invisible': ~Eval('origin_drop'),
+ })
+ moves_drop = fields.One2Many(
+ 'stock.move', 'origin_drop', "Drop Moves", readonly=True,
+ states={
+ 'invisible': ~Eval('drop_moves'),
+ })
+ customer_drop = fields.Function(fields.Many2One(
+ 'party.party', "Drop Customer",
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'}),
+ 'get_customer_drop',
+ searcher='search_customer_drop')
+
+ @classmethod
+ def _get_shipment(cls):
+ models = super(Move, cls)._get_shipment()
+ models.append('stock.shipment.drop')
+ return models
+
+ def get_customer_drop(self, name):
+ pool = Pool()
+ SaleLine = pool.get('sale.line')
+ PurchaseLine = pool.get('purchase.line')
+
+ if isinstance(self.origin, SaleLine):
+ return self.origin.sale.party.id
+ elif isinstance(self.origin, PurchaseLine):
+ if self.origin.purchase.customer:
+ return self.origin.purchase.customer.id
+
+ @classmethod
+ def search_customer_drop(cls, name, clause):
+ return ['OR',
+ ('origin.sale.party' + clause[0].lstrip(name),)
+ + tuple(clause[1:3]) + ('sale.line',) + tuple(clause[3:]),
+ ('origin.purchase.customer' + clause[0].lstrip(name),)
+ + tuple(clause[1:3]) + ('purchase.line',) + tuple(clause[3:]),
+ ]
diff --git a/modules/sale_supply_drop_shipment/stock.xml b/modules/sale_supply_drop_shipment/stock.xml
new file mode 100644
index 0000000000..61e6b6e51d
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/stock.xml
@@ -0,0 +1,305 @@
+
+
+
+
+
+ tryton-shipment-drop
+ icons/tryton-shipment-drop.svg
+
+
+
+ stock.configuration
+
+ stock_configuration_form
+
+
+
+ Drop Shipment
+
+
+
+
+
+
+
+
+
+
+
+ Drop Shipment
+
+
+
+
+ stock.shipment.drop
+ form
+ shipment_drop_form
+
+
+
+ stock.shipment.drop
+ tree
+ shipment_drop_tree
+
+
+
+ Drop Shipments
+ stock.shipment.drop
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+
+ Waiting
+
+
+
+
+
+
+ Shipped
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+
+
+
+
+
+
+
+
+ draft
+ Draft
+
+
+
+
+
+
+
+
+ wait
+ Wait
+
+
+
+
+
+
+
+
+ done
+ Done
+ Are you sure you want to complete the shipment?
+
+
+
+
+
+
+
+
+ ship
+ Ship
+ Are you sure you want to ship the shipment?
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+ Drop Shipments
+ stock.shipment.drop
+
+
+
+
+ form_relate
+ party.party,-1
+
+
+
+
+
+
+
+
+ Sales
+ sale.sale
+
+
+
+
+
+
+
+
+
+
+
+
+
+ form_relate
+ stock.shipment.drop,-1
+
+
+
+
+ Purchases
+ purchase.purchase
+
+
+
+
+
+
+
+
+
+
+
+
+
+ form_relate
+ stock.shipment.drop,-1
+
+
+
+
+ stock.move
+
+ stock_move_form
+
+
+
+
+
+
+
+ Drop
+ DROP
+ drop
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/tests/__init__.py b/modules/sale_supply_drop_shipment/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/sale_supply_drop_shipment/tests/scenario_sale_supply_drop_shipment.rst b/modules/sale_supply_drop_shipment/tests/scenario_sale_supply_drop_shipment.rst
new file mode 100644
index 0000000000..369544bdca
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/tests/scenario_sale_supply_drop_shipment.rst
@@ -0,0 +1,377 @@
+==================================
+Sale Supply Drop Shipment 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_fiscalyear, \
+ ... create_chart, get_accounts
+ >>> from trytond.modules.account_invoice.tests.tools import \
+ ... set_fiscalyear_invoice_sequences, create_payment_term
+ >>> today = datetime.date.today()
+
+Activate modules::
+
+ >>> config = activate_modules([
+ ... 'sale_supply_drop_shipment',
+ ... 'sale',
+ ... 'purchase',
+ ... ])
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create sale user::
+
+ >>> User = Model.get('res.user')
+ >>> Group = Model.get('res.group')
+ >>> sale_user = User()
+ >>> sale_user.name = 'Sale'
+ >>> sale_user.login = 'sale'
+ >>> sale_group, = Group.find([('name', '=', 'Sales')])
+ >>> sale_user.groups.append(sale_group)
+ >>> sale_user.save()
+
+Create purchase user::
+
+ >>> purchase_user = User()
+ >>> purchase_user.name = 'Purchase'
+ >>> purchase_user.login = 'purchase'
+ >>> purchase_group, = Group.find([('name', '=', 'Purchase')])
+ >>> purchase_user.groups.append(purchase_group)
+ >>> purchase_request_group, = Group.find(
+ ... [('name', '=', 'Purchase Request')])
+ >>> purchase_user.groups.append(purchase_request_group)
+ >>> purchase_user.save()
+
+Create stock user::
+
+ >>> stock_user = User()
+ >>> stock_user.name = 'Stock'
+ >>> stock_user.login = 'stock'
+ >>> stock_group, = Group.find([('name', '=', 'Stock')])
+ >>> stock_force_group, = Group.find([
+ ... ('name', '=', 'Stock Force Assignment'),
+ ... ])
+ >>> product_admin_group, = Group.find([
+ ... ('name', '=', "Product Administration"),
+ ... ])
+ >>> stock_user.groups.append(stock_group)
+ >>> stock_user.groups.append(stock_force_group)
+ >>> stock_user.groups.append(product_admin_group)
+ >>> stock_user.save()
+
+Create account user::
+
+ >>> account_user = User()
+ >>> account_user.name = "Account"
+ >>> account_user.login = 'account'
+ >>> account_group, = Group.find([('name', '=', "Account")])
+ >>> account_user.groups.append(account_group)
+ >>> account_user.save()
+
+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)
+ >>> revenue = accounts['revenue']
+ >>> expense = accounts['expense']
+
+Create parties::
+
+ >>> Party = Model.get('party.party')
+ >>> supplier = Party(name='Supplier')
+ >>> supplier.save()
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_expense = expense
+ >>> account_category.account_revenue = revenue
+ >>> account_category.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductSupplier = Model.get('purchase.product_supplier')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.purchasable = True
+ >>> template.salable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.supply_on_sale = True
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+ >>> product.cost_price = Decimal('4')
+ >>> product.save()
+ >>> product_supplier = ProductSupplier()
+ >>> product_supplier.template = template
+ >>> product_supplier.party = supplier
+ >>> product_supplier.drop_shipment = True
+ >>> product_supplier.lead_time = datetime.timedelta(0)
+ >>> product_supplier.save()
+
+Create payment term::
+
+ >>> payment_term = create_payment_term()
+ >>> payment_term.save()
+
+Sale 250 products::
+
+ >>> set_user(sale_user)
+ >>> Sale = Model.get('sale.sale')
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.payment_term = payment_term
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = product
+ >>> sale_line.quantity = 250
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.state
+ 'processing'
+ >>> sale.shipments
+ []
+ >>> sale.drop_shipments
+ []
+
+Create Purchase from Request::
+
+ >>> set_user(purchase_user)
+ >>> Purchase = Model.get('purchase.purchase')
+ >>> PurchaseRequest = Model.get('purchase.request')
+ >>> purchase_request, = PurchaseRequest.find()
+ >>> purchase_request.quantity
+ 250.0
+ >>> create_purchase = Wizard('purchase.request.create_purchase',
+ ... [purchase_request])
+ >>> purchase, = Purchase.find()
+ >>> purchase.customer == customer
+ True
+ >>> purchase.delivery_address == sale.shipment_address
+ True
+ >>> purchase.payment_term = payment_term
+ >>> purchase_line, = purchase.lines
+ >>> purchase_line.unit_price = Decimal('3.0000')
+ >>> purchase.click('quote')
+ >>> purchase.click('confirm')
+ >>> purchase.state
+ 'processing'
+
+ >>> set_user(sale_user)
+ >>> sale.reload()
+ >>> sale.shipments
+ []
+ >>> shipment, = sale.drop_shipments
+
+Receiving only 100 products::
+
+ >>> set_user(stock_user)
+ >>> move, = shipment.supplier_moves
+ >>> move.quantity = 100
+ >>> move.unit_price
+ Decimal('3.0000')
+ >>> move.cost_price
+ Decimal('3.0000')
+ >>> shipment.click('ship')
+ >>> move, = shipment.customer_moves
+ >>> move.unit_price
+ Decimal('10.0000')
+ >>> move.cost_price
+ >>> set_user(sale_user)
+ >>> sale.reload()
+ >>> sale.shipments
+ []
+ >>> len(sale.drop_shipments)
+ 2
+ >>> shipment, = [s for s in sale.drop_shipments
+ ... if s.state == 'shipped']
+
+ >>> set_user(stock_user)
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+ >>> move, = shipment.customer_moves
+ >>> move.cost_price
+ Decimal('3.0000')
+ >>> set_user(sale_user)
+ >>> sale.reload()
+ >>> sale.shipments
+ []
+ >>> len(sale.drop_shipments)
+ 2
+
+The purchase is now waiting for his new drop shipment::
+
+ >>> set_user(purchase_user)
+ >>> purchase.reload()
+ >>> purchase.shipment_state
+ 'waiting'
+ >>> len(purchase.drop_shipments)
+ 2
+ >>> shipment, = [s for s in purchase.drop_shipments
+ ... if s.state == 'waiting']
+ >>> move, = shipment.customer_moves
+ >>> move.quantity
+ 150.0
+ >>> move, = shipment.supplier_moves
+ >>> move.quantity
+ 150.0
+
+Let's cancel the shipment and handle the issue on the purchase.
+As a consequence the sale order is now in exception::
+
+ >>> set_user(stock_user)
+ >>> shipment.click('cancel')
+
+ >>> set_user(purchase_user)
+ >>> purchase.reload()
+ >>> purchase.shipment_state
+ 'exception'
+ >>> handle_exception = Wizard('purchase.handle.shipment.exception',
+ ... [purchase])
+ >>> _ = handle_exception.form.recreate_moves.pop()
+ >>> handle_exception.execute('handle')
+ >>> purchase.reload()
+ >>> purchase.shipment_state
+ 'received'
+
+ >>> set_user(sale_user)
+ >>> sale.reload()
+ >>> sale.shipment_state
+ 'exception'
+
+Receive purchase invoice at different price::
+
+ >>> set_user(account_user)
+ >>> invoice, = purchase.invoices
+ >>> invoice_line, = invoice.lines
+ >>> invoice_line.unit_price = Decimal('4.0000')
+ >>> invoice.invoice_date = today
+ >>> invoice.click('post')
+
+ >>> set_user(stock_user)
+
+ >>> recompute = Wizard('product.recompute_cost_price', [product])
+ >>> recompute.execute('recompute')
+
+ >>> shipment, = [s for s in purchase.drop_shipments
+ ... if s.state == 'done']
+ >>> move, = shipment.supplier_moves
+ >>> move.cost_price
+ Decimal('4.0000')
+ >>> move, = shipment.customer_moves
+ >>> move.cost_price
+ Decimal('4.0000')
+
+Cancelling the workflow on the purchase step::
+
+ >>> set_user(sale_user)
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.payment_term = payment_term
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = product
+ >>> sale_line.quantity = 125
+ >>> sale.save()
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.state
+ 'processing'
+ >>> sale.shipments
+ []
+ >>> sale.drop_shipments
+ []
+
+ >>> set_user(purchase_user)
+ >>> purchase_request, = PurchaseRequest.find([('purchase_line', '=', None)])
+ >>> purchase_request.quantity
+ 125.0
+ >>> create_purchase = Wizard('purchase.request.create_purchase',
+ ... [purchase_request])
+ >>> purchase, = Purchase.find([('state', '=', 'draft')])
+ >>> purchase.click('cancel')
+ >>> purchase_request.state
+ 'exception'
+
+Let's reset the purchase request and create a new purchase::
+
+ >>> handle_exception = Wizard(
+ ... 'purchase.request.handle.purchase.cancellation',
+ ... [purchase_request])
+ >>> handle_exception.execute('reset')
+ >>> purchase_request.state
+ 'draft'
+
+ >>> create_purchase = Wizard('purchase.request.create_purchase',
+ ... [purchase_request])
+ >>> purchase, = Purchase.find([('state', '=', 'draft')])
+ >>> purchase_request.state
+ 'purchased'
+
+Let's cancel it again and cancel the request in order to manage the process on
+the sale::
+
+ >>> purchase.click('cancel')
+ >>> purchase_request.reload()
+ >>> purchase_request.state
+ 'exception'
+ >>> handle_exception = Wizard(
+ ... 'purchase.request.handle.purchase.cancellation',
+ ... [purchase_request])
+ >>> handle_exception.execute('cancel_request')
+ >>> purchase_request.state
+ 'cancelled'
+
+The sale is then in exception::
+
+ >>> set_user(sale_user)
+ >>> sale.reload()
+ >>> sale.shipment_state
+ 'exception'
+ >>> handle_exception = Wizard('sale.handle.shipment.exception', [sale])
+ >>> handle_exception.execute('handle')
+ >>> sale.reload()
+ >>> sale.shipment_state
+ 'waiting'
+
+The sale just created a new outgoing shipment for the sale and we can deliver
+from stock::
+
+ >>> shipment, = sale.shipments
+
+ >>> set_user(stock_user)
+ >>> shipment.click('assign_force')
+ >>> shipment.click('pick')
+ >>> shipment.click('pack')
+ >>> shipment.click('done')
+
+ >>> set_user(sale_user)
+ >>> sale.reload()
+ >>> sale.shipment_state
+ 'sent'
diff --git a/modules/sale_supply_drop_shipment/tests/scenario_sale_supply_drop_shipment_on_invoice.rst b/modules/sale_supply_drop_shipment/tests/scenario_sale_supply_drop_shipment_on_invoice.rst
new file mode 100644
index 0000000000..d836c8451d
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/tests/scenario_sale_supply_drop_shipment_on_invoice.rst
@@ -0,0 +1,150 @@
+=============================================
+Sale Supply Drop Shipment on Invoice Scenario
+=============================================
+
+Imports::
+
+ >>> import datetime
+ >>> 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, create_payment_term
+
+Activate modules::
+
+ >>> config = activate_modules('sale_supply_drop_shipment')
+
+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)
+
+ >>> Journal = Model.get('account.journal')
+ >>> PaymentMethod = Model.get('account.invoice.payment.method')
+ >>> cash_journal, = Journal.find([('type', '=', 'cash')])
+ >>> cash_journal.save()
+ >>> payment_method = PaymentMethod()
+ >>> payment_method.name = 'Cash'
+ >>> payment_method.journal = cash_journal
+ >>> payment_method.credit_account = accounts['cash']
+ >>> payment_method.debit_account = accounts['cash']
+ >>> payment_method.save()
+
+Create parties::
+
+ >>> Party = Model.get('party.party')
+ >>> supplier = Party(name='Supplier')
+ >>> supplier.save()
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create account category::
+
+ >>> 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 product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductSupplier = Model.get('purchase.product_supplier')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.purchasable = True
+ >>> template.salable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.supply_on_sale = True
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+ >>> product_supplier = ProductSupplier()
+ >>> product_supplier.template = template
+ >>> product_supplier.party = supplier
+ >>> product_supplier.drop_shipment = True
+ >>> product_supplier.lead_time = datetime.timedelta(0)
+ >>> product_supplier.save()
+
+Sale 5 products with shipment method on invoice::
+
+ >>> Sale = Model.get('sale.sale')
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.shipment_method = 'invoice'
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = product
+ >>> sale_line.quantity = 5
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.click('process')
+ >>> sale.state
+ 'processing'
+ >>> len(sale.shipments)
+ 0
+ >>> len(sale.drop_shipments)
+ 0
+ >>> invoice, = sale.invoices
+ >>> sale_line, = sale.lines
+ >>> sale_line.purchase_request
+
+Pay for 3 products::
+
+ >>> invoice_line, = invoice.lines
+ >>> invoice_line.quantity = 3
+ >>> invoice.click('post')
+ >>> pay = Wizard('account.invoice.pay', [invoice])
+ >>> pay.form.payment_method = payment_method
+ >>> pay.execute('choice')
+
+Not yet a purchase request::
+
+ >>> sale.reload()
+ >>> len(sale.shipments)
+ 0
+ >>> len(sale.drop_shipments)
+ 0
+ >>> sale_line.reload()
+ >>> sale_line.purchase_request
+
+Pay for remaining products::
+
+ >>> sale.reload()
+ >>> _, invoice = sale.invoices
+ >>> invoice.click('post')
+ >>> pay = Wizard('account.invoice.pay', [invoice])
+ >>> pay.form.payment_method = payment_method
+ >>> pay.execute('choice')
+
+Check drop shipment::
+
+ >>> sale.reload()
+ >>> sale_line, = sale.lines
+ >>> bool(sale_line.purchase_request)
+ True
+ >>> len(sale.shipments)
+ 0
+ >>> len(sale.drop_shipments)
+ 0
diff --git a/modules/sale_supply_drop_shipment/tests/scenario_sale_supply_drop_shipment_remaining_qty.rst b/modules/sale_supply_drop_shipment/tests/scenario_sale_supply_drop_shipment_remaining_qty.rst
new file mode 100644
index 0000000000..3f1a0ce257
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/tests/scenario_sale_supply_drop_shipment_remaining_qty.rst
@@ -0,0 +1,137 @@
+==================================
+Sale Supply Drop Shipment 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_fiscalyear, \
+ ... create_chart, get_accounts
+ >>> from trytond.modules.account_invoice.tests.tools import \
+ ... set_fiscalyear_invoice_sequences, create_payment_term
+ >>> today = datetime.date.today()
+
+Activate modules::
+
+ >>> config = activate_modules([
+ ... 'sale_supply_drop_shipment',
+ ... 'sale',
+ ... 'purchase',
+ ... ])
+
+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)
+ >>> revenue = accounts['revenue']
+ >>> expense = accounts['expense']
+
+Create parties::
+
+ >>> Party = Model.get('party.party')
+ >>> supplier = Party(name='Supplier')
+ >>> supplier.save()
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_expense = expense
+ >>> account_category.account_revenue = revenue
+ >>> account_category.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductSupplier = Model.get('purchase.product_supplier')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.purchasable = True
+ >>> template.salable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.supply_on_sale = True
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+ >>> product_supplier = ProductSupplier()
+ >>> product_supplier.template = template
+ >>> product_supplier.party = supplier
+ >>> product_supplier.drop_shipment = True
+ >>> product_supplier.lead_time = datetime.timedelta(0)
+ >>> product_supplier.save()
+
+Create payment term::
+
+ >>> payment_term = create_payment_term()
+ >>> payment_term.save()
+
+Sale 250 products::
+
+ >>> Sale = Model.get('sale.sale')
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.payment_term = payment_term
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = product
+ >>> sale_line.quantity = 250
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.click('process')
+
+Create Purchase from Request::
+
+ >>> Purchase = Model.get('purchase.purchase')
+ >>> PurchaseRequest = Model.get('purchase.request')
+ >>> purchase_request, = PurchaseRequest.find()
+ >>> purchase_request.quantity
+ 250.0
+ >>> create_purchase = Wizard('purchase.request.create_purchase',
+ ... [purchase_request])
+ >>> purchase, = Purchase.find()
+ >>> purchase.payment_term = payment_term
+ >>> purchase.click('quote')
+ >>> purchase.click('confirm')
+ >>> purchase.click('process')
+ >>> purchase.state
+ 'processing'
+
+ >>> sale.reload()
+ >>> shipment, = sale.drop_shipments
+
+The supplier sends more than expected::
+
+ >>> move, = shipment.supplier_moves
+ >>> move.quantity = 300
+ >>> shipment.click('ship')
+
+Another move has been created to synchronize supplier and customer quantities::
+
+ >>> len(shipment.customer_moves)
+ 2
+ >>> sum(m.quantity for m in shipment.customer_moves)
+ 300.0
diff --git a/modules/sale_supply_drop_shipment/tests/test_module.py b/modules/sale_supply_drop_shipment/tests/test_module.py
new file mode 100644
index 0000000000..ada7543af8
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/tests/test_module.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.modules.company.tests import (
+ CompanyTestMixin, PartyCompanyCheckEraseMixin)
+from trytond.tests.test_tryton import ModuleTestCase
+
+
+class SaleSupplyDropShipmentTestCase(
+ PartyCompanyCheckEraseMixin, CompanyTestMixin, ModuleTestCase):
+ 'Test SaleSupplyDropShipment module'
+ module = 'sale_supply_drop_shipment'
+
+
+del ModuleTestCase
diff --git a/modules/sale_supply_drop_shipment/tests/test_scenario.py b/modules/sale_supply_drop_shipment/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/sale_supply_drop_shipment/tox.ini b/modules/sale_supply_drop_shipment/tox.ini
new file mode 100644
index 0000000000..0c630a3b84
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/sale_supply_drop_shipment/* -m unittest discover -s tests
+ coverage report --include=./**/sale_supply_drop_shipment/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/sale_supply_drop_shipment/tryton.cfg b/modules/sale_supply_drop_shipment/tryton.cfg
new file mode 100644
index 0000000000..9e9bd7d1fa
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/tryton.cfg
@@ -0,0 +1,17 @@
+[tryton]
+version=6.7.0
+depends:
+ company
+ ir
+ product
+ purchase
+ purchase_request
+ sale
+ sale_supply
+ stock
+xml:
+ stock.xml
+ sale.xml
+ purchase.xml
+ party.xml
+ message.xml
diff --git a/modules/sale_supply_drop_shipment/view/party_form.xml b/modules/sale_supply_drop_shipment/view/party_form.xml
new file mode 100644
index 0000000000..1ff52a4f03
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/party_form.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/product_supplier_form.xml b/modules/sale_supply_drop_shipment/view/product_supplier_form.xml
new file mode 100644
index 0000000000..7de0c1e6e6
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/product_supplier_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/purchase_configuration_form.xml b/modules/sale_supply_drop_shipment/view/purchase_configuration_form.xml
new file mode 100644
index 0000000000..8763dc5a03
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/purchase_configuration_form.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/purchase_form.xml b/modules/sale_supply_drop_shipment/view/purchase_form.xml
new file mode 100644
index 0000000000..8aeba958d4
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/purchase_form.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/purchase_request_form.xml b/modules/sale_supply_drop_shipment/view/purchase_request_form.xml
new file mode 100644
index 0000000000..e60ac5261d
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/purchase_request_form.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/purchase_request_tree.xml b/modules/sale_supply_drop_shipment/view/purchase_request_tree.xml
new file mode 100644
index 0000000000..a02b8340f9
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/purchase_request_tree.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/sale_configuration_form.xml b/modules/sale_supply_drop_shipment/view/sale_configuration_form.xml
new file mode 100644
index 0000000000..214e7f8123
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/sale_configuration_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/sale_form.xml b/modules/sale_supply_drop_shipment/view/sale_form.xml
new file mode 100644
index 0000000000..a791585424
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/sale_form.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/shipment_drop_form.xml b/modules/sale_supply_drop_shipment/view/shipment_drop_form.xml
new file mode 100644
index 0000000000..0931ccd123
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/shipment_drop_form.xml
@@ -0,0 +1,40 @@
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/shipment_drop_tree.xml b/modules/sale_supply_drop_shipment/view/shipment_drop_tree.xml
new file mode 100644
index 0000000000..01b9e6e144
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/shipment_drop_tree.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/stock_configuration_form.xml b/modules/sale_supply_drop_shipment/view/stock_configuration_form.xml
new file mode 100644
index 0000000000..a1423d3c83
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/stock_configuration_form.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_drop_shipment/view/stock_move_form.xml b/modules/sale_supply_drop_shipment/view/stock_move_form.xml
new file mode 100644
index 0000000000..42a813104e
--- /dev/null
+++ b/modules/sale_supply_drop_shipment/view/stock_move_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/sale_supply_production/.drone.yml b/modules/sale_supply_production/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/sale_supply_production/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/sale_supply_production/.flake8 b/modules/sale_supply_production/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/sale_supply_production/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/sale_supply_production/.isort.cfg b/modules/sale_supply_production/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/sale_supply_production/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/sale_supply_production/CHANGELOG b/modules/sale_supply_production/CHANGELOG
new file mode 100644
index 0000000000..bbeb1394a2
--- /dev/null
+++ b/modules/sale_supply_production/CHANGELOG
@@ -0,0 +1,21 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-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
+* Initial release
diff --git a/modules/sale_supply_production/COPYRIGHT b/modules/sale_supply_production/COPYRIGHT
new file mode 100644
index 0000000000..d0b4a3655d
--- /dev/null
+++ b/modules/sale_supply_production/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/sale_supply_production/LICENSE b/modules/sale_supply_production/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/sale_supply_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/sale_supply_production/MANIFEST.in b/modules/sale_supply_production/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/sale_supply_production/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/sale_supply_production/README.rst b/modules/sale_supply_production/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/sale_supply_production/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/sale_supply_production/__init__.py b/modules/sale_supply_production/__init__.py
new file mode 100644
index 0000000000..f2fd74d908
--- /dev/null
+++ b/modules/sale_supply_production/__init__.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.pool import Pool
+
+from . import product, production, sale
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ product.Template,
+ product.Product,
+ production.Production,
+ sale.Sale,
+ sale.Line,
+ module='sale_supply_production', type_='model')
+ Pool.register(
+ module='sale_supply_production', type_='wizard')
+ Pool.register(
+ module='sale_supply_production', type_='report')
diff --git a/modules/sale_supply_production/doc/index.rst b/modules/sale_supply_production/doc/index.rst
new file mode 100644
index 0000000000..8777f63af2
--- /dev/null
+++ b/modules/sale_supply_production/doc/index.rst
@@ -0,0 +1,15 @@
+Sale Supply Production Module
+#############################
+
+The Sale Supply Production module adds a "supply on sale" option to producible
+products.
+If checked, it will generate a production request for each sale line of this
+product regardless of the stock levels. Once the products are produced they are
+assigned to the customer shipments.
+If the production request is cancelled, the sale goes back to the default
+supply method.
+
+.. warning::
+ If the shiment method is *On Invoice Paid*, the production request will be
+ created only when all the invoice lines are paid.
+..
diff --git a/modules/sale_supply_production/locale/bg.po b/modules/sale_supply_production/locale/bg.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/bg.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/ca.po b/modules/sale_supply_production/locale/ca.po
new file mode 100644
index 0000000000..0963821fef
--- /dev/null
+++ b/modules/sale_supply_production/locale/ca.po
@@ -0,0 +1,19 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr "Produccions"
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr "Produccions"
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
+"No podeu restablir la producció \"%(production)s\" a esborrany perquè s'ha "
+"generat a partir d'una venda."
diff --git a/modules/sale_supply_production/locale/cs.po b/modules/sale_supply_production/locale/cs.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/cs.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/de.po b/modules/sale_supply_production/locale/de.po
new file mode 100644
index 0000000000..782113c31b
--- /dev/null
+++ b/modules/sale_supply_production/locale/de.po
@@ -0,0 +1,19 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr "Produktionsaufträge"
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr "Produktionsaufträge"
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
+"Produktionsauftrag \"%(production)s\" kann nicht auf Entwurf zurück gesetzt "
+"werden, weil er durch einen Verkauf generiert wurde."
diff --git a/modules/sale_supply_production/locale/es.po b/modules/sale_supply_production/locale/es.po
new file mode 100644
index 0000000000..1c469ca2ef
--- /dev/null
+++ b/modules/sale_supply_production/locale/es.po
@@ -0,0 +1,19 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr "Producciones"
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr "Producciones"
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
+"No puede restablecer la producción \"%(production)s\" a borrador ya que ha "
+"sido generada por una venta."
diff --git a/modules/sale_supply_production/locale/es_419.po b/modules/sale_supply_production/locale/es_419.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/es_419.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/et.po b/modules/sale_supply_production/locale/et.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/et.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/fa.po b/modules/sale_supply_production/locale/fa.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/fa.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/fi.po b/modules/sale_supply_production/locale/fi.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/fi.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/fr.po b/modules/sale_supply_production/locale/fr.po
new file mode 100644
index 0000000000..fb3781ca94
--- /dev/null
+++ b/modules/sale_supply_production/locale/fr.po
@@ -0,0 +1,19 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr "Productions"
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
+"Vous ne pouvez pas réinitialiser à l'état brouillon la production "
+"« %(production)s » car elle a été générée par une vente."
diff --git a/modules/sale_supply_production/locale/hu.po b/modules/sale_supply_production/locale/hu.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/hu.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/id.po b/modules/sale_supply_production/locale/id.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/id.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/it.po b/modules/sale_supply_production/locale/it.po
new file mode 100644
index 0000000000..7481a92b5c
--- /dev/null
+++ b/modules/sale_supply_production/locale/it.po
@@ -0,0 +1,19 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr "Produzioni"
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr "Produzioni"
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
+"Non puoi reimpostare la produzione \"%(production)s\" come bozza perché tale"
+" è stata generata da una vendita."
diff --git a/modules/sale_supply_production/locale/lo.po b/modules/sale_supply_production/locale/lo.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/lo.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/lt.po b/modules/sale_supply_production/locale/lt.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/lt.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/nl.po b/modules/sale_supply_production/locale/nl.po
new file mode 100644
index 0000000000..c382ecf3f0
--- /dev/null
+++ b/modules/sale_supply_production/locale/nl.po
@@ -0,0 +1,19 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr "Producties"
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr "Producties"
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
+"U kunt de productie \"%(production)s\" niet terugzetten naar concept omdat "
+"deze is gegenereerd door een verkoop."
diff --git a/modules/sale_supply_production/locale/pl.po b/modules/sale_supply_production/locale/pl.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/pl.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/pt.po b/modules/sale_supply_production/locale/pt.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/pt.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/ro.po b/modules/sale_supply_production/locale/ro.po
new file mode 100644
index 0000000000..14bf54c3f2
--- /dev/null
+++ b/modules/sale_supply_production/locale/ro.po
@@ -0,0 +1,19 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr "Producții"
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr "Producții"
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
+"\"%(production)s\" nu poate fi resetat la draft pentru că a fost generat de "
+"o vânzare."
diff --git a/modules/sale_supply_production/locale/ru.po b/modules/sale_supply_production/locale/ru.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/ru.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/sl.po b/modules/sale_supply_production/locale/sl.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/sl.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/tr.po b/modules/sale_supply_production/locale/tr.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/tr.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/uk.po b/modules/sale_supply_production/locale/uk.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/uk.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/locale/zh_CN.po b/modules/sale_supply_production/locale/zh_CN.po
new file mode 100644
index 0000000000..dc3bf91b89
--- /dev/null
+++ b/modules/sale_supply_production/locale/zh_CN.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:sale.line,productions:"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_production_form"
+msgid "Productions"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_production_reset_draft"
+msgid ""
+"You cannot reset production \"%(production)s\" to draft because it was "
+"generated by a sale."
+msgstr ""
diff --git a/modules/sale_supply_production/message.xml b/modules/sale_supply_production/message.xml
new file mode 100644
index 0000000000..368018a112
--- /dev/null
+++ b/modules/sale_supply_production/message.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ You cannot reset production "%(production)s" to draft because it was generated by a sale.
+
+
+
diff --git a/modules/sale_supply_production/product.py b/modules/sale_supply_production/product.py
new file mode 100644
index 0000000000..05303788d3
--- /dev/null
+++ b/modules/sale_supply_production/product.py
@@ -0,0 +1,18 @@
+# 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.pyson import Eval
+
+
+class Template(metaclass=PoolMeta):
+ __name__ = 'product.template'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.supply_on_sale.states['invisible'] &= (
+ ~Eval('producible') | ~Eval('salable'))
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
diff --git a/modules/sale_supply_production/product.xml b/modules/sale_supply_production/product.xml
new file mode 100644
index 0000000000..70184cd889
--- /dev/null
+++ b/modules/sale_supply_production/product.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ product.template
+
+ template_form
+
+
+
diff --git a/modules/sale_supply_production/production.py b/modules/sale_supply_production/production.py
new file mode 100644
index 0000000000..9102c3d1e3
--- /dev/null
+++ b/modules/sale_supply_production/production.py
@@ -0,0 +1,119 @@
+# 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 functools import wraps
+
+from trytond.i18n import gettext
+from trytond.model import Model, ModelView, Workflow
+from trytond.model.exceptions import AccessError
+from trytond.pool import Pool, PoolMeta
+from trytond.tools import grouped_slice
+from trytond.transaction import Transaction
+
+
+def process_sale_supply(func):
+ @wraps(func)
+ def wrapper(cls, productions):
+ pool = Pool()
+ Sale = pool.get('sale.sale')
+ transaction = Transaction()
+ context = transaction.context
+
+ sales = set()
+ with transaction.set_context(_check_access=False):
+ for sub_productions in grouped_slice(productions):
+ ids = [p.id for p in sub_productions]
+ sales.update([s.id for s in Sale.search([
+ ('lines.productions', 'in', ids),
+ ])])
+ func(cls, productions)
+ if sales:
+ with transaction.set_context(
+ queue_batch=context.get('queue_batch', True)):
+ Sale.__queue__.process(sales)
+ return wrapper
+
+
+class Production(metaclass=PoolMeta):
+ __name__ = 'production'
+
+ @classmethod
+ def _get_origin(cls):
+ return super()._get_origin() | {'sale.line'}
+
+ @classmethod
+ @process_sale_supply
+ def delete(cls, productions):
+ super().delete(productions)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ @process_sale_supply
+ def cancel(cls, productions):
+ super().cancel(productions)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, productions):
+ pool = Pool()
+ SaleLine = pool.get('sale.line')
+ for production in productions:
+ if (production.state == 'cancelled'
+ and isinstance(production.origin, SaleLine)):
+ raise AccessError(
+ gettext('sale_supply_production'
+ '.msg_production_reset_draft',
+ production=production.rec_name))
+ super().draft(productions)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('running')
+ @process_sale_supply
+ def run(cls, productions):
+ super().run(productions)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @process_sale_supply
+ def done(cls, productions):
+ super().done(productions)
+
+ for production in productions:
+ production.assign_supplied()
+
+ def assign_supplied(self, grouping=('product',), filter_=None):
+ pool = Pool()
+ SaleLine = pool.get('sale.line')
+
+ if isinstance(self.origin, SaleLine):
+ sale_line = self.origin
+ else:
+ return
+
+ def filter_func(move):
+ if filter_ is None:
+ return True
+ for fieldname, values in filter_:
+ value = getattr(move, fieldname)
+ if isinstance(value, Model):
+ value = value.id
+ if value not in values:
+ return False
+
+ def get_key(move):
+ key = (move.to_location.id,)
+ for field in grouping:
+ value = getattr(move, field)
+ if isinstance(value, Model):
+ value = value.id
+ key += (value,)
+ return key
+
+ pbl = defaultdict(lambda: defaultdict(int))
+ for move in filter(filter_func, self.outputs):
+ pbl[move.product][get_key(move)] += move.internal_quantity
+ sale_line.assign_supplied(pbl[sale_line.product], grouping=grouping)
diff --git a/modules/sale_supply_production/sale.py b/modules/sale_supply_production/sale.py
new file mode 100644
index 0000000000..b946d351ac
--- /dev/null
+++ b/modules/sale_supply_production/sale.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 as dt
+
+from trytond.model import fields
+from trytond.pool import Pool, PoolMeta
+from trytond.transaction import Transaction
+
+
+class Sale(metaclass=PoolMeta):
+ __name__ = 'sale.sale'
+
+ @classmethod
+ def _process_shipment(cls, sales):
+ pool = Pool()
+ Production = pool.get('production')
+
+ productions = []
+ for sale in sales:
+ productions.extend(sale.create_productions())
+ Production.save(productions)
+ Production.set_moves(productions)
+ super()._process_shipment(sales)
+
+ def create_productions(self):
+ productions = []
+ for line in self.lines:
+ production = line.get_production()
+ if not production:
+ continue
+ production.planned_start_date = (
+ production.on_change_with_planned_start_date())
+ productions.append(production)
+ assert not line.productions
+ return productions
+
+
+class Line(metaclass=PoolMeta):
+ __name__ = 'sale.line'
+
+ productions = fields.One2Many(
+ 'production', 'origin', "Productions", readonly=True)
+
+ @property
+ def has_supply(self):
+ return super().has_supply or bool(self.productions)
+
+ def get_supply_state(self, name):
+ state = super().get_supply_state(name)
+ if self.productions:
+ states = {p.state for p in self.productions}
+ if states <= {'running', 'done', 'cancelled'}:
+ if states == {'cancelled'}:
+ state = 'cancelled'
+ else:
+ state = 'supplied'
+ else:
+ state = 'requested'
+ return state
+
+ @classmethod
+ def copy(cls, lines, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('productions', None)
+ return super().copy(lines, default=default)
+
+ def get_production(self):
+ "Return production for the sale line"
+ pool = Pool()
+ Production = pool.get('production')
+ Date = pool.get('ir.date')
+ with Transaction().set_context(company=self.sale.company.id):
+ today = Date.today()
+
+ if (not self.supply_on_sale
+ or self.productions
+ or not self.product.producible):
+ return
+
+ # Ensure to create the request for the maximum paid
+ if self.sale.shipment_method == 'invoice':
+ invoice_skips = (set(self.sale.invoices_ignored)
+ | set(self.sale.invoices_recreated))
+ invoice_lines = [l for l in self.invoice_lines
+ if l.invoice not in invoice_skips]
+ if (not invoice_lines
+ or any((not l.invoice) or l.invoice.state != 'paid'
+ for l in invoice_lines)):
+ return
+
+ date = self.shipping_date or today
+ if date <= today:
+ date = today
+ else:
+ date -= dt.timedelta(1)
+ product = self.product
+ quantity = self._get_move_quantity('out')
+ return Production(
+ planned_date=date,
+ company=self.sale.company,
+ warehouse=self.warehouse,
+ location=self.warehouse.production_location,
+ product=product,
+ bom=product.boms[0].bom if product.boms else None,
+ uom=self.unit,
+ quantity=quantity,
+ state='request',
+ origin=self,
+ )
diff --git a/modules/sale_supply_production/sale.xml b/modules/sale_supply_production/sale.xml
new file mode 100644
index 0000000000..f06e48b217
--- /dev/null
+++ b/modules/sale_supply_production/sale.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+ Productions
+ production
+
+
+
+ form_relate
+ sale.sale,-1
+
+
+
+
diff --git a/modules/sale_supply_production/setup.py b/modules/sale_supply_production/setup.py
new file mode 100755
index 0000000000..a032058c3c
--- /dev/null
+++ b/modules/sale_supply_production/setup.py
@@ -0,0 +1,154 @@
+#!/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 find_packages, setup
+
+
+def read(fname, slice=None):
+ content = io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+ if slice:
+ content = '\n'.join(content.splitlines()[slice])
+ 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_sale_supply_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 = []
+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 supply sales from 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/sale_supply_production',
+ },
+ keywords='tryton sale supply production',
+ package_dir={'trytond.modules.sale_supply_production': '.'},
+ packages=(
+ ['trytond.modules.sale_supply_production']
+ + ['trytond.modules.sale_supply_production.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.sale_supply_production': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ sale_supply_production = trytond.modules.sale_supply_production
+ """, # noqa: E501
+ )
diff --git a/modules/sale_supply_production/tests/__init__.py b/modules/sale_supply_production/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/sale_supply_production/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/sale_supply_production/tests/scenario_sale_supply_production.rst b/modules/sale_supply_production/tests/scenario_sale_supply_production.rst
new file mode 100644
index 0000000000..d0c5249b43
--- /dev/null
+++ b/modules/sale_supply_production/tests/scenario_sale_supply_production.rst
@@ -0,0 +1,161 @@
+===============================
+Sale Supply Production 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('sale_supply_production')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+
+Create parties::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_revenue = accounts['revenue']
+ >>> account_category.save()
+
+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.salable = True
+ >>> template.supply_on_sale = True
+ >>> template.list_price = Decimal(30)
+ >>> template.account_category = account_category
+ >>> product, = template.products
+ >>> product.cost_price = Decimal(20)
+ >>> template.save()
+ >>> product, = template.products
+
+Create components::
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Component 1"
+ >>> 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 bill of material::
+
+ >>> BOM = Model.get('production.bom')
+ >>> bom = BOM(name="Product")
+ >>> input = bom.inputs.new()
+ >>> input.product = component
+ >>> input.quantity = 5
+ >>> output = bom.outputs.new()
+ >>> output.product = product
+ >>> output.quantity = 1
+ >>> bom.save()
+
+ >>> product_bom = product.boms.new()
+ >>> product_bom.bom = bom
+ >>> product.save()
+
+Sale 10 products::
+
+ >>> Sale = Model.get('sale.sale')
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> line = sale.lines.new()
+ >>> line.product = product
+ >>> line.quantity = 10
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.state
+ 'processing'
+ >>> shipment, = sale.shipments
+ >>> move, = shipment.outgoing_moves
+ >>> move.state
+ 'staging'
+ >>> move, = shipment.inventory_moves
+ >>> move.state
+ 'staging'
+
+Check the production::
+
+ >>> Production = Model.get('production')
+ >>> production, = Production.find([])
+ >>> production.state
+ 'request'
+ >>> production.origin == sale.lines[0]
+ True
+ >>> production.product == product
+ True
+ >>> production.bom == bom
+ True
+ >>> production.quantity
+ 10.0
+
+Delete the production, recreate one::
+
+ >>> production.delete()
+ >>> production, = Production.find([])
+ >>> production.quantity
+ 10.0
+
+Start the production::
+
+ >>> production.click('draft')
+ >>> production.click('wait')
+ >>> production.click('assign_force')
+ >>> production.click('run')
+ >>> production.state
+ 'running'
+
+ >>> shipment.reload()
+ >>> move, = shipment.outgoing_moves
+ >>> move.state
+ 'draft'
+ >>> move, = shipment.inventory_moves
+ >>> move.state
+ 'draft'
+
+Finish the production::
+
+ >>> production.click('done')
+
+ >>> shipment.reload()
+ >>> move, = shipment.outgoing_moves
+ >>> move.state
+ 'draft'
+ >>> move, = shipment.inventory_moves
+ >>> move.state
+ 'assigned'
diff --git a/modules/sale_supply_production/tests/test_module.py b/modules/sale_supply_production/tests/test_module.py
new file mode 100644
index 0000000000..d5b508a35f
--- /dev/null
+++ b/modules/sale_supply_production/tests/test_module.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.tests.test_tryton import ModuleTestCase
+
+
+class SaleSupplyProductionTestCase(ModuleTestCase):
+ 'Test Sale Supply Production module'
+ module = 'sale_supply_production'
+
+
+del ModuleTestCase
diff --git a/modules/sale_supply_production/tests/test_scenario.py b/modules/sale_supply_production/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/sale_supply_production/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/sale_supply_production/tox.ini b/modules/sale_supply_production/tox.ini
new file mode 100644
index 0000000000..26177504c4
--- /dev/null
+++ b/modules/sale_supply_production/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/sale_supply_production/* -m unittest discover -s tests
+ coverage report --include=./**/sale_supply_production/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/sale_supply_production/tryton.cfg b/modules/sale_supply_production/tryton.cfg
new file mode 100644
index 0000000000..b265105c0e
--- /dev/null
+++ b/modules/sale_supply_production/tryton.cfg
@@ -0,0 +1,10 @@
+[tryton]
+version=6.7.0
+depends:
+ ir
+ production
+ sale_supply
+xml:
+ sale.xml
+ product.xml
+ message.xml
diff --git a/modules/sale_supply_production/view/template_form.xml b/modules/sale_supply_production/view/template_form.xml
new file mode 100644
index 0000000000..02c368619d
--- /dev/null
+++ b/modules/sale_supply_production/view/template_form.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/.drone.yml b/modules/stock/.drone.yml
new file mode 100644
index 0000000000..b45ef267ef
--- /dev/null
+++ b/modules/stock/.drone.yml
@@ -0,0 +1,78 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+ check_doc:
+ image: ${IMAGE}
+ commands:
+ - pip install sphinx
+ - python -m sphinx -T -E -W -n -b html doc _build/html
+ - python -m sphinx -T -E -W -n -b linkcheck doc _build
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock/.flake8 b/modules/stock/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock/.isort.cfg b/modules/stock/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock/CHANGELOG b/modules/stock/CHANGELOG
new file mode 100644
index 0000000000..4c2f964f30
--- /dev/null
+++ b/modules/stock/CHANGELOG
@@ -0,0 +1,264 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Limit transit only between different warehouses
+* Remove default currency on move
+* Allow cancelling move done
+* Support warehouse pickup
+* Allow resetting packed customer shipments
+* Allow grouping by date products by location
+* Ignore consumable products when inactivating locations
+
+Version 6.4.0 - 2022-05-02
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add location or warehouse in shipment tree view
+* Warn user when deactivating a product that has stock
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-01
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add method to sort quantities for assignation
+* Add warehouse properties to move
+* Allow view location as parent of warehouse
+
+Version 6.0.0 - 2021-05-03
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Allow shipments to be automatically assigned
+* Rename inventory count quantity_added to quantity
+* Add document source on move of product quantities by warehouse
+* Add relate from assigned shipment to products quantities by warehouse
+* Show quantities by warehouse for many products
+* Default to ordering shipments by date
+* Add delivery usage to contact mechanism
+* Make customer's outgoing moves editable for same storage and output zone
+* Add margin reporting
+* Add products_by_locations Model
+
+Version 5.8.0 - 2020-11-02
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+* Add picked step to customer shipment workflow
+* Add cron task to reschedule past shipments
+* Allow lost and found on inventory moves of shipments
+* Add waste locations on warehouses
+* Add warning to prevent move in the future
+* Add relate to open inventory lines
+* Use simplified view for moves list on shipments
+* Add a relate from product to its moves
+* Factorize the cost price of move for cost computation
+* Fill grouping values when assigning move
+* Use a single assign wizard for all shipments
+* Add access rules to product quantities by warehouse
+* Add moves for product quantities by warehouse
+* Enforce filling cost price of move
+* Rename move state from cancel to cancelled
+* Rename shipment states from cancel to cancelled
+* Rename inventory state from cancel to cancelled
+* Override warehouse with context value for current user
+
+Version 5.6.0 - 2020-05-04
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add visual on product and location quantities
+* Define one lost and found location per warehouse
+* Show warehouse in user status if not unique
+* Add cost price revision
+* Add wizard to modify product cost price
+* Add cron task to recompute product cost
+* Update cost of moves when recomputing product cost
+
+Version 5.4.0 - 2019-11-04
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add today record in Product Quantities By Warehouse
+* Allow consumable product on inventories
+* Let the user select a default warehouse
+* Add method to get default warehouse
+* Improve moves synchronisation on shipments
+* Allow move as move's origin
+* Open product quantities by warehouse to show moves
+
+Version 5.2.0 - 2019-05-06
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Don't set default unit price on stock move
+* Prefer to pick product from the source location
+* Change move attribute of ShipmentReport for a method
+* Rename inventory count quantity_resulting to total_quantity
+
+Version 5.0.0 - 2018-10-01
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add count wizard on inventory
+* Remove support for Python 2.7
+* Prevent delete lines if inventory is not draft or canceled
+* Manage same input and storage location in customer return shipment
+
+Version 4.8.0 - 2018-04-23
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add _stock_move_split context keyword when copying move for split
+* Manage same input and storage location in supplier shipment
+* Check pending shipment to erase party
+* Define how inventory non filled lines are managed
+* Do not fill inventory quantity automatically
+* Assign supplier return shipment using children when location is a view
+* Duplicate "Locations Quantity" into tree and list
+* Remove product_ids from products_by_location for grouping_filter
+* Add quantities relates on Template
+* Allow grouping per product columns to compute quantities
+
+Version 4.6.0 - 2017-10-30
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add flat children option on location
+* Raise single warning for move without origin
+* Allow to set manual effective date on move
+* Improve computation of cost price
+* Limit move locations 'child_of' constraints to specific shipment states
+* Allow to delete staging move
+* Allow to deactivate only empty locations
+
+Version 4.4.0 - 2017-05-01
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add employee on shipments for some states
+* Add request state on internal shipment
+* Manage same picking/storage and output location
+
+Version 4.2.0 - 2016-11-28
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Make inventory number always readonly
+* Manage readonly state on Inventory Line
+* Add lead time and transit location for internal shipments between warehouses
+
+Version 4.0.0 - 2016-05-02
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Rename Shipments code into number
+* Add number to inventories
+* Add supplier and delivery address on supplier return shipment
+* Add Python3 support
+* Add do button on stock move form & list
+* Add warehouse address on internal shipment
+
+Version 3.8.0 - 2015-11-02
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add drop location type
+* Add buttons on stock move form & list
+* Allow to use view location on staging and draft moves
+* Add picking location on warehouse
+* Always compute expected quantity in inventory
+* Allow to change the destination of internal shipment's moves
+* Allow to modify internal shipment moves in waiting state
+* Compute inventory lines in complete_lines() using new grouping() method
+* Allow to re-compute cost price
+* Allow to change unit price of move done
+
+Version 3.6.0 - 2015-04-20
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add support for PyPy
+* Add 'staging' state to stock move
+* Apply stock_assign of compute_quantity_query only on outgoing moves
+* Add domain on location's parent and childs
+* Do not filter out inactive products from stock computation
+
+Version 3.4.0 - 2014-10-20
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Always succeed assignation from lost and found on internal shipments
+* Remove return shipment out wizard
+
+Version 3.2.0 - 2014-04-21
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add warning for moves without origin
+* Allow to define the effective date of shipments
+* Prevent changing product type if stock moves exist
+* Use new methods to compute quantities in StockMixin._search_quantity()
+* Split products_by_location into two methods on Move:
+ compute_quantities_query and compute_quantities
+* Use origin for inventory moves
+* Allow partial assignation on Supplier Shipment Return
+
+Version 3.0.0 - 2013-10-21
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add Mixin class with helper to setup stock quantity fields
+* Allow to customize move creation of Inventory
+* Allow to customize unique constraint on Inventory
+* Allow specific grouping Period Cache
+* Add grouping on products_by_location and assign_try
+
+Version 2.8.0 - 2013-04-22
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Merge all shipment Many2One into shipment Reference
+* Add origin Reference on Stock Move
+* Add workflow to stock move
+
+Version 2.6.0 - 2012-10-22
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add Product Quantities By Warehouse
+
+Version 2.4.0 - 2012-04-24
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Remove special to_location_warehouse search clause
+* Remove default from and to location and instead use domain
+* Update cost_price only from supplier to storage
+
+Version 2.2.0 - 2011-10-25
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Ensure coherence between planned date of shipments and moves
+
+Version 2.0.0 - 2011-04-27
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add period to reduce data computation
+* Add internal_quantity on move to speedup computation
+
+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)
+* Use model singleton to define shipment sequences
+* Add default search value on inventory, move and shipments
+
+Version 1.4.0 - 2009-10-19
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add new group "Stock Force Assignment"
+* Migrate packing* objects and tables to shipment*
+* Return move id in create_move of inventory line
+
+Version 1.2.0 - 2009-04-20
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Added return packings and a wizard to create customer return packing.
+* Make assign_try to assign as much possible
+* Move assign_try and pick_product from product.product to stock.move
+* Added stock_skip_warehouse keyword for products_by_location
+ method. The default behaviour is now to compute quantities on all
+ child locations for a warehouse.
+* Handle average price for products return to supplier
+* Added stock_destinations keyword on products_by_location context to
+ filter moves to a set of destinations.
+* Allow egg installation
+
+Version 1.0.0 - 2008-11-17
+--------------------------
+* Initial release
diff --git a/modules/stock/COPYRIGHT b/modules/stock/COPYRIGHT
new file mode 100644
index 0000000000..e150f04d90
--- /dev/null
+++ b/modules/stock/COPYRIGHT
@@ -0,0 +1,18 @@
+Copyright (C) 2012 Openlabs Technologies & Consulting (P) LTD.
+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/stock/LICENSE b/modules/stock/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock/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/stock/MANIFEST.in b/modules/stock/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock/README.rst b/modules/stock/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock/__init__.py b/modules/stock/__init__.py
new file mode 100644
index 0000000000..32260e7c5b
--- /dev/null
+++ b/modules/stock/__init__.py
@@ -0,0 +1,78 @@
+# 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, inventory, ir, location, move, party, period, product, res,
+ shipment, stock_reporting_margin)
+from .move import StockMixin
+
+__all__ = ['StockMixin', 'register']
+
+
+def register():
+ Pool.register(
+ location.Location,
+ location.WarehouseWasteLocation,
+ location.ProductsByLocationsContext,
+ location.ProductsByLocations,
+ location.LocationLeadTime,
+ move.Move,
+ shipment.ShipmentIn,
+ shipment.ShipmentInReturn,
+ shipment.ShipmentOut,
+ shipment.ShipmentOutReturn,
+ shipment.ShipmentInternal,
+ shipment.AssignPartial,
+ party.Party,
+ party.PartyLocation,
+ party.PartyDeliveredToWarehouse,
+ party.Address,
+ party.ContactMechanism,
+ period.Period,
+ period.Cache,
+ product.Template,
+ product.Product,
+ product.ProductByLocationContext,
+ product.ProductQuantitiesByWarehouse,
+ product.ProductQuantitiesByWarehouseContext,
+ product.ProductQuantitiesByWarehouseMove,
+ product.RecomputeCostPriceStart,
+ product.CostPriceRevision,
+ product.ModifyCostPriceStart,
+ inventory.Inventory,
+ inventory.InventoryLine,
+ inventory.CountSearch,
+ inventory.CountQuantity,
+ configuration.Configuration,
+ configuration.ConfigurationSequence,
+ configuration.ConfigurationLocation,
+ ir.Cron,
+ res.User,
+ stock_reporting_margin.Context,
+ stock_reporting_margin.Main,
+ stock_reporting_margin.MainTimeseries,
+ stock_reporting_margin.Product,
+ stock_reporting_margin.ProductTimeseries,
+ stock_reporting_margin.Category,
+ stock_reporting_margin.CategoryTimeseries,
+ stock_reporting_margin.CategoryTree,
+ module='stock', type_='model')
+ Pool.register(
+ shipment.Assign,
+ product.OpenProductQuantitiesByWarehouse,
+ product.OpenProductQuantitiesByWarehouseMove,
+ product.RecomputeCostPrice,
+ product.ModifyCostPrice,
+ inventory.Count,
+ party.Replace,
+ party.Erase,
+ module='stock', type_='wizard')
+ Pool.register(
+ shipment.DeliveryNote,
+ shipment.PickingList,
+ shipment.SupplierRestockingList,
+ shipment.CustomerReturnRestockingList,
+ shipment.InteralShipmentReport,
+ module='stock', type_='report')
diff --git a/modules/stock/configuration.py b/modules/stock/configuration.py
new file mode 100644
index 0000000000..8b769bf3af
--- /dev/null
+++ b/modules/stock/configuration.py
@@ -0,0 +1,235 @@
+# 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 (
+ ModelSingleton, ModelSQL, ModelView, ValueMixin, fields)
+from trytond.modules.company.model import (
+ CompanyMultiValueMixin, CompanyValueMixin)
+from trytond.pool import Pool
+from trytond.pyson import Eval, Id
+from trytond.tools.multivalue import migrate_property
+
+sequences = ['shipment_in_sequence', 'shipment_in_return_sequence',
+ 'shipment_out_sequence', 'shipment_out_return_sequence',
+ 'shipment_internal_sequence', 'inventory_sequence']
+shipment_internal_transit = fields.Many2One(
+ 'stock.location', "Internal Shipment Transit", required=True,
+ domain=[
+ ('type', '=', 'storage'),
+ ],
+ help="The default location used for stock that is in transit between "
+ "warehouses.")
+
+
+def default_func(field_name):
+ @classmethod
+ def default(cls, **pattern):
+ return getattr(
+ cls.multivalue_model(field_name),
+ 'default_%s' % field_name, lambda: None)()
+ return default
+
+
+def default_sequence(name):
+ @classmethod
+ def default(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id('stock', name)
+ except KeyError:
+ return None
+ return default
+
+
+class Configuration(
+ ModelSingleton, ModelSQL, ModelView, CompanyMultiValueMixin):
+ 'Stock Configuration'
+ __name__ = 'stock.configuration'
+ shipment_in_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Supplier Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in',
+ [Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_shipment_in')),
+ ],
+ help="Used to generate the number given to supplier shipments."))
+ shipment_in_return_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Supplier Return Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in',
+ [Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_shipment_in_return')),
+ ],
+ help="Used to generate the number given to supplier return "
+ "shipments."))
+ shipment_out_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Customer Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in',
+ [Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_shipment_out')),
+ ],
+ help="Used to generate the number given to customer "
+ "shipments."))
+ shipment_out_return_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Customer Return Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in',
+ [Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_shipment_out_return')),
+ ],
+ help="Used to generate the number given to customer return "
+ "shipments."))
+ shipment_internal_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Internal Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in',
+ [Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_shipment_internal')),
+ ],
+ help="Used to generate the number given to internal "
+ "shipments."))
+ inventory_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Inventory Sequence", required=True,
+ domain=[
+ ('company', 'in',
+ [Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_inventory')),
+ ],
+ help="Used to generate the number given to inventories."))
+ shipment_internal_transit = fields.MultiValue(shipment_internal_transit)
+
+ @classmethod
+ def multivalue_model(cls, field):
+ pool = Pool()
+ if field in sequences:
+ return pool.get('stock.configuration.sequence')
+ if field == 'shipment_internal_transit':
+ return pool.get('stock.configuration.location')
+ return super(Configuration, cls).multivalue_model(field)
+
+ default_shipment_in_sequence = default_func('shipment_in_sequence')
+ default_shipment_in_return_sequence = default_func(
+ 'shipment_in_return_sequence')
+ default_shipment_out_sequence = default_func('shipment_out_sequence')
+ default_shipment_out_return_sequence = default_func(
+ 'shipment_out_return_sequence')
+ default_shipment_internal_sequence = default_func(
+ 'shipment_internal_sequence')
+ default_inventory_sequence = default_func('inventory_sequence')
+ default_shipment_internal_transit = default_func(
+ 'shipment_internal_transit')
+
+
+class ConfigurationSequence(ModelSQL, CompanyValueMixin):
+ "Stock Configuration Sequence"
+ __name__ = 'stock.configuration.sequence'
+ shipment_in_sequence = fields.Many2One(
+ 'ir.sequence', "Supplier Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_shipment_in')),
+ ])
+ shipment_in_return_sequence = fields.Many2One(
+ 'ir.sequence', "Supplier Return Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_shipment_in_return')),
+ ])
+ shipment_out_sequence = fields.Many2One(
+ 'ir.sequence', "Customer Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_shipment_out')),
+ ])
+ shipment_out_return_sequence = fields.Many2One(
+ 'ir.sequence', "Customer Return Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_shipment_out_return')),
+ ])
+ shipment_internal_sequence = fields.Many2One(
+ 'ir.sequence', "Internal Shipment Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_shipment_internal')),
+ ])
+ inventory_sequence = fields.Many2One(
+ 'ir.sequence', "Inventory Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock', 'sequence_type_inventory')),
+ ])
+
+ @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.extend(sequences)
+ value_names.extend(sequences)
+ fields.append('company')
+ migrate_property(
+ 'stock.configuration', field_names, cls, value_names,
+ fields=fields)
+
+ default_shipment_in_sequence = default_sequence('sequence_shipment_in')
+ default_shipment_in_return_sequence = default_sequence(
+ 'sequence_shipment_in_return')
+ default_shipment_out_sequence = default_sequence('sequence_shipment_out')
+ default_shipment_out_return_sequence = default_sequence(
+ 'sequence_shipment_out_return')
+ default_shipment_internal_sequence = default_sequence(
+ 'sequence_shipment_internal')
+ default_inventory_sequence = default_sequence('sequence_inventory')
+
+
+class ConfigurationLocation(ModelSQL, ValueMixin):
+ "Stock Configuration Location"
+ __name__ = 'stock.configuration.location'
+ shipment_internal_transit = shipment_internal_transit
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+
+ super(ConfigurationLocation, cls).__register__(module_name)
+
+ if not exist:
+ cls._migrate_property([], [], [])
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.append('shipment_internal_transit')
+ value_names.append('shipment_internal_transit')
+ migrate_property(
+ 'stock.configuration', field_names, cls, value_names,
+ fields=fields)
+
+ @classmethod
+ def default_shipment_internal_transit(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id('stock', 'location_transit')
+ except KeyError:
+ return None
diff --git a/modules/stock/configuration.xml b/modules/stock/configuration.xml
new file mode 100644
index 0000000000..9b2d917bdf
--- /dev/null
+++ b/modules/stock/configuration.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+ stock.configuration
+ form
+ configuration_form
+
+
+ Configuration
+ stock.configuration
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/customer_return_restocking_list.fodt b/modules/stock/customer_return_restocking_list.fodt
new file mode 100644
index 0000000000..5f66e560bb
--- /dev/null
+++ b/modules/stock/customer_return_restocking_list.fodt
@@ -0,0 +1,491 @@
+
+
+
+ LibreOffice/5.2.7.2$Linux_X86_64 LibreOffice_project/20m0$Build-2Bertrand Chenal2009-03-26T13:54:482016-03-21T16:02:20.53387491256PT7H2M27S
+
+
+ 0
+ 0
+ 43760
+ 21691
+ true
+ false
+
+
+ view2
+ 2630
+ 5313
+ 0
+ 0
+ 43759
+ 21689
+ 0
+ 0
+ false
+ 100
+ false
+
+
+
+
+ false
+ true
+ true
+ true
+ 0
+ true
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ true
+ 440606
+ false
+ true
+ true
+ false
+ true
+ true
+ false
+ true
+ 0
+ false
+ true
+ high-resolution
+ false
+ false
+ false
+ true
+ true
+ true
+
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+
+ false
+ false
+ 68753
+ false
+ 1
+ true
+ false
+ false
+ 0
+ false
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <if test="company and company.header">
+ <for each="line in company.header.split('\n')">
+ <line>
+ </for>
+ </if>
+ <company.rec_name if company else ''>
+
+
+ <if test="company and company.footer">
+ <for each="line in company.footer.split('\n')">
+ <line>
+ </for>
+ </if>
+ 2/2
+
+
+
+
+
+
+
+
+
+
+
+
+ <for each="shipment in records">
+ Restocking List
+ Shipment Number: <shipment.number>
+ Reference: <shipment.origins or ''><', ' if (shipment.origins and shipment.reference) else ''><shipment.reference or ''>
+ Customer: <shipment.customer.rec_name>
+ Planned Date: <shipment.planned_date and format_date(shipment.planned_date, user.language) or ''>
+ Warehouse: <shipment.warehouse.rec_name>
+
+
+
+
+
+
+
+ From Location
+
+
+ To Location
+
+
+ Product
+
+
+ Quantity
+
+
+
+
+
+ <for each="move in moves[shipment.id]">
+
+
+
+
+
+
+
+
+
+
+
+ <move.from_location.rec_name>
+
+
+ <move.to_location.rec_name>
+
+
+ <move.product.rec_name>
+
+
+ <format_number_symbol(move.quantity, user.language, move.uom, digits=move.uom.digits)>
+
+
+
+
+ </for>
+
+
+
+
+
+
+
+
+
+
+ </for>
+
+
+
diff --git a/modules/stock/delivery_note.fodt b/modules/stock/delivery_note.fodt
new file mode 100644
index 0000000000..0b9d7b762b
--- /dev/null
+++ b/modules/stock/delivery_note.fodt
@@ -0,0 +1,500 @@
+
+
+
+ LibreOffice/7.3.3.2$Linux_X86_64 LibreOffice_project/30$Build-22008-06-07T15:29:022009-03-26T18:33:131PT0S
+
+
+ 0
+ 0
+ 48129
+ 23021
+ true
+ false
+
+
+ view2
+ 37596
+ 8964
+ 0
+ 0
+ 48128
+ 23019
+ 0
+ 0
+ false
+ 100
+ false
+ false
+ false
+
+
+
+
+ false
+ false
+ false
+ true
+ true
+ true
+ true
+ true
+ false
+ 0
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ true
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 0
+ 1
+ true
+ false
+
+ high-resolution
+ false
+
+
+ false
+ false
+ true
+ false
+ true
+ true
+ false
+ true
+
+ true
+ 2929175
+
+ true
+ false
+ true
+ true
+ 0
+
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ true
+ false
+ false
+
+ false
+ false
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ 1813180
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <if test="company and company.header">
+ <for each="line in company.header.split('\n')">
+ <line>
+ </for>
+ </if>
+ <company.rec_name if company else ''>
+
+
+ <if test="company and company.footer">
+ <for each="line in company.footer.split('\n')">
+ <line>
+ </for>
+ </if>
+ 2/2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <for each="shipment in records">
+
+ <replace text:p="set_lang(shipment.delivery_address.party.lang)">
+ <replace text:p="shipment.set_lang(shipment.delivery_address.party.lang)">
+ <shipment.customer.full_name>
+ <for each="line in shipment.delivery_address.full_address.split('\n')">
+ <line>
+ </for>
+ Delivery Note
+ Shipment Number: <shipment.number>Customer Code: <shipment.customer.code>Reference: <shipment.origins or ''><', ' if (shipment.origins and shipment.reference) else ''><shipment.reference or ''>Date: <format_date(shipment.effective_date or datetime.date.today(), shipment.delivery_address.party.lang)>
+
+
+
+
+
+
+ Product
+
+
+ Quantity
+
+
+
+
+
+ <for each="move in shipment.outgoing_moves">
+
+
+
+
+
+ <move.product.rec_name>
+
+
+ <format_number_symbol(move.quantity, shipment.delivery_address.party.lang, move.uom, digits=move.uom.digits)>
+
+
+
+
+ </for>
+
+
+
+
+ </for>
+
+
+
\ No newline at end of file
diff --git a/modules/stock/doc/conf.py b/modules/stock/doc/conf.py
new file mode 100644
index 0000000000..8513b72dd2
--- /dev/null
+++ b/modules/stock/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/stock/doc/design/configuration.rst b/modules/stock/doc/design/configuration.rst
new file mode 100644
index 0000000000..d53a5ad8b3
--- /dev/null
+++ b/modules/stock/doc/design/configuration.rst
@@ -0,0 +1,17 @@
+.. _model-stock.configuration:
+
+Configuration
+=============
+
+The *Stock Configuration* contains settings that are used to configure the
+behaviour and default values for stock related activities, including the
+sequences used to generate `Shipment ` numbers.
+
+.. seealso::
+
+ The stock configuration can be found using the main menu item:
+
+ |Inventory & Stock --> Configuration --> Configuration|__
+
+ .. |Inventory & Stock --> Configuration --> Configuration| replace:: :menuselection:`Inventory & Stock --> Configuration --> Configuration`
+ __ https://demo.tryton.org/model/stock.configuration/1
diff --git a/modules/stock/doc/design/index.rst b/modules/stock/doc/design/index.rst
new file mode 100644
index 0000000000..7d756ab618
--- /dev/null
+++ b/modules/stock/doc/design/index.rst
@@ -0,0 +1,16 @@
+******
+Design
+******
+
+The stock module introduces or extends the following concepts.
+
+.. toctree::
+ :maxdepth: 1
+
+ location
+ move
+ shipment
+ inventory
+ period
+ configuration
+ product
diff --git a/modules/stock/doc/design/inventory.rst b/modules/stock/doc/design/inventory.rst
new file mode 100644
index 0000000000..b8bb24e7c3
--- /dev/null
+++ b/modules/stock/doc/design/inventory.rst
@@ -0,0 +1,48 @@
+.. _model-stock.inventory:
+
+Inventory
+=========
+
+The *Inventory* concept is used to help check and correct the amount of
+stock stored in a `Location `.
+
+Each inventory has a set of lines, one for each `Product `
+that is in, or is should be in, the location.
+Each line has an expected quantity and an actual quantity.
+The former is used to show how much stock is expected to be in the location
+and the latter is used to record how much stock was actually found there.
+
+A option on the inventory specifies what to do with lines whose actual
+quantity is left empty.
+
+When the *Inventory* is confirmed the stock in the location is updated by
+creating a set of `Stock Moves `.
+These moves correct the stock in the location.
+They do this by transferring stock to and from the lost and found location
+associated with location being checked.
+
+.. warning::
+
+ Do not use inventories when `Setting initial stock levels`.
+
+.. seealso::
+
+ The inventory checks can be found using the main menu item:
+
+ |Inventory & Stock --> Inventories|__
+
+ .. |Inventory & Stock --> Inventories| replace:: :menuselection:`Inventory & Stock --> Inventories`
+ __ https://demo.tryton.org/model/stock.inventory
+
+Wizards
+-------
+
+.. _wizard-stock.inventory.count:
+
+Inventory Count
+^^^^^^^^^^^^^^^
+
+The *Inventory Count* wizard helps users fill in inventories on a
+`Product ` by product basis.
+It takes a product and a quantity and adds this to the appropriate inventory
+line.
diff --git a/modules/stock/doc/design/location.rst b/modules/stock/doc/design/location.rst
new file mode 100644
index 0000000000..2bbd226b01
--- /dev/null
+++ b/modules/stock/doc/design/location.rst
@@ -0,0 +1,59 @@
+.. _model-stock.location:
+
+Location
+========
+
+A location represents the place where stock is stored.
+This may be a physical location, such as a shelf, or a virtual location such
+as the location used for products that have gone missing.
+
+Locations are organised in to a structure with each location having a parent
+location and zero or more sub-locations.
+It is possible to restrict a location to only one level of children.
+This enables the use of an optimisation that improves the performance of the
+the stock quantity calculation.
+
+A location also has a set of properties that allow the :ref:`current and
+forecasted amounts of stock ` in the location to be
+obtained along with the stock's value.
+
+.. _concept-stock.location.warehouse:
+
+Warehouse
+---------
+
+Warehouses are special locations that represent a physical warehouse and as
+such can have an `Address `.
+They are also normally split up into a set of locations each with a particular
+purpose, such as for the input, output or storage of stock.
+
+.. seealso::
+
+ Stock locations can be added, removed and changed from the main menu item:
+
+ |Inventory & Stock --> Configuration --> Locations|__
+
+ .. |Inventory & Stock --> Configuration --> Locations| replace:: :menuselection:`Inventory & Stock --> Configuration --> Locations`
+ __ https://demo.tryton.org/model/stock.location
+
+ The stock locations structure, and access to the stock levels in
+ a location can be found from the main menu item:
+
+ :menuselection:`Inventory & Stock --> Locations`
+
+.. _model-stock.location.lead_time:
+
+Location Lead Time
+==================
+
+A *Location Lead Time* is the amount of time that it normally takes to
+transfer stock between two `Warehouses `.
+
+.. seealso::
+
+ Location lead times can be updated from the main menu item:
+
+ |Inventory & Stock --> Configuration --> Locations --> Location Lead Times|__
+
+ .. |Inventory & Stock --> Configuration --> Locations --> Location Lead Times| replace:: :menuselection:`Inventory & Stock --> Configuration --> Locations --> Location Lead Times`
+ __ https://demo.tryton.org/model/stock.location.lead_time
diff --git a/modules/stock/doc/design/move.rst b/modules/stock/doc/design/move.rst
new file mode 100644
index 0000000000..b183437716
--- /dev/null
+++ b/modules/stock/doc/design/move.rst
@@ -0,0 +1,58 @@
+.. _model-stock.move:
+
+Move
+====
+
+In Tryton a stock *Move* represents the transfer of a given amount of a
+`Product ` between two different
+`Stock Locations `.
+Often stock moves will be grouped together into a
+`Shipment `.
+
+.. note::
+
+ Service products have no physical presence, so are not available for
+ use in stock moves.
+
+A stock move has some properties that record the planned date for the stock
+move and also its effective date, which is when the move actually happened.
+
+Some stock moves are also associated with unit and cost prices.
+These allow the value of stock to be calculated at any time, and for products'
+cost prices to be updated based on the stock moves.
+
+Each `Company ` has its own stock moves which
+are kept separate from other company's stock moves.
+
+.. seealso::
+
+ The stock moves can be listed by opening the main menu item:
+
+ |Inventory & Stock --> Moves|__
+
+ .. |Inventory & Stock --> Moves| replace:: :menuselection:`Inventory & Stock --> Moves`
+ __ https://demo.tryton.org/model/stock.move
+
+.. _concept-stock.move.assign:
+
+Assign Concept
+--------------
+
+A stock move is assigned when the stock for the stock move has been found
+and reserved and cannot be assigned by any other stock move.
+
+When attempting to assign a stock move Tryton looks at the stock move's source
+locations and their sub-locations, and searches for the stock that is needed
+to complete the stock moves.
+If stock is found then the source location of the stock move is changed,
+or the stock move is split up into several stock moves, each of which may
+take stock from a different sub-location.
+
+If there is not enough stock available to fully assign the stock move then the
+remainder is left in a stock move that is not assigned.
+
+.. note::
+
+ Consumable products always get assigned even when there is not enough
+ stock available for the stock move.
+ This is the key difference between goods and consumable products.
diff --git a/modules/stock/doc/design/period.rst b/modules/stock/doc/design/period.rst
new file mode 100644
index 0000000000..ecbb13ea3d
--- /dev/null
+++ b/modules/stock/doc/design/period.rst
@@ -0,0 +1,32 @@
+.. _model-stock.period:
+
+Period
+======
+
+In Tryton a stock *Period* is used to group together the all stock moves that
+happened up to a specific date and that were also done after the date of any
+previous stock *Period*.
+
+This allows the stock levels for the `Products ` in all stock
+`Locations ` to be calculated for the date of the period,
+and stored in the `Stock Period Cache `.
+
+These cached values can then be used, where applicable, instead of having to
+recalculate them each time they are needed.
+
+.. seealso::
+
+ The periods can be viewed and managed from the main menu item:
+
+ |Inventory & Stock --> Configuration --> Periods|__
+
+ .. |Inventory & Stock --> Configuration --> Periods| replace:: :menuselection:`Inventory & Stock --> Configuration --> Periods`
+ __ https://demo.tryton.org/model/stock.period
+
+.. _model-stock.period.cache:
+
+Period Cache
+============
+
+The *Period Cache* is used to store the quantities of a product in a
+particular location on the date defined by its `Period `.
diff --git a/modules/stock/doc/design/product.rst b/modules/stock/doc/design/product.rst
new file mode 100644
index 0000000000..3f72e03392
--- /dev/null
+++ b/modules/stock/doc/design/product.rst
@@ -0,0 +1,97 @@
+.. _concept-product:
+
+Product
+=======
+
+When the *Stock Module* is activated, products gain some extra properties.
+These include a product's stock and forecast quantities, which show its
+current and predicted future stock situation, and the cost value of its
+stock.
+
+.. seealso::
+
+ The `Product ` concept is introduced by the
+ :doc:`Product Module `.
+
+.. _concept-product.quantity:
+
+Product Quantity
+----------------
+
+The amount, and the value, of a product in a
+`Stock Location ` is calculated by adding up all the
+`Stock Moves ` in to that location and subtracting those
+out of the same location.
+
+Some values from the
+:attr:`Transaction context `
+are used to help determine which stock moves get included in this calculation
+and which get left out.
+These values include things like which locations to include in the
+calculation, and what dates should be included.
+
+Normally, when calculating stock quantities for a date in the past, only moves
+that are done are included in the calculation, and only if their effective
+date is early enough.
+This reflects the real situation based on completed stock moves.
+For dates in the future, draft and `Assigned `
+moves are also included, but only if their planned date is between today's
+date and the future date, inclusive.
+
+.. note::
+
+ The stock quantity of consumable products is calculated in exactly
+ the same way as any other product, even though consumable products
+ can always be assigned regardless of how much stock there is.
+
+Wizards
+-------
+
+.. _wizard-product.recompute_cost_price:
+
+Recompute Cost Price
+^^^^^^^^^^^^^^^^^^^^
+
+The *Recompute Cost Price* wizard updates products' cost prices using their
+cost price method.
+
+.. _wizard-product.modify_cost_price:
+
+Modify Cost Price
+^^^^^^^^^^^^^^^^^
+
+The *Modify Cost Price* wizard is only way in which a product's cost price
+can be changed once it has stock moves.
+The wizard takes a date and a fixed price or formula for the new cost price.
+These changes are stored in the
+`Cost Price Revision ` concept and are
+applied at the beginning of the date that was selected when the cost price
+of the product gets re-calculated.
+
+.. _model-stock.product_quantities_warehouse:
+
+Product Quantities by Warehouse
+===============================
+
+The idea of the *Product Quantities by Warehouse* concept is to provide
+information about how the stock levels of one or more products have varied
+over time in a particular `Warehouse `.
+
+.. _model-stock.product_quantities_warehouse.move:
+
+Product Quantities by Warehouse Move
+====================================
+
+The *Product Quantities by Warehouse Move* concept provides information about
+how `Stock Moves ` have affected the stock levels in a
+`Warehouse ` over time.
+
+.. _model-product.cost_price.revision:
+
+Cost Price Revision
+===================
+
+The *Cost Price Revision* records changes to a product's cost price.
+These revisions are automatically created when the product's cost price is
+changed using the `Modify Cost Price `
+wizard.
diff --git a/modules/stock/doc/design/shipment.rst b/modules/stock/doc/design/shipment.rst
new file mode 100644
index 0000000000..41904482a4
--- /dev/null
+++ b/modules/stock/doc/design/shipment.rst
@@ -0,0 +1,231 @@
+.. _concept-stock.shipment:
+
+Shipment
+========
+
+In Tryton the concept of a *Shipment* is used to help organise and manage
+groups of related `Stock Moves `.
+There are different types of shipment which are used for different purposes.
+Some of these types of shipment may also be split up into stages.
+In each stage stock is moved to or from an intermediate
+`Location `.
+Each stage's moves form a subset of the shipment's total moves.
+
+.. _model-stock.shipment.in:
+
+Supplier Shipment
+-----------------
+
+A *Supplier Shipment* has a set of properties that hold details about the
+shipment such as who the supplier is, what
+`Warehouse ` it is going to and the date
+when the shipment is expected to be delivered.
+
+It is made up from two sets of `Stock Moves `:
+
+* Incoming moves, these are used to move stock between a supplier
+ `Location ` and the warehouse's input location, and
+* Inventory moves, these then put the stock away in the warehouse's storage
+ location, or one of its child locations.
+
+.. note::
+
+ If the warehouse's input location and storage location are the same then
+ the inventory moves are not created.
+
+.. seealso::
+
+ The supplier shipments can be found by opening the main menu item:
+
+ |Inventory & Stock --> Supplier Shipments|__
+
+ .. |Inventory & Stock --> Supplier Shipments| replace:: :menuselection:`Inventory & Stock --> Supplier Shipments`
+ __ https://demo.tryton.org/model/stock.shipment.in
+
+Reports
+^^^^^^^
+
+.. _report-stock.shipment.in.restocking_list:
+
+Restocking List
+"""""""""""""""
+
+The *Restocking List* report lists the items on an incoming shipment and the
+destination locations for the stock based on the inventory moves.
+
+.. _model-stock.shipment.in.return:
+
+Supplier Return Shipment
+------------------------
+
+A *Supplier Return Shipment* has a set of properties that contain information
+about the shipment such as who the supplier was, what
+`Address ` the shipment is going to, and the date
+the shipment is sent.
+
+It is made up from a single set of `Stock Moves ` that return
+the stock directly back to a supplier `Location `.
+
+.. seealso::
+
+ The supplier shipments can be found by opening the main menu item:
+
+ |Inventory & Stock --> Supplier Shipments --> Supplier Return Shipments|__
+
+ .. |Inventory & Stock --> Supplier Shipments --> Supplier Return Shipments| replace:: :menuselection:`Inventory & Stock --> Supplier Shipments --> Supplier Return Shipments`
+ __ https://demo.tryton.org/model/stock.shipment.in.return
+
+.. _model-stock.shipment.out:
+
+Customer Shipment
+-----------------
+
+A *Customer Shipment* has a set of properties that contain information about
+the shipment such as which `Warehouse ` it
+is being sent from, what `Address ` it is being
+delivered to, and the date it is being sent.
+
+A customer shipment is made up from two sets of
+`Stock Moves `:
+
+* Inventory moves, these moves are used to pick the stock from the warehouse's
+ storage `Location ` and put it in the output location,
+ and
+* Outgoing moves, these then take the picked stock and send it to a
+ customer location.
+ The outgoing moves are created first and define what stock needs to be sent
+ to the customer.
+
+.. note::
+
+ If the warehouse's picking location (or storage location if no picking
+ location is defined) is the same as its output location then only
+ outgoing moves are created and these moves do not get
+ `Assigned `.
+
+.. seealso::
+
+ The customer shipments can be found by opening the main menu item:
+
+ |Inventory & Stock --> Customer Shipments|__
+
+ .. |Inventory & Stock --> Customer Shipments| replace:: :menuselection:`Inventory & Stock --> Customer Shipments`
+ __ https://demo.tryton.org/model/stock.shipment.out
+
+Reports
+^^^^^^^
+
+.. _report-stock.shipment.out.picking_list:
+
+Picking List
+""""""""""""
+
+The *Picking List* report lists the stock that is needed for a shipment.
+For each item on the shipment it details the location the stock should be
+taken from, and how much should be taken.
+
+.. _report-stock.shipment.out.delivery_note:
+
+Delivery Note
+"""""""""""""
+
+The *Delivery Note* report contains information about where the shipment is
+being sent, and when the delivery is happening.
+It also lists all the items on the shipment.
+
+.. _model-stock.shipment.out.return:
+
+Customer Return Shipment
+------------------------
+
+A *Customer Return Shipment* has properties that contain information about
+which customer the stock is being returned from, which
+`Warehouse ` it is sent to and the date the
+return is happening.
+
+It is made up from two sets of `Stock Moves `:
+
+* Incoming moves, these are used to move stock between a customer
+ `Location ` and the warehouse's input location, and
+* Inventory moves, these then put the stock away in the warehouse's storage
+ location, or one of its child locations.
+
+.. note::
+
+ If the warehouse's input location and storage location are the same then
+ the inventory moves are not created.
+
+.. seealso::
+
+ The customer shipments can be found by opening the main menu item:
+
+ |Inventory & Stock --> Customer Shipments --> Customer Return Shipments|__
+
+ .. |Inventory & Stock --> Customer Shipments --> Customer Return Shipments| replace:: :menuselection:`Inventory & Stock --> Customer Shipments --> Customer Return Shipments`
+ __ https://demo.tryton.org/model/stock.shipment.out.return
+
+Reports
+^^^^^^^
+
+.. _report-stock.shipment.out.return.restocking_list:
+
+Customer Return Restocking List
+"""""""""""""""""""""""""""""""
+
+The *Customer Return Restocking List* report lists the items that were
+returned by a customer.
+For each item a destination location for the stock is also included based on
+the inventory moves.
+
+.. _model-stock.shipment.internal:
+
+Internal Shipment
+-----------------
+
+An internal shipment allows a group of `Stock Moves `,
+between locations within the same `Company `,
+to be managed as a single entity.
+
+For internal shipments that are planned to start and end on different dates it
+is made up from two sets of moves.
+The first set are outgoing moves that put the stock in a transit
+`Location ` and the second set are incoming moves that
+take the stock from the transit location and place it in the destination
+location.
+
+.. seealso::
+
+ Internal shipments are available from the main menu item:
+
+ |Inventory & Stock --> Internal Shipments|__
+
+ .. |Inventory & Stock --> Internal Shipments| replace:: :menuselection:`Inventory & Stock --> Internal Shipments`
+ __ https://demo.tryton.org/model/stock.shipment.internal
+
+Reports
+^^^^^^^
+
+.. _report-stock.shipment.internal.report:
+
+Internal Shipment Report
+""""""""""""""""""""""""
+
+The *Internal Shipment Report* provides a list of the items on the internal
+shipment along with their quantities.
+For shipments between `Warehouses ` it also
+contains the `Address ` of the warehouse the stock
+is being sent to.
+
+Wizards
+-------
+
+.. _wizard-stock.shipment.assign:
+
+Assign Shipment
+^^^^^^^^^^^^^^^
+
+The *Assign Shipment* wizard is used to assign a shipment.
+Assigning a shipment tries to `Assign ` the
+`Stock Moves ` that take the stock for the shipment.
+If not all the stock moves can be assigned then it provides the user with a
+set of options of what to do next.
diff --git a/modules/stock/doc/index.rst b/modules/stock/doc/index.rst
new file mode 100644
index 0000000000..73e5c794c5
--- /dev/null
+++ b/modules/stock/doc/index.rst
@@ -0,0 +1,19 @@
+############
+Stock Module
+############
+
+The *Stock Module* provides the fundamental concepts required for managing
+stock.
+This includes keeping track of where the stock is, how much is available,
+and checking and correcting stock levels.
+It also allows stock to be moved from one place to another, and delivered to
+and from customers and suppliers.
+
+.. toctree::
+ :maxdepth: 2
+
+ setup
+ usage/index
+ design/index
+ reference
+ releases
diff --git a/modules/stock/doc/reference.rst b/modules/stock/doc/reference.rst
new file mode 100644
index 0000000000..ca0f3a8492
--- /dev/null
+++ b/modules/stock/doc/reference.rst
@@ -0,0 +1,13 @@
+*************
+API Reference
+*************
+
+Stock Quantities
+================
+
+.. class:: trytond.modules.stock.StockMixin
+
+ This mixin_ provides some common methods that are useful when creating
+ classes that provide quantity fields.
+
+ .. _mixin: http://en.wikipedia.org/wiki/Mixin
diff --git a/modules/stock/doc/releases.rst b/modules/stock/doc/releases.rst
new file mode 100644
index 0000000000..21b13c4745
--- /dev/null
+++ b/modules/stock/doc/releases.rst
@@ -0,0 +1,7 @@
+.. _releases-index:
+
+=============
+Release notes
+=============
+
+.. include:: ../CHANGELOG
diff --git a/modules/stock/doc/setup.rst b/modules/stock/doc/setup.rst
new file mode 100644
index 0000000000..d6f794a50e
--- /dev/null
+++ b/modules/stock/doc/setup.rst
@@ -0,0 +1,69 @@
+*****
+Setup
+*****
+
+.. _Setting up stock locations:
+
+Setting up stock locations
+==========================
+
+The *Stock Module* provides a set of default
+`Stock Locations `, however it is likely that you will
+want to customise them to suit your company.
+
+.. tip::
+
+ If you only have a small `Warehouse `
+ you can use the same location for its storage, input and output locations.
+ This reduces the stock moves required to send and receive shipments.
+
+.. tip::
+
+ If you have a large number of locations in your warehouse you can
+ use the option to limit locations to only a single level of children.
+ This will improve the performance of Tryton when it is calculating
+ stock quantities.
+
+.. tip::
+
+ If you are altering your stock locations, and you have already used a
+ stock location then it cannot be deleted.
+ However, you can deactivate it which will hide it during normal use.
+
+.. _Setting initial stock levels:
+
+Setting initial stock levels
+============================
+
+When you start using Tryton you may already have some stock that you want to
+bring into the system.
+
+In order to ensure the value of your stock is correctly calculated, and to
+show that this stock has (at some point in the past) come from a supplier,
+you must enter this initial stock in the correct way.
+
+The right way of doing this is to create a set of individual
+`Stock Moves `.
+These moves can be created in the view that is opened from the
+|Inventory & Stock --> Moves|__ main menu item.
+Each of the stock moves should move some stock of a `Product `
+from a supplier `Location ` to the appropriate storage
+location.
+These stock moves must have their unit prices set to their product's cost
+price.
+
+.. |Inventory & Stock --> Moves| replace:: :menuselection:`Inventory & Stock --> Moves`
+__ https://demo.tryton.org/model/stock.move
+
+.. note::
+
+ As these moves are for your initial stock they have no origin, and
+ when you try and do these moves Tryton will warn you about this.
+ Because this is for your initial stock this is not a problem, and you
+ can safely go ahead and finish doing the moves.
+
+.. tip::
+
+ If you create all the stock moves to start with, you can then select them
+ all in the list view, and use the :guilabel:`Do` item from the
+ :guilabel:`Launch Action` menu to do them all in one go.
diff --git a/modules/stock/doc/usage/index.rst b/modules/stock/doc/usage/index.rst
new file mode 100644
index 0000000000..72be41020a
--- /dev/null
+++ b/modules/stock/doc/usage/index.rst
@@ -0,0 +1,14 @@
+*****
+Usage
+*****
+
+The [:menuselection:`Inventory & Stock`] main menu item allows access to the
+items that allow you to view, manage and change things related to stock.
+
+.. toctree::
+ :maxdepth: 1
+
+ shipment
+ quantity
+ value
+ period
diff --git a/modules/stock/doc/usage/period.rst b/modules/stock/doc/usage/period.rst
new file mode 100644
index 0000000000..c45d496c74
--- /dev/null
+++ b/modules/stock/doc/usage/period.rst
@@ -0,0 +1,16 @@
+.. _Using stock periods:
+
+Using stock periods
+===================
+
+You can use `Stock Periods ` to stop
+`Stock Moves ` being created or updated before a specific
+date, and to improve the performance of Tryton when looking at and using
+`Product Quantities `.
+
+.. tip::
+
+ Depending on the number of stock moves that your
+ `Company ` generates you may find it useful
+ to create new stock periods as part of your accounting period end, or
+ fiscal year end, processes.
diff --git a/modules/stock/doc/usage/quantity.rst b/modules/stock/doc/usage/quantity.rst
new file mode 100644
index 0000000000..9cd58192f5
--- /dev/null
+++ b/modules/stock/doc/usage/quantity.rst
@@ -0,0 +1,98 @@
+.. _Viewing stock levels:
+
+Viewing stock levels
+====================
+
+In Tryton there are a few different ways of seeing
+`Product Stock Quantities `.
+You can also easily see what the stock situation was at any time in the past,
+and get an idea of what the stock situation will be after any
+`Stock Moves ` that are still being processed have been
+completed.
+
+.. note::
+
+ Tryton is designed to allow you to create stock moves even if they
+ create negative stock.
+ For normal storage locations negative stock levels indicate that more
+ stock has been used than was available.
+ This suggests that there may be incoming moves to the location that
+ have not yet been done, or a mistake has been made that can be resolved
+ by `Checking and correcting stock levels`.
+
+ However, although it is possible to create negative stock, you will
+ normally use `Shipments ` to help manage stock
+ moves, and a process to `assign them `.
+ These respect stock availability and wont allow you to create negative
+ stock unless you force them to.
+
+Depending on what you are trying to find out you can get information about
+stock levels for either `Products ` or
+`Locations `.
+
+If you are interested in finding out where some particular products are
+stored, then once you have selected the products you are interested in, you
+can use the menu items in the product's :guilabel:`Open related records` menu.
+
+To view how much stock is in one or more stock locations you first need to
+select the locations you are interested in.
+Once you have done this you can use the :guilabel:`Products` item from the
+:guilabel:`Open related records` menu.
+This then shows the total stock that is in all the selected locations.
+
+.. tip::
+
+ From the [:menuselection:`Inventory & Stock --> Locations`] main menu item
+ you can quickly get a list of stock in a single location by opening the
+ location you are interested in.
+
+.. tip::
+
+ If you have only selected a single location then the stock levels will
+ include all the stock in the location's children as well.
+ However, if you selected multiple locations then only the stock in the
+ selected locations is included, any stock in their child locations is
+ *not* included.
+
+.. _Checking and correcting stock levels:
+
+Checking and correcting stock levels
+====================================
+
+There are a range of things, such as mispicks, damages and theft, that can
+cause the stock levels on Tryton to not match the actual amount of stock
+available.
+
+Tryton allows you to check for and correct these discrepancies by performing
+an `Inventory ` of a
+`Stock Location `.
+This process is sometimes also called a stocktake, stock count or inventory
+check.
+How often you need to do this, and to what extent, is very dependent on your
+business.
+You may do this once a year at the end of your fiscal year, or continuously
+by means of a `cycle count`_.
+
+When you create a new inventory you can use the :guilabel:`Complete` button to
+complete the creation of the inventory.
+This adds a line to the inventory for each product that is expected to be in
+the location.
+
+How you go about actually counting the stock will depend on how your stock
+location is organised.
+If each `Product ` is all together and is easy to count,
+then you can enter the totals directly into the :guilabel:`Quantity` column.
+If there are many different lines in the location, or not all of each product
+is together, then you can start the `Count `
+wizard using the :guilabel:`Count` button to enter the quantities as you go.
+In this case, multiple quantities for the same product will be automatically
+added together.
+
+For each inventory you can choose how to deal with any lines where the quantity
+has been left empty.
+You can either keep the stock in the location, or empty it out.
+
+Once the inventory has been finished you use the :guilabel:`Confirm` button
+to correct the stock levels on Tryton.
+
+.. _`cycle count`: https://en.wikipedia.org/wiki/Cycle_count
diff --git a/modules/stock/doc/usage/shipment.rst b/modules/stock/doc/usage/shipment.rst
new file mode 100644
index 0000000000..3813fd8472
--- /dev/null
+++ b/modules/stock/doc/usage/shipment.rst
@@ -0,0 +1,125 @@
+.. _Sending and receiving deliveries:
+
+Sending and receiving deliveries
+================================
+
+In Tryton you use `Shipments ` to send stock to your
+customers and receive stock from your suppliers.
+There are different kinds of shipments available depending on whether you're
+dealing with customers or suppliers and whether you are sending or receiving
+stock.
+
+Although each type of shipment helps you manage the delivery of some stock,
+and encompasses the same set of ideas, each is tailored for a particular
+type of delivery.
+
+From Suppliers
+--------------
+
+You use a `Supplier Shipment ` when receiving stock
+from a supplier.
+
+* The supplier shipment is first received in to the
+ `Warehouse's `
+ input `Location `.
+* You can then use the
+ `Restocking List `
+ to help you put the stock away in the right locations in the warehouse.
+
+To Suppliers
+------------
+
+If you need to send stock back to a supplier you use a
+`Supplier Return Shipment `.
+
+To Customers
+------------
+
+You use a `Customer Shipment ` when sending stock
+out to a customer.
+
+* When the customer shipment is waiting to be worked on, normally the first
+ thing you need to do is `Assign it `.
+* You then pick the stock from the
+ `Warehouse `.
+ A `Picking List ` helps with this as
+ it details how much stock you need, and where it can be found.
+* Once you've picked and packed the delivery you can dispatch it to the
+ customer from the warehouse's output `Location `.
+ It is common practice to send a
+ `Delivery Note ` along with your
+ customer's shipment.
+
+From Customers
+--------------
+
+Stock that is returned by customers is handled by using a
+`Customer Return Shipment `.
+It works in a similar way to supplier shipments.
+
+* You receive the stock in the warehouse's input location.
+* Then you use the `Customer Return Restocking List
+ ` to help you put it away
+ in the warehouse.
+
+.. _Moving stock within your company:
+
+Moving stock within your company
+================================
+
+If you want to move stock between `Locations ` within a
+`Warehouse `, or between warehouses that
+belong to the same `Company ` you use an
+`Internal Shipment `.
+
+The internal shipment helps you manage the processes of moving stock from one
+place to another.
+
+* Once the internal shipment is waiting to be worked on, you need to go ahead
+ and `Assign it `.
+* You can use the
+ `Internal Shipment Report `
+ to help you find and pick, or move, the stock.
+* If the stock is intended for another warehouse you then send the shipment
+ to it.
+* Finally once you've put the stock away in the correct locations the internal
+ shipment is done.
+
+.. tip::
+
+ You can use the `Stock Location Lead Time `
+ to setup how long it normally takes for shipments between two warehouses.
+
+.. note::
+
+ If an internal shipment is expected to take more than one day to complete
+ then when the stock is sent it gets put in a transit location until the
+ shipment is done.
+
+.. _Assigning shipments:
+
+Assigning shipments
+===================
+
+Any `Shipments ` types that normally take stock from
+either a storage or view `Location ` must be assigned
+before they can be done.
+The aim of this process is to find and reserve the stock specifically for the
+shipment.
+
+The `Assign Shipment ` wizard is used when
+assigning shipments.
+It tries to `Assign ` each of the shipment's
+incoming `Stock Moves `.
+In doing so it updates the stock moves based on what stock it managed to find.
+
+If there is not enough stock available to fully assign the shipment you can
+force the remainder to be assigned, although this will result in some stock
+locations having negative stock.
+
+.. note::
+
+ When stock moves from a view location are assigned the stock must always be
+ taken from one of its sub-locations, as view locations cannot be the
+ source or destination of a done move.
+ This also means moves from a view location cannot be forced.
diff --git a/modules/stock/doc/usage/value.rst b/modules/stock/doc/usage/value.rst
new file mode 100644
index 0000000000..6c46c7ae82
--- /dev/null
+++ b/modules/stock/doc/usage/value.rst
@@ -0,0 +1,66 @@
+.. _Finding the value of your stock:
+
+Finding the value of your stock
+===============================
+
+In Tryton you can easily find the value of stock that's in one, or more,
+`Locations ` as the stock's cost value is included when
+`Viewing stock levels` for the locations you are interested in.
+
+.. _Updating the value of your stock:
+
+Updating the value of your stock
+================================
+
+The value of the stock that your `Company `
+owns is based on the `Quantity ` of stock and its
+cost price.
+
+You can correct the quantity of stock by
+`Checking and correcting stock levels`.
+
+You can also change how much the stock is worth by
+`Updating a product's cost price`.
+
+.. _Updating a product's cost price:
+
+Updating a product's cost price
+===============================
+
+A `Product's ` cost price is affected by various factors
+including its cost price method and in some cases the value of stock received
+or dispatched.
+
+The `Recompute Cost Price ` wizard is
+used to update a product's cost price using the product's cost price method.
+
+.. tip::
+
+ Most of the time you will not need to run the wizard that recalculates your
+ products' cost prices, because, by default, there is a scheduled task that
+ runs once a day and does this for you.
+
+ You can, however, also run the wizard at any time to ensure you are seeing
+ the most up to date information.
+
+Once there are some `Stock Moves ` for a
+`Product ` you can make a manual adjustment to a product's
+cost price using the `Modify Cost Price `
+wizard.
+This allows you to do things like reduce the cost price, and consequently
+stock value, of a product by ``10%`` from a certain date by using
+``cost_price * 0.9``.
+
+.. note::
+
+ If you modify a cost price you may also need to run the *Recompute Cost
+ Price* wizard to see the changes reflected in the product's cost price.
+
+.. _Viewing cost price changes:
+
+Viewing cost price changes
+==========================
+
+You can get a list of any manual cost price changes that have been applied
+to a product by using the :guilabel:`Cost Price Revision` relate action from
+the product's :guilabel:`Open Related Records` menu.
diff --git a/modules/stock/exceptions.py b/modules/stock/exceptions.py
new file mode 100644
index 0000000000..25f55eca78
--- /dev/null
+++ b/modules/stock/exceptions.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.exceptions import UserError, UserWarning
+from trytond.model.exceptions import ValidationError
+
+
+class AssignError(UserError):
+ pass
+
+
+class MoveValidationError(ValidationError):
+ pass
+
+
+class LocationValidationError(ValidationError):
+ pass
+
+
+class PeriodCloseError(UserError):
+ pass
+
+
+class InventoryValidationError(ValidationError):
+ pass
+
+
+class InventoryCountWarning(UserWarning):
+ pass
+
+
+class MoveOriginWarning(UserWarning):
+ pass
+
+
+class MoveFutureWarning(UserWarning):
+ pass
+
+
+class InventoryFutureWarning(UserWarning):
+ pass
+
+
+class ProductCostPriceError(ValidationError):
+ pass
+
+
+class ProductStockWarning(UserWarning):
+ pass
diff --git a/modules/stock/icons/LICENSE b/modules/stock/icons/LICENSE
new file mode 100644
index 0000000000..7a4a3ea242
--- /dev/null
+++ b/modules/stock/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/stock/icons/tryton-shipment-in.svg b/modules/stock/icons/tryton-shipment-in.svg
new file mode 100644
index 0000000000..3559501b95
--- /dev/null
+++ b/modules/stock/icons/tryton-shipment-in.svg
@@ -0,0 +1 @@
+
diff --git a/modules/stock/icons/tryton-shipment-out.svg b/modules/stock/icons/tryton-shipment-out.svg
new file mode 100644
index 0000000000..1a17c766c0
--- /dev/null
+++ b/modules/stock/icons/tryton-shipment-out.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/modules/stock/icons/tryton-stock.svg b/modules/stock/icons/tryton-stock.svg
new file mode 100644
index 0000000000..0aacaac2dc
--- /dev/null
+++ b/modules/stock/icons/tryton-stock.svg
@@ -0,0 +1,4 @@
+
diff --git a/modules/stock/internal_shipment.fodt b/modules/stock/internal_shipment.fodt
new file mode 100644
index 0000000000..e69bf8dfa7
--- /dev/null
+++ b/modules/stock/internal_shipment.fodt
@@ -0,0 +1,528 @@
+
+
+
+ LibreOffice/6.4.6.2$Linux_X86_64 LibreOffice_project/40$Build-2Bertrand Chenal2009-03-26T13:54:482020-10-24T23:33:19.17812532962PT7H27M11S
+
+
+ 23186
+ 0
+ 26301
+ 24026
+ true
+ false
+
+
+ view2
+ 4651
+ 35512
+ 0
+ 23186
+ 26300
+ 47210
+ 0
+ 0
+ false
+ 100
+ false
+ false
+
+
+
+
+ false
+ true
+ true
+ true
+ 0
+ true
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ true
+ true
+ 1178252
+ false
+
+ false
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 2029623
+
+ true
+ false
+ true
+ true
+ false
+ true
+ true
+ false
+ true
+ false
+ false
+ false
+ 0
+ false
+ true
+ high-resolution
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ true
+ true
+
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+
+ false
+ false
+ false
+ 1
+ true
+ false
+ false
+ 0
+ false
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <if test="company and company.header">
+ <for each="line in company.header.split('\n')">
+ <line>
+ </for>
+ </if>
+ <company.rec_name if company else ''>
+
+
+ <if test="company and company.footer">
+ <for each="line in company.footer.split('\n')">
+ <line>
+ </for>
+ </if>
+ 2/2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <for each="shipment in records">
+
+ <if test="shipment.to_location.warehouse and shipment.to_location.warehouse.address">
+ <for each="line in shipment.to_location.warehouse.address.full_address.split('\n')">
+ <line>
+ </for>
+ </if>
+ Internal Shipment
+ Shipment Number: <shipment.number>
+ Reference: <shipment.reference or ''>
+ From Location: <shipment.from_location.rec_name>
+ To Location: <shipment.to_location.rec_name>
+ Planned Date: <shipment.planned_date and format_date(shipment.planned_date, user.language) or ''>
+
+
+
+
+
+
+
+ From Location
+
+
+ To Location
+
+
+ Product
+
+
+ Quantity
+
+
+
+
+
+ <for each="move in moves[shipment.id]">
+
+
+
+
+
+
+
+
+
+
+
+ <move.from_location.rec_name>
+
+
+ <move.to_location.rec_name>
+
+
+ <move.product.rec_name>
+
+
+ <format_number_symbol(move.quantity, user.language, move.uom, digits=move.uom.digits)>
+
+
+
+
+ </for>
+
+
+
+
+
+
+
+
+
+
+ </for>
+
+
+
diff --git a/modules/stock/inventory.py b/modules/stock/inventory.py
new file mode 100644
index 0000000000..798753b0d0
--- /dev/null
+++ b/modules/stock/inventory.py
@@ -0,0 +1,663 @@
+# 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 sql import Null
+
+from trytond.i18n import gettext
+from trytond.model import (
+ Check, Index, Model, ModelSQL, ModelView, Workflow, fields)
+from trytond.model.exceptions import AccessError
+from trytond.pool import Pool
+from trytond.pyson import Bool, Eval, If
+from trytond.tools import grouped_slice
+from trytond.transaction import Transaction
+from trytond.wizard import Button, StateTransition, StateView, Wizard
+
+from .exceptions import (
+ InventoryCountWarning, InventoryFutureWarning, InventoryValidationError)
+
+
+class Inventory(Workflow, ModelSQL, ModelView):
+ 'Stock Inventory'
+ __name__ = 'stock.inventory'
+ _rec_name = 'number'
+
+ _states = {
+ 'readonly': Eval('state') != 'draft',
+ }
+
+ number = fields.Char('Number', readonly=True,
+ help="The main identifier for the inventory.")
+ location = fields.Many2One(
+ 'stock.location', 'Location', required=True,
+ domain=[('type', '=', 'storage')], states={
+ 'readonly': (Eval('state') != 'draft') | Eval('lines', [0]),
+ },
+ help="The location inventoried.")
+ date = fields.Date('Date', required=True, states={
+ 'readonly': (Eval('state') != 'draft') | Eval('lines', [0]),
+ },
+ help="The date of the stock count.")
+ lines = fields.One2Many(
+ 'stock.inventory.line', 'inventory', 'Lines',
+ states={
+ 'readonly': (_states['readonly'] | ~Eval('location')
+ | ~Eval('date')),
+ })
+ empty_quantity = fields.Selection([
+ (None, ""),
+ ('keep', "Keep"),
+ ('empty', "Empty"),
+ ], "Empty Quantity", states=_states,
+ help="How lines without a quantity are handled.")
+ company = fields.Many2One('company.company', 'Company', required=True,
+ states={
+ 'readonly': (Eval('state') != 'draft') | Eval('lines', [0]),
+ },
+ help="The company the inventory is associated with.")
+ state = fields.Selection([
+ ('draft', "Draft"),
+ ('done', "Done"),
+ ('cancelled', "Cancelled"),
+ ], "State", readonly=True, sort=False,
+ help="The current state of the inventory.")
+
+ del _states
+
+ @classmethod
+ def __setup__(cls):
+ super(Inventory, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.add(
+ Index(t, (t.state, Index.Equality()), where=t.state == 'draft'))
+ cls._order.insert(0, ('date', 'DESC'))
+ cls._transitions |= set((
+ ('draft', 'done'),
+ ('draft', 'cancelled'),
+ ))
+ cls._buttons.update({
+ 'confirm': {
+ 'invisible': Eval('state').in_(['done', 'cancelled']),
+ 'depends': ['state'],
+ },
+ 'cancel': {
+ 'invisible': Eval('state').in_(['cancelled', 'done']),
+ 'depends': ['state'],
+ },
+ 'complete_lines': {
+ 'readonly': Eval('state') != 'draft',
+ 'depends': ['state'],
+ },
+ 'do_count': {
+ 'readonly': Eval('state') != 'draft',
+ 'depends': ['state'],
+ },
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
+ super(Inventory, cls).__register__(module_name)
+
+ cursor = Transaction().connection.cursor()
+ table = cls.__table_handler__(module_name)
+ sql_table = cls.__table__()
+
+ # Migration from 5.4: remove lost_found
+ table.not_null_action('lost_found', 'remove')
+
+ # Migration from 5.6: rename state cancel to cancelled
+ cursor.execute(*sql_table.update(
+ [sql_table.state], ['cancelled'],
+ where=sql_table.state == 'cancel'))
+
+ @staticmethod
+ def default_state():
+ return 'draft'
+
+ @staticmethod
+ def default_date():
+ Date = Pool().get('ir.date')
+ return Date.today()
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @classmethod
+ def view_attributes(cls):
+ return super().view_attributes() + [
+ ('/tree', 'visual', If(Eval('state') == 'cancelled', 'muted', '')),
+ ]
+
+ @classmethod
+ def delete(cls, inventories):
+ # Cancel before delete
+ cls.cancel(inventories)
+ for inventory in inventories:
+ if inventory.state != 'cancelled':
+ raise AccessError(
+ gettext('stock.msg_inventory_delete_cancel',
+ inventory=inventory.rec_name))
+ super(Inventory, cls).delete(inventories)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def confirm(cls, inventories):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ Warning = pool.get('res.user.warning')
+ today_cache = {}
+
+ def in_future(inventory):
+ if inventory.company not in today_cache:
+ with Transaction().set_context(company=inventory.company.id):
+ today_cache[inventory.company] = Date.today()
+ today = today_cache[inventory.company]
+ if inventory.date > today:
+ return inventory
+ future_inventories = sorted(filter(in_future, inventories))
+ if future_inventories:
+ names = ', '.join(i.rec_name for i in future_inventories[:5])
+ if len(future_inventories) > 5:
+ names + '...'
+ warning_name = Warning.format('date_future', future_inventories)
+ if Warning.check(warning_name):
+ raise InventoryFutureWarning(warning_name,
+ gettext('stock.msg_inventory_date_in_the_future',
+ inventories=names))
+
+ moves = []
+ for inventory in inventories:
+ keys = set()
+ for line in inventory.lines:
+ key = line.unique_key
+ if key in keys:
+ raise InventoryValidationError(
+ gettext('stock.msg_inventory_line_unique',
+ line=line.rec_name,
+ inventory=inventory.rec_name))
+ keys.add(key)
+ move = line.get_move()
+ if move:
+ moves.append(move)
+ if moves:
+ Move.save(moves)
+ # Skip MoveFutureWarning as it is newly created moves
+ with Transaction().set_user(0):
+ Move.do(moves)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, inventories):
+ Line = Pool().get("stock.inventory.line")
+ Line.cancel_move([l for i in inventories for l in i.lines])
+
+ @classmethod
+ def create(cls, vlist):
+ pool = Pool()
+ Configuration = pool.get('stock.configuration')
+ config = Configuration(1)
+ vlist = [x.copy() for x in vlist]
+ default_company = cls.default_company()
+ for values in vlist:
+ if values.get('number') is None:
+ values['number'] = config.get_multivalue(
+ 'inventory_sequence',
+ company=values.get('company', default_company)).get()
+ inventories = super(Inventory, cls).create(vlist)
+ cls.complete_lines(inventories, fill=False)
+ return inventories
+
+ @classmethod
+ def write(cls, *args):
+ super().write(*args)
+ inventories = cls.browse(set(sum(args[::2], [])))
+ cls.complete_lines(inventories, fill=False)
+
+ @classmethod
+ def copy(cls, inventories, default=None):
+ pool = Pool()
+ Date = pool.get('ir.date')
+
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('date', Date.today())
+ default.setdefault('lines.moves', None)
+ default.setdefault('number', None)
+
+ new_inventories = super().copy(inventories, default=default)
+ cls.complete_lines(new_inventories, fill=False)
+ return new_inventories
+
+ @staticmethod
+ def grouping():
+ return ('product',)
+
+ @classmethod
+ @ModelView.button
+ def complete_lines(cls, inventories, fill=True):
+ '''
+ Complete or update the inventories
+ '''
+ pool = Pool()
+ Line = pool.get('stock.inventory.line')
+ Product = pool.get('product.product')
+
+ grouping = cls.grouping()
+ to_create, to_write = [], []
+ for inventory in inventories:
+ # Once done computation is wrong because include created moves
+ if inventory.state == 'done':
+ continue
+ # Compute product quantities
+ with Transaction().set_context(stock_date_end=inventory.date):
+ if fill:
+ pbl = Product.products_by_location(
+ [inventory.location.id],
+ grouping=grouping)
+ else:
+ product_ids = [l.product.id for l in inventory.lines]
+ pbl = defaultdict(int)
+ for product_ids in grouped_slice(product_ids):
+ pbl.update(Product.products_by_location(
+ [inventory.location.id],
+ grouping=grouping,
+ grouping_filter=(list(product_ids),)))
+
+ # Index some data
+ product2type = {}
+ product2consumable = {}
+ for product in Product.browse({line[1] for line in pbl}):
+ product2type[product.id] = product.type
+ product2consumable[product.id] = product.consumable
+
+ # Update existing lines
+ for line in inventory.lines:
+ if line.product.type != 'goods':
+ Line.delete([line])
+ continue
+
+ key = (inventory.location.id,) + line.unique_key
+ if key in pbl:
+ quantity = pbl.pop(key)
+ else:
+ quantity = 0.0
+ values = line.update_values4complete(quantity)
+ if values:
+ to_write.extend(([line], values))
+
+ if not fill:
+ continue
+ # Create lines if needed
+ for key, quantity in pbl.items():
+ product_id = key[grouping.index('product') + 1]
+ if (product2type[product_id] != 'goods'
+ or product2consumable[product_id]):
+ continue
+ if not quantity:
+ continue
+
+ values = Line.create_values4complete(inventory, quantity)
+ for i, fname in enumerate(grouping, 1):
+ values[fname] = key[i]
+ to_create.append(values)
+ if to_create:
+ Line.create(to_create)
+ if to_write:
+ Line.write(*to_write)
+
+ @classmethod
+ @ModelView.button_action('stock.wizard_inventory_count')
+ def do_count(cls, inventories):
+ cls.complete_lines(inventories)
+
+
+class InventoryLine(ModelSQL, ModelView):
+ 'Stock Inventory Line'
+ __name__ = 'stock.inventory.line'
+ _states = {
+ 'readonly': Eval('inventory_state') != 'draft',
+ }
+
+ product = fields.Many2One('product.product', 'Product', required=True,
+ domain=[
+ ('type', '=', 'goods'),
+ ], states=_states)
+ uom = fields.Function(fields.Many2One('product.uom', 'UOM',
+ help="The unit in which the quantity is specified."), 'get_uom')
+ expected_quantity = fields.Float(
+ "Expected Quantity", digits='uom', required=True, readonly=True,
+ states={
+ 'invisible': Eval('id', -1) < 0,
+ },
+ help="The quantity the system calculated should be in the location.")
+ quantity = fields.Float(
+ "Actual Quantity", digits='uom', states=_states,
+ help="The actual quantity found in the location.")
+ moves = fields.One2Many('stock.move', 'origin', 'Moves', readonly=True)
+ inventory = fields.Many2One('stock.inventory', 'Inventory', required=True,
+ ondelete='CASCADE',
+ states={
+ 'readonly': _states['readonly'] & Bool(Eval('inventory')),
+ },
+ help="The inventory the line belongs to.")
+ inventory_location = fields.Function(
+ fields.Many2One('stock.location', "Location"),
+ 'on_change_with_inventory_location',
+ searcher='search_inventory_location')
+ inventory_date = fields.Function(
+ fields.Date("Date"),
+ 'on_change_with_inventory_date',
+ searcher='search_inventory_date')
+ inventory_state = fields.Function(
+ fields.Selection('get_inventory_states', "Inventory State",
+ depends={'inventory'}),
+ 'on_change_with_inventory_state')
+
+ @classmethod
+ def __setup__(cls):
+ super(InventoryLine, cls).__setup__()
+ cls.__access__.add('inventory')
+ t = cls.__table__()
+ cls._sql_constraints += [
+ ('check_line_qty_pos', Check(t, t.quantity >= 0),
+ 'stock.msg_inventory_line_quantity_positive'),
+ ]
+ cls._order.insert(0, ('product', 'ASC'))
+
+ @classmethod
+ def __register__(cls, module_name):
+ transaction = Transaction()
+ cursor = transaction.connection.cursor()
+ update = transaction.connection.cursor()
+ pool = Pool()
+ Move = pool.get('stock.move')
+ sql_table = cls.__table__()
+ move_table = Move.__table__()
+
+ super(InventoryLine, cls).__register__(module_name)
+
+ table = cls.__table_handler__(module_name)
+
+ # Migration from 3.0: use Move origin
+ if table.column_exist('move'):
+ cursor.execute(*sql_table.select(sql_table.id, sql_table.move,
+ where=sql_table.move != Null))
+ for line_id, move_id in cursor:
+ update.execute(*move_table.update(
+ columns=[move_table.origin],
+ values=['%s,%s' % (cls.__name__, line_id)],
+ where=move_table.id == move_id))
+ table.drop_column('move')
+
+ # Migration from 4.6: drop required on quantity
+ table.not_null_action('quantity', action='remove')
+
+ @staticmethod
+ def default_expected_quantity():
+ return 0.
+
+ @fields.depends('product')
+ def on_change_product(self):
+ if self.product:
+ self.uom = self.product.default_uom
+
+ @fields.depends('inventory', '_parent_inventory.location')
+ def on_change_with_inventory_location(self, name=None):
+ if self.inventory and self.inventory.location:
+ return self.inventory.location.id
+
+ @classmethod
+ def search_inventory_location(cls, name, clause):
+ nested = clause[0][len(name):]
+ return [('inventory.' + name + nested, *clause[1:])]
+
+ @fields.depends('inventory', '_parent_inventory.date')
+ def on_change_with_inventory_date(self, name=None):
+ if self.inventory:
+ return self.inventory.date
+
+ @classmethod
+ def search_inventory_date(cls, name, clause):
+ return [('inventory.date',) + tuple(clause[1:])]
+
+ @classmethod
+ def get_inventory_states(cls):
+ pool = Pool()
+ Inventory = pool.get('stock.inventory')
+ return Inventory.fields_get(['state'])['state']['selection']
+
+ @fields.depends('inventory', '_parent_inventory.state')
+ def on_change_with_inventory_state(self, name=None):
+ if self.inventory:
+ return self.inventory.state
+ return 'draft'
+
+ 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:])]
+
+ def get_uom(self, name):
+ return self.product.default_uom.id
+
+ @property
+ def unique_key(self):
+ key = []
+ for fname in self.inventory.grouping():
+ value = getattr(self, fname)
+ if isinstance(value, Model):
+ value = value.id
+ key.append(value)
+ return tuple(key)
+
+ @classmethod
+ def cancel_move(cls, lines):
+ Move = Pool().get('stock.move')
+ moves = [m for l in lines for m in l.moves if l.moves]
+ Move.cancel(moves)
+ Move.delete(moves)
+
+ def get_move(self):
+ '''
+ Return Move instance for the inventory line
+ '''
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Uom = pool.get('product.uom')
+
+ qty = self.quantity
+ if qty is None:
+ if self.inventory.empty_quantity is None:
+ raise InventoryValidationError(
+ gettext('stock.msg_inventory_missing_empty_quantity',
+ inventory=self.inventory.rec_name))
+ if self.inventory.empty_quantity == 'keep':
+ return
+ else:
+ qty = 0.0
+
+ delta_qty = Uom.compute_qty(self.uom,
+ self.expected_quantity - qty,
+ self.uom)
+ if delta_qty == 0.0:
+ return
+ from_location = self.inventory.location
+ to_location = self.inventory.location.lost_found_used
+ if not to_location:
+ raise InventoryValidationError(
+ gettext('stock.msg_inventory_location_missing_lost_found',
+ inventory=self.inventory.rec_name,
+ location=self.inventory.location.rec_name))
+ if delta_qty < 0:
+ (from_location, to_location, delta_qty) = \
+ (to_location, from_location, -delta_qty)
+
+ return Move(
+ from_location=from_location,
+ to_location=to_location,
+ quantity=delta_qty,
+ product=self.product,
+ uom=self.uom,
+ company=self.inventory.company,
+ effective_date=self.inventory.date,
+ origin=self,
+ )
+
+ def update_values4complete(self, quantity):
+ '''
+ Return update values to complete inventory
+ '''
+ values = {}
+ # if nothing changed, no update
+ if self.expected_quantity == quantity:
+ return values
+ values['expected_quantity'] = quantity
+ return values
+
+ @classmethod
+ def create_values4complete(cls, inventory, quantity):
+ '''
+ Return create values to complete inventory
+ '''
+ return {
+ 'inventory': inventory.id,
+ 'expected_quantity': quantity,
+ }
+
+ @classmethod
+ def delete(cls, lines):
+ for line in lines:
+ if line.inventory_state not in {'cancelled', 'draft'}:
+ raise AccessError(
+ gettext('stock.msg_inventory_line_delete_cancel',
+ line=line.rec_name,
+ inventory=line.inventory.rec_name))
+ super(InventoryLine, cls).delete(lines)
+
+
+class Count(Wizard):
+ "Stock Inventory Count"
+ __name__ = 'stock.inventory.count'
+ start_state = 'search'
+
+ search = StateView(
+ 'stock.inventory.count.search',
+ 'stock.inventory_count_search_view_form', [
+ Button("End", 'end', 'tryton-cancel'),
+ Button("Select", 'quantity', 'tryton-forward', default=True),
+ ])
+ quantity = StateView(
+ 'stock.inventory.count.quantity',
+ 'stock.inventory_count_quantity_view_form', [
+ Button("Cancel", 'search', 'tryton-cancel'),
+ Button("Add", 'add', 'tryton-ok', default=True),
+ ])
+ add = StateTransition()
+
+ def default_quantity(self, fields):
+ pool = Pool()
+ InventoryLine = pool.get('stock.inventory.line')
+ Warning = pool.get('res.user.warning')
+ values = {}
+ lines = InventoryLine.search(
+ self.get_line_domain(self.record), limit=1)
+ if not lines:
+ warning_name = '%s.%s.count_create' % (
+ self.record, self.search.search)
+ if Warning.check(warning_name):
+ raise InventoryCountWarning(warning_name,
+ gettext('stock.msg_inventory_count_create_line',
+ search=self.search.search.rec_name))
+ line, = InventoryLine.create([self.get_line_values(self.record)])
+ else:
+ line, = lines
+ values['line'] = line.id
+ values['product'] = line.product.id
+ values['uom'] = line.uom.id
+ if line.uom.rounding == 1:
+ values['quantity'] = 1.
+ return values
+
+ def get_line_domain(self, inventory):
+ pool = Pool()
+ Product = pool.get('product.product')
+ domain = [
+ ('inventory', '=', inventory.id),
+ ]
+ if isinstance(self.search.search, Product):
+ domain.append(('product', '=', self.search.search.id))
+ return domain
+
+ def get_line_values(self, inventory):
+ pool = Pool()
+ Product = pool.get('product.product')
+ InventoryLine = pool.get('stock.inventory.line')
+ values = InventoryLine.create_values4complete(inventory, 0)
+ if isinstance(self.search.search, Product):
+ values['product'] = self.search.search.id
+ return values
+
+ def transition_add(self):
+ if self.quantity.line and self.quantity.quantity:
+ line = self.quantity.line
+ if line.quantity:
+ line.quantity += self.quantity.quantity
+ else:
+ line.quantity = self.quantity.quantity
+ line.save()
+ return 'search'
+
+
+class CountSearch(ModelView):
+ "Stock Inventory Count"
+ __name__ = 'stock.inventory.count.search'
+
+ search = fields.Reference(
+ "Search", [
+ ('product.product', "Product"),
+ ],
+ required=True,
+ domain={
+ 'product.product': [
+ ('type', '=', 'goods'),
+ ('consumable', '=', False),
+ ],
+ },
+ help="The item that's counted.")
+
+ @classmethod
+ def default_search(cls):
+ return 'product.product,-1'
+
+
+class CountQuantity(ModelView):
+ "Stock Inventory Count"
+ __name__ = 'stock.inventory.count.quantity'
+
+ line = fields.Many2One(
+ 'stock.inventory.line', "Line", readonly=True, required=True)
+ product = fields.Many2One('product.product', "Product", readonly=True)
+ uom = fields.Many2One('product.uom', "UOM", readonly=True,
+ help="The unit in which the quantities are specified.")
+ total_quantity = fields.Float(
+ "Total Quantity", digits='uom', readonly=True,
+ help="The total amount of the line counted so far.")
+
+ quantity = fields.Float(
+ "Quantity", digits='uom', required=True,
+ help="The quantity to add to the existing count.")
+
+ @fields.depends('quantity', 'line')
+ def on_change_quantity(self):
+ if self.line:
+ self.total_quantity = (
+ (self.line.quantity or 0) + (self.quantity or 0))
diff --git a/modules/stock/inventory.xml b/modules/stock/inventory.xml
new file mode 100644
index 0000000000..80815ee495
--- /dev/null
+++ b/modules/stock/inventory.xml
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+ stock.inventory
+ form
+ inventory_form
+
+
+ stock.inventory
+ tree
+ inventory_tree
+
+
+ Inventories
+ stock.inventory
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+ stock.inventory.line
+ form
+ inventory_line_form
+
+
+ stock.inventory.line
+ tree
+
+ inventory_line_tree
+
+
+ stock.inventory.line
+ tree
+
+ inventory_line_list_simple
+
+
+
+ Inventory Lines
+ stock.inventory.line
+
+
+
+ form_relate
+ stock.inventory,-1
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ confirm
+ Confirm
+ Are you sure you want to confirm the inventory?
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+ Are you sure you want to cancel the inventory?
+
+
+
+
+
+
+
+
+ complete_lines
+ Complete
+ Add an inventory line for each missing products
+
+
+
+
+ do_count
+ Count
+ Launch the wizard to count products
+
+
+
+
+ Count
+ stock.inventory.count
+ stock.inventory
+
+
+
+ stock.inventory.count.search
+ form
+ inventory_count_search_form
+
+
+
+ stock.inventory.count.quantity
+ form
+ inventory_count_quantity_form
+
+
+
+ Inventory
+
+
+
+
+
+
+
+
+
+
+
+ Inventory
+
+
+
+
+
diff --git a/modules/stock/ir.py b/modules/stock/ir.py
new file mode 100644
index 0000000000..e6b83dd701
--- /dev/null
+++ b/modules/stock/ir.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
+
+
+class Cron(metaclass=PoolMeta):
+ __name__ = 'ir.cron'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.method.selection.extend([
+ ('product.product|recompute_cost_price_from_moves',
+ "Recompute Cost Price from Moves"),
+ ('stock.shipment.out|reschedule',
+ "Reschedule Customer Shipments"),
+ ('stock.shipment.in.return|reschedule',
+ "Reschedule Supplier Return Shipments"),
+ ('stock.shipment.internal|reschedule',
+ "Reschedule Internal Shipments"),
+ ('stock.shipment.out|assign_cron',
+ "Assign Customer Shipments"),
+ ('stock.shipment.internal|assign_cron',
+ "Assign Internal Shipments"),
+ ])
diff --git a/modules/stock/locale/bg.po b/modules/stock/locale/bg.po
new file mode 100644
index 0000000000..49f3e1022a
--- /dev/null
+++ b/modules/stock/locale/bg.po
@@ -0,0 +1,3609 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Доставка"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Склад"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Доставка"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Местонахождение на клиент"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Склад"
+
+#, fuzzy
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Местонахождения"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Местонахождение на доставчик"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Местонахождение на клиент"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Местонахождение на доставчик"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Фабрична цена"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Фабрична цена"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Себестойност"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Планирано количество"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Себестойност"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Планирано количество"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Склад"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Последователност за пратка върната на доставик"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Последователност за пратка на доставчик"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Последователност на вътрешна пратка"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Последователност за пратка върната от клиент"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Последователност на пратка за клиент"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Последователност за пратка върната на доставик"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Последователност за пратка на доставчик"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Последователност на вътрешна пратка"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Последователност за пратка върната от клиент"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Последователност на пратка за клиент"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Местоположение"
+
+#, fuzzy
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Състояние"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Редове"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "Мер. ед."
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Очаквано количество"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Инвентаризация"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Дата"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Вътрешно количество"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "Мер. ед."
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Адрес"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Наследници"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Код"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Себестойност"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Планирани количества"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Вход"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Ляв"
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Загубени и намерени"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Изход"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Родител"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Количество"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Десетични единици"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Десен"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Склад"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Вид местонахождение"
+
+#, fuzzy
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Местонахождение на клиент"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Склад"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Склад"
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Склад"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Местонахождение на клиент"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Фабрична цена"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Единичната цена е задължителна"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Валута"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Ефективна дата"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "От местонахождение"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Вътрешно количество"
+
+#, fuzzy
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Източник"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Планирана дата"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Категория мер. ед. на продукт"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+#, fuzzy
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Изпращания"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Към местонахождение"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Единична цена"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Единична цена"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Единичната цена е задължителна"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Единична цена"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "Мер. ед."
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Пари в наличност"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Вътрешно количество"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Период"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Дата"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Движения"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Източник"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Себестойност"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Планирано количество"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Дата"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Наследници"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Име"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Родител"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "От местонахождение"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Период"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Дата"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Дата"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Вътрешно количество"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Дата"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Вътрешно количество"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Адрес за контакт"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Ефективна дата"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Входящи движения"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Движения на инвентаризация"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Източник"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Планирана дата"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Отпратка"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Местонахождение на доставчик"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Вход в склад"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Съхраняване в склад"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Адрес за доствка"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Ефективна дата"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "От местонахождение"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Източник"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Назначен"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Планирана дата"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Отпратка"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Състояние"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Към местонахождение"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Ефективна дата"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "От местонахождение"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Входящи движения"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Изходящи движения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Назначен"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Планирана дата"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Отпратка"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Към местонахождение"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Клиент"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Местонахождение на клиент"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Адрес за доствка"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Ефективна дата"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Движения на инвентаризация"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Източник"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Изходящи движения"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Опакован"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Планирана дата"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Отпратка"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Изход от склад"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Съхраняване в склад"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Фирма"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Адрес за контакт"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Клиент"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Местонахождение на клиент"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Ефективна дата"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Входящи движения"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Движения на инвентаризация"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Източник"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Планирана дата"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Отпратка"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Вход в склад"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Изход от склад"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"Целта-местонахождение по подразбиране когато се изпращат продукти на "
+"партньора."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"Целта-местонахождение по подразбиране когато се изпращат продукти на "
+"партньора."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Фабрична цена"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Движение на наличност"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Продукт по местонахождение"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Източник"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Източник"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Picking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Движение на наличност"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Фабрична цена"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Назначаване на пратка върната от доставчик"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "From Suppliers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "From Suppliers Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "To Customers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Получен"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Очакване"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Очакване"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Опакован"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Опакован"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Очакване"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Получен"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "Количествата на движение трябва да са положително число"
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "Количествата на движение трябва да са положително число"
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "Количеството на движение трябва да е положително число"
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"Не може да променяте мер. ед. на продукт който е свързан с движения на "
+"наличност."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"Не може да променяте мер. ед. на продукт който е свързан с движения на "
+"наличност."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+"Не може да променяте мер. ед. на продукт който е свързан с движения на "
+"наличност."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Валута"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Close"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Опакован"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Инвентаризация"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Инвентаризация"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Източник"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Изпращания"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventory & Stock"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Склад"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Продукт по местонахождение"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Фабрична цена"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stock"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Конфигуриране на наличност"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Инвентаризация на наличност"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Ред от наличност на продукт"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Ред от наличност на продукт"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Ред от наличност на продукт"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Местонахождение на наличност"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Input Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Output Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Съхраняване в склад"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Движение на наличност"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Период на наличност"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Продукт по местонахождение"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Продукт по местонахождение"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Пратка на доставчик"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Пратка върната от доставчик"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Вътрешно изпращане"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Пратка за клиент"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Пратка върната от клиент"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "От местонахождение"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Планирана дата:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Отпратка:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Списък за увеличаване наличност на продукт"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Номер на пратка:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Доставчик:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Към местонахождение"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Склад:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "От местонахождение"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "От местонахождение:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Вътрешно пратка"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Планирана дата:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Отпратка:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Номер на пратка:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Към местонахождение"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Към местонахождение:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Код на клиент:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Дата:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Бележка към доставка"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Отпратка:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Номер на пратка:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Клиент:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "От местонахождение"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Списък за опаковане"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Планирана дата:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Отпратка:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Номер на пратка:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Към местонахождение"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Склад:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Клиент"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "От местонахождение"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Планирана дата:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Отпратка:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Списък за увеличаване наличност на продукт"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Изпращания"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Към местонахождение"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Склад:"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipments"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Клиент"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Загубени и намерени"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Производство"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Склад"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Доставчик"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Изглед"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Склад"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Приключен"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Получен"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Изчакващ"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Проект"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Изчакващ"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Назначен"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Опакован"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Опакован"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Изчакващ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Получен"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Наличност"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Последователност за пратка върната от клиент"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Последователност на пратка за клиент"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Последователност на вътрешна пратка"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Вътрешно количество"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Инвентаризация"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Последователност"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Изпращания"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Последователност за пратка върната на доставик"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Последователност за пратка на доставчик"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Движения"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Себестойност"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Не могат да бъдат назначени следните продукти:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Изходящи движения"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "Добре"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recompute Cost Price"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/ca.po b/modules/stock/locale/ca.po
new file mode 100644
index 0000000000..69c9602cac
--- /dev/null
+++ b/modules/stock/locale/ca.po
@@ -0,0 +1,3410 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Enviament"
+
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Magatzems"
+
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Enviament"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Ubicació del client"
+
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Enviat als magatzems"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Ubicacions"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Ubicació del proveïdor"
+
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Tercer"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Ubicació del client"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Tercer"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Ubicació del proveïdor"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "A data"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "A data"
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Nou preu de cost"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Nou preu de cost"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de cost"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantitat prevista"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "De"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de cost"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantitat prevista"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Magatzem actual"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Seqüència d'inventari"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Seqüència d'albarà devolució proveïdor"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Seqüència d'albarà proveïdor"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Seqüència d'albarà intern"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Trànsit albarans interns"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Seqüència d'albarà devolució client"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Seqüència d'albarà client"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Trànsit albarans interns"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Seqüència d'inventari"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Seqüència d'albarà devolució proveïdor"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Seqüència d'albarà proveïdor"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Seqüència d'albarà intern"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Seqüència d'albarà devolució client"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Seqüència d'albarà client"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Quantitat en blanc"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Línia"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "Quantitat total"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Cerca"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Quantitat esperada"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventari"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "Estat inventari"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Quantitat actual"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Adreça"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr "Permetre recollida"
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Fills"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Codi"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de cost"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Fills plans"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantitat prevista"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Entrada"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Esquerra"
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Perdut i trobat"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Sortida"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Recollida"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "UdM quantitat"
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Dígits de la UdM de la quantitat"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Dreta"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Intern"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Tipus d'ubicació"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Ubicacions residus"
+
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Magatzems residus"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Temps d'espera"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Des del magatzem"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Al magatzem"
+
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Ubicació residu"
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Reserva obligatòria"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Preu de cost"
+
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Preu de cost obligatori"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Data efectiva"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Des d'ubicació"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantitat interna"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Origen"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Data estimada"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoria UdM del producte"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Albarà"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "A la ubicació"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Preu unitari"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Preu unitari obligatori"
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Preu unitari actualitzat"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Precalculat"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantitat interna"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Període"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Productes"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Només zona d'emmagatzematge"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr "Diferència de quantitat acumulada"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr "Quantitat final acumulada"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr "Quantitat acumulada inicial"
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr "Document"
+
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Origen"
+
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr "Consumible"
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de cost"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "UdM per defecte"
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Decimals de la UdM per defecte"
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantitat prevista"
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "A data"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "A data"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr "Sèries temporals"
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Fills"
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Des de la data"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr "Inclou perduts"
+
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Període"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Fins a la data"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr "Sèries temporals"
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantitat interna"
+
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr "Sèries temporals"
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantitat interna"
+
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Adreça de contacte"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Finalitzat per"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Data efectiva"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Moviments d'entrada"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Moviments interns"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Orígens"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Data estimada"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Rebut per"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Ubicació del proveïdor"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Magatzem entrada"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Magatzem intern"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Reservat per"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adreça d'enviament"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Finalitzat per"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Data efectiva"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Des de la ubicació"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Orígens"
+
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Reservat parcialment"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Data estimada"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "A la ubicació"
+
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Rebut per"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Finalitzat per"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Data efectiva"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Inici data efectiva"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Des de la ubicació"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Moviments d'entrada"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Moviments de sortida"
+
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Reservat parcialment"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Data estimada"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Data d'inici estimada"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Enviat per"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "A la ubicació"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "Ubicació en tránsit"
+
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Ubicació del client"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adreça d'enviament"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Finalitzat per"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Data efectiva"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Moviments interns"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Orígens"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Moviments de sortida"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Empaquetat per"
+
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Reservat parcialment"
+
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Recollit per"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Data estimada"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Magatzem sortida"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Magatzem intern"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Adreça de contacte"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Ubicació del client"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Finalitzat per"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Data efectiva"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Moviments d'entrada"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Moviments interns"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Orígens"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Data estimada"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Rebut per"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Referència"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Magatzem entrada"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Magatzem intern"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr "Marqueu per enviar mercaderies a aquesta adreça."
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr "Marqueu per utilitzar pels enviaments."
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"La ubicació de destinació predeterminada per enviar productes al tercer."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "La ubicació origen predeterminada per rebre productes del tercer."
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"La ubicació de destinació predeterminada per enviar productes al tercer."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "La ubicació origen predeterminada per rebre productes del tercer."
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Data a la que es calcula la quantitat d'existències.\n"
+"* Un valor buit realitza el càlcul el més llunya possible.\n"
+"* Una data al passat proporcionarà valors històrics."
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"Expressió Python que s'evaluarà amb:\n"
+"- cost_price: el preu de cost actual de producte"
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"Expressió Python que s'evaluarà amb:\n"
+"- cost_price: el preu de cost actual de producte"
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "El valor de les existències de la ubicació."
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "La quantitat d'existències que s'espera tenir a la ubicació."
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr "La quantitat d'existències a la ubicació."
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "El valor de les existències de la ubicació."
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "La quantitat d'existències que s'espera tenir a la ubicació."
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr "La quantitat d'existències a la ubicació."
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr "El magatzem al que treball l'usuari."
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr "Utilitzat per generar el nombre que es dona als inventaris."
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+"Utilitzat per generar el nombre que es dona als albarans de devolució de "
+"proveïdor."
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+"Utilitzat per generar el nombre que es dona als albarans de proveïdor."
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr "Utilitzat per generar el nombre que es dona als albarans interns."
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"La ubicació per defecte de les existències que estan en trànsit entre "
+"magatzems."
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+"Utilitzat per generar el nombre que es dona als albarans de devolució de "
+"client."
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr "Utilitzat per generar el nombre que es dona als albarans de client."
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"La ubicació per defecte de les existències que estan en trànsit entre "
+"magatzems."
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr "L'empresa amb la que està associada l'inventari."
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr "La data quan es fa el recompte de productes."
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Com es gestionen les línies sense quantitat."
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr "La ubicació inventariada."
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr "L'identificador principal de l'inventari."
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr "L'estat actual del inventari."
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr "La quantitat a afegir al recompte actual."
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr "La quantitat total de la línia comptada fins ara."
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr "La unitat amb la que s'especifiquen les quantitats."
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr "L'element que es compta."
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr "La quantitat que el sistema creu que ha d'haver a la ubicació."
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr "L'inventari al que pertany la línia."
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr "La quantitat real que es troba a la ubicació."
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "La unitat en que s'especifica la quantitat."
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr "Utilitzat per afegir una estructura per sota la ubicació."
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr "L'identificador intern utilitzat per la ubicació."
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "El valor de les existències de la ubicació."
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr "Marqueu per forçar un sol nivell de fills sense nets."
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "La quantitat d'existències que s'espera tenir a la ubicació."
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr "D'on es reben les existències entrants."
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+"Utilitzat pels inventaris per a corregir els nivells d'existències al "
+"magatzem."
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr "On s'envien les existències sortints."
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr "Utilitzat per afegir una estructura per sobre la ubicació."
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+"De d'on es recullen les existències.\n"
+"Deixeu-ho en blanc per utilitzar la ubicació d'emmagatzematge."
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr "La quantitat d'existències a la ubicació."
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr "La ubicació superior on s'emmagatzemen les existències."
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+"Les ubicacions que s'utilitzen pels residus de productes del magatzem."
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr "El magatzem que utilitza la ubicació per residus de productes."
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr "El temps que es triga a moure les existències entre els magatzems."
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr "L'empresa a la que s'associa el moviment d'existències."
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "La moneda en que s'especifica el preu unitari."
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr "Quan s'han enviat realment les existències."
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Des d'on es mouen les existències."
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr "El origen del moviment d'existències."
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr "Quan està previst moure les existències."
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr "El producte al que s'associa el moviment."
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr "La quantitat d'existències que es mouen."
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr "Utilitzat per agrupar varis moviments d'existències conjuntament."
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr "L'estat actual del moviment d'existències."
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr "On s'envien les existències."
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr "Preu unitari amb la divisa de l'empresa."
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "La unitat en la que s'especifica la quantitat."
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr "L'empresa amb la que s'associa el període d'existències."
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr "Quan finalitza el període d'existències."
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr "L'estat actual del període d'existències."
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr "Marqueu per utilitzar només la quantitat de la zona d'emmagatzematge."
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr "El magatzem pel qual es calculen les quantitats."
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Data a la que es calcula la quantitat d'existències.\n"
+"* Un valor buit realitza el càlcul més llunya possible.\n"
+"* Una data al passat proporcionarà valors històrics."
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+"Si es marca, s'inclou el cost del producte que s'ha mogut a les ubicacions "
+"de Perdut i trobat."
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr "Els moviments que no s'han reservat."
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr "L'empresa a la que està associada l'albarà."
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr "La direcció a la que es pot contractar el proveïdor."
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr "Quan s'han enviat realment les existències."
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Els moviments que porten les existències al magatzem."
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "Els moviments que porten les existències a la zona d'emmagatzemament."
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identificador principal de l'albarà."
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr "Quan s'espera rebre les existències."
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "L'identificador del proveïdor per l'albarà."
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr "L'estat actual de l'albarà."
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr "El tercer que ha comprat les existències."
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr "On es reben les existències."
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "L'empresa a la que està associada l'albarà."
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "On s'envien les existències."
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr "Quan s'han retornat realment les existències."
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Des d'on es mouen les existències."
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr "El moviments que retornen les existències al proveïdor."
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identificador principal de l'albarà."
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Quan està previst que es retornin les existències."
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "L'identificador del proveïdor per l'albarà."
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr "L'estat actual de l'albarà."
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr "El tercer que subministra les existències."
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr "On es mouen les existències."
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr "L'empresa a la que està associada l'albarà."
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr "Quan s'ha completat realment l'albarà."
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr "Quan s'han enviat realment les existències."
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Des d'on es mouen les existències."
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr "Els moviments que reben les existències."
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr "Els moviments que realitzen l'albarà."
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identificador principal de l'albarà."
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr "Els moviments que envien les existències."
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr "Quan s'espera que es completi l'albarà."
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Quan està previst que s'enviïn les existències."
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr "L'identificador extern de l'albarà."
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr "L'estat actual de l'albarà."
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr "On es mouen les existències."
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr "On es troben les existències mentre estan en trànsit entre magatzems."
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Des d'on s'envien les existències."
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr "L'empresa a la que està associada l'albarà."
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr "El tercer que ha comprat les existències."
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "On s'envien les existències."
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Quan s'han enviat realment les existències."
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+"Els moviments que agafen les existències des de la zona d'emmagatzemament."
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identificador principal de l'albarà."
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr "Els moviments que envien les existències al client."
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Quan està previst enviar les existències."
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "L'identificador del client per l'albarà."
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr "L'estat actual de l'albarà."
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Des d'on s'envien les existències."
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "L'empresa a la que està associada l'albarà."
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr "La direcció a la que es pot contactar el client."
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr "El tercer que ha comprat les existències."
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr "Quan s'han retornat les existències."
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Els moviments que porten les existències al magatzem."
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "Els moviments que treuen les existències de la zona d'emmagatzematge."
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identificador principal de l'albarà."
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Quan està previst que les existències es tornin."
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "L'identificador del client per l'albarà."
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr "L'estat actual de l'albarà."
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr "On es retornen les existències."
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventaris"
+
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Línies d'inventari"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Ubicacions"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Temps d'espera entre ubicacions"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Quantitat per ubicacions (llistat)"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Quantitat per ubicacions"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Ubicacions"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Períodes"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Revisió del preu de cost"
+
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Moviments d'existències"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Quantitats de producte per magatzem"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Moviments per magatzem"
+
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Producte per ubicacions"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr "Marges per categoria"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr "Marges per categoria"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr "Marges per categoria"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Marges"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Marges"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr "Marges per producte"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr "Marges per producte"
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Albarans de proveïdor"
+
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Devolucions de proveïdor"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Albarans interns"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Albarans de client"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Albarans de client"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Albarans de proveïdors"
+
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Devolucions de client"
+
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Llista de proveïment"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Albarans interns"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Nota d'enviament"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Llista de recollida"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Llista de proveïment"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "Recompte"
+
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Quantitats de producte per magatzem"
+
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Moviments d'existències"
+
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Modificar el preu de cost"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recalcula preu de cost"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Reserva l'albarà de devolució de proveïdor"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Reserva l'abarà intern"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "Reserva albarà de client"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "De proveïdors"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "De proveïdors en espera"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "A clients"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Rebut"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Reservat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Reservat parcialment"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Reservat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Reservat parcialment"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Sol·licitud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Enviat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Reservat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Reservat parcialment"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Empaquetat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Recollit"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Rebut"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+"No podeu eliminar el tercer \"%(party)s\" mentre tingui albarans pendents "
+"amb l'empresa \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"El preu de cost \"%(cost_price)s\" del producte \"%(producte)\" és invalid "
+"amb l'excepció \"%(exception)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr "No s'ha trobat cap línia per la cerca %(search)s."
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr "Els inventaris \"%(inventories)s\" tenen dates al futur."
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr "Per eliminar l'inventari \"%(inventory)s\" l'heu de cancel·lar."
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+"Per eliminar la línia d'inventari \"%(line)s\" heu de cancel·lar l'inventari"
+" \"%(inventory)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "La quantitat de la línia d'inventari ha de ser positiva."
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+"La línia d'inventari \"%(line)s\" no es única dins l'inventari "
+"\"%(inventory)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+"Per confirmar l'inventari \"%(inventory)s\" heu d'establir una ubicació de "
+"perdut i trobat en algun dels pares de l'ubicació \"%(location)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+"Per confirmar l'inventari \"%(inventory)s\" heu de seleccionar una opció per"
+" la quantitat buida."
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+"Per establir una ubicació \"%(location)s\" com a "
+"emmagatzematge/entrada/sortida del magatzem \"%(warehouse)s\", ha d'estar al"
+" magatzem."
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr "Per desactivar la ubicació \"%(location)s\" primer l'heu de buidar."
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+"No podeu canviar el tipus d'ubicació de \"%(location)s\" a \"%(type)s\"\n"
+"perquè el tipus no suporta moviments i la ubicació els te."
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+"Per modificar el moviment d'existències \"%(move)s\" heu de cancel·lar-lo o "
+"restablir el seu estat a esborrany."
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr "Els moviments \"%(moves)s\" tenen una data efectiva al futur."
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+"L'origen i la destinació del moviment d'existències ha de ser diferent."
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "La quantitat interna del moviment intern ha de ser positiva."
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+"Per modificar el moviment d'existències \"%(move)s\" heu de restablir el seu"
+" estat a esborrany."
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+"No podeu modificar el moviment d'existències \"%(move)s\" perquè està "
+"cancel·lat."
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+"No podeu modificar el moviment d'existències \"%(move)s\" perquè està "
+"realitzat."
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+"Per modificar el moviment d'existències \"%(move)s\" heu de tornar a obrir "
+"el període \"%(period)s\"."
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr "Els moviments d'existències \"%(moves)s\" no tenen origen."
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "La quantitat a moure ha de ser positiva."
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr "No podeu tancar períodes que conten moviments reservats."
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr "No podeu tancar períodes amb data d'avui o en el futur."
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"No podeu canviar el preu de cost d'un producte que està associat amb moviments d'existències.\n"
+"Heu d'executar l'assistent \"Modifica preu de cost\"."
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"No podeu canviar la UdM per defecte d'un producte que està associat amb "
+"moviments d'existències."
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+"No podeu canviar el tipus d'un producte que està associat amb moviments "
+"d'existències."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+"El producte \"%(product)s\" encara té algunes quantitats a les ubicacions "
+"\"%(locations)s\" per a l'empresa \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+"Es recomanable buidar les existències de les ubicacions d'emmagatzematge "
+"abans de desactivar el producte."
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr "Per eliminar l'albarà \"%(shipment)s\" primer l'heu de cancel·lar."
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+"Per empaquetar l'enviament \"%(shipment)s\" heu de realitzar els moviments "
+"de l'inventari."
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr "Marge"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr "Tendència marge"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr "Benefici"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr "Ingressos"
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr "Segur que vols cancel·lar l'inventari?"
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr "Segur que vols confirmar l'inventari?"
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr "Segur que vols cancel·lar el moviment?"
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr "Segur que vols finalitzar el moviment?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Segur que vols rebre l'albarà?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Segur que vols finalitzar l'albarà?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Segur que vols finalitzar l'albarà?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Segur que vols rebre l'albarà?"
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Afegeix una línia d'inventari per cada producte que falta"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "Obre el assistent per fer recompte de productes"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "Completa"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirma"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "Recompte"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Finalitza"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Restaura a esborrany"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Tanca"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Finalitza"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Restaura a esborrany"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Rebre"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Reserva"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Finalitza"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "En espera"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Reserva"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Finalitza"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Envia"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "En espera"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Reserva"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Finalitza"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Empaqueta"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "Recull"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Finalitza"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Rebre"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "En espera"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventari"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Albarà de proveïdor"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Albarà de devolució de proveïdor"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Albarà intern"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Albarà de client"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Albarà de devolució de client"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventari"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Albarà de proveïdor"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Albarà de devolució de proveïdor"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Albarà intern"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Albarà de client"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Albarà de devolució de client"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventaris"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Ubicacions"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Ubicacions"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Temps d'espera entre ubicacions"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Ubicacions"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Períodes"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Marges"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Albarans"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Albarans de proveïdor"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Devolucions de proveïdor"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Albarans interns"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Albarans de client"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Devolucions de client"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Logística"
+
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuració"
+
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Tercer entregat al magatzem"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Ubicació del tercer"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Producte per ubicacions"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr "Revisió de preu de cost"
+
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Modificar el preu de cost"
+
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recalcula preu de cost"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Logística"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Administració de logística"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Forçar reserves a logística"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Configuració d'existències"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "Configuració d'ubicacions d'existències"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr "Configuració de seqüencies d'existències"
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Inventari d'existències"
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Recompte d'inventari"
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Recompte d'inventari"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Línia d'inventari d'existències"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Ubicació d'existències"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Zona d'entrada"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Perdut i trobat"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Zona de sortida"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Zona d'emmagatzematge"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Trànsit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Ubicació temps d'espera"
+
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Ubicació de residus del magatzem"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Moviment d'existències"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Període d'existències"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "Període d'existències precalculat"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Quantitats de producte per magatzem"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Quantitats de producte per magatzem"
+
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Quantitats de producte per moviments de magatzem"
+
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Productes per ubicacions"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Producte per ubicacions"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Informe de marges per categoria"
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Informe de marges per categoria"
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Informe de marges per categoria"
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr "Contexte dels informes de marges"
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr "Informe de marge d'estoc"
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr "Informe de marge d'estoc"
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr "Informe de marges per producte"
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr "Informe de marges per producte"
+
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Reserva l'albarà"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Albarà de proveïdor"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Albarà devolució proveïdor"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Albarà intern"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Albarà client"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Albarà devolució client"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Des de la ubicació"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Data estimada:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Referència:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Llista de proveïment"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Número d'albarà"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Proveïdor:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "A la ubicació"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Magatzem:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Des de la ubicació"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Des de la ubicació:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Albarà intern"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Data estimada:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Referència:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Número d'albarà"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "A la ubicació"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "A la ubicació:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Codi de client:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Nota d'enviament"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Referència:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Número d'albarà:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Client:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Des d'ubicació"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Llista de recollida"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Data estimada:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Referència:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Número d'albarà"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "A la ubicació"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Magatzem:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "D'ubicació"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Data estimada:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Referència:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Llista de proveïment"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Albarà"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "A la ubicació"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Magatzem:"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Reserva els albarans de client"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Reserva els albarans interns"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recalcula preu de cost a partir dels moviments"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Replanifica els albarans de client"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Replanifica els albarans interns"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Replanifica els albarans de devolució de proveÏdor"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "Buit"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "Manté"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "Enviament directe"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Perdut i trobat"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Intern"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Reservat"
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr "En procés"
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Tancat"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr "Dia"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr "Mes"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr "Any"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Rebut"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Reservat"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Reservat"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Sol·licitud"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Enviat"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Reservat"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Empaquetat"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Recollit"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Finalitzat"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Rebut"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Logística"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr "El magatzem al que estas treballant."
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Seqüència de devolucions de client"
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Seqüència de clients"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Seqüència interns"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Trànsit intern"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventari"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Seqüència"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Albarans"
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Seqüència de devolució de proveïdor"
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Seqüència de proveïdor"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Valor de cost"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr "Ingressos"
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr "Ingressos"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr "Ingressos"
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "No es poden reservar aquests productes:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Informació addicional"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Moviments de sortida"
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "D'acord"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recalcula"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "Afegeix"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "Finalitza"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "Selecciona"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Espera"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr "Força"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr "Ignora"
diff --git a/modules/stock/locale/cs.po b/modules/stock/locale/cs.po
new file mode 100644
index 0000000000..1a2d8b757d
--- /dev/null
+++ b/modules/stock/locale/cs.po
@@ -0,0 +1,3537 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Delivery Note"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Locations"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Locations"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Locations"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr ""
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr ""
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Warehouse"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Recompute Cost Price"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Moves"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Periods"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Packed"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Moves"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Warehouse"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "From Suppliers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "From Suppliers Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "To Customers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Packed"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Close"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Packed"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Supplier Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventory & Stock"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Warehouse"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr ""
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+#, fuzzy
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Stock Configuration"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr ""
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Input Zone"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Output Zone"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Storage Zone"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Warehouse"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr ""
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr ""
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Warehouse"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Supplier"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Customer"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipments"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Close"
+
+#, fuzzy
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Receive"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Receive"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Supplier Shipment"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Moves"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr ""
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recompute Cost Price"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/de.po b/modules/stock/locale/de.po
new file mode 100644
index 0000000000..8fb6187c43
--- /dev/null
+++ b/modules/stock/locale/de.po
@@ -0,0 +1,3428 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Lieferadresse"
+
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Logistikstandorte"
+
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Lieferung"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Lagerort Kunde"
+
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Lieferung an Logistikstandort"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Lagerorte"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lagerort Lieferant"
+
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Logistikstandort"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Partei"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Lagerort Kunde"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Partei"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lagerort Lieferant"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Ermittlungsdatum"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Ermittlungsdatum"
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Neuer Einstandspreis"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Neuer Einstandspreis"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Kosten"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Voraussichtliche Menge"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "Ab"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Kosten"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Voraussichtliche Menge"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Aktueller Logistikstandort"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Nummernkreis Inventur"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Nummernkreis Warenrückgabe (an Lieferanten)"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Nummernkreis Wareneingangslieferung"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Nummernkreis Interne Lieferungen"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Transit Interne Lieferung"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Nummernkreis Warenrücknahme (von Kunden)"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Nummernkreis Warenausgangslieferungen"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Transit Interne Lieferung"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Nummernkreis Inventur"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Nummernkreis Warenrückgabe (an Lieferanten)"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Nummernkreis Wareneingangslieferung"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Nummernkreis Interne Lieferung"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Nummernkreis Warenrücknahme (von Kunden)"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Nummernkreis Warenausgangslieferung"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Positionen ohne Erfassung"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Position"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Gezählte Menge"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "Ermittelte Gesamtmenge"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "Maßeinheit"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Suchen"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Erwartete Menge"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventur"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Lagerort"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "Inventurstatus"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Ermittelte Menge"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "Maßeinheit"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Adresse"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr "Abholung zulassen"
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Untergeordnet (Lagerorte)"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Kosten"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Hierarchielose Lagerplätze"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Voraussichtliche Menge"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Eingang"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Links"
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Inventurdifferenz"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Ausgang"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Übergeordnet (Lagerort)"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Lagerort Picking"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Maßeinheit Menge"
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Nachkommastellen Maßeinheit Menge"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Rechts"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Lager"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Lagertyp"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Reste Lagerort"
+
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Reste Logistikstandort"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Beschaffungszeit"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Von Logistikstandort"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Zu Logistikstandort"
+
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Reste Lagerort"
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Reservierung erforderlich"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Einstandspreis"
+
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Einstandspreis erforderlich"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Effektives Datum"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Von Lagerort"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Interne Menge"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Herkunft"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Geplantes Datum"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Maßeinheitenkategorie"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Lieferung"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Zu Lagerort"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Einzelpreis"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Einzelpreis erforderlich"
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Einzelpreis aktualisiert"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "Einheit"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Cache-Speicher"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Interne Menge"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Lagerort"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Lagerbuchungszeiträume"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Nur Lagerzone"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr "Kumulativer Mengenunterschied"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr "Kumulative Menge Ende"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr "Kumulative Menge Start"
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr "Dokument"
+
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Warenbewegung"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Herkunft"
+
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr "Verbrauchsmaterial"
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Kosten"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "Standardeinheit"
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Standardmaßeinheit Nachkommastellen"
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Voraussichtliche Menge"
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "Ermittlungsdatum"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "Ermittlungsdatum"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr "Zeitreihe"
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Untergeordnet (Artikelkategorie)"
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Übergeordnet (Artikelkategorie)"
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Von Datum"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr "Inklusive Inventurdifferenz"
+
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Lagerzeiträume"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Bis Datum"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr "Zeitreihe"
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Interne Menge"
+
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr "Zeitreihe"
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Interne Menge"
+
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Kontaktadresse"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Erledigt durch"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Effektives Datum"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Eingehende Warenbewegungen"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Bestandsänderungen"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Herkünfte"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Geplantes Datum"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Entgegen genommen von"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Referenz"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lagerort Lieferant"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Logistikstandort Eingang"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Logistikstandort Lagerung"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Reserviert von"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Lieferadresse"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Erledigt durch"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Effektives Datum"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Von Lagerort"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Herkünfte"
+
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Teilweise Reserviert"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Geplantes Datum"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Referenz"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Zu Lagerort"
+
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Entgegen genommen von"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Erledigt durch"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Effektives Datum"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Effektives Startdatum"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Von Lagerort"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Eingehende Warenbewegungen"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Ausgehende Warenbewegungen"
+
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Teilweise Reserviert"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Geplantes Datum"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Geplantes Startdatum"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Referenz"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Versendet durch"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Zu Lagerort"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "Transitlagerort"
+
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Lagerort Kunde"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Lieferadresse"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Erledigt durch"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Effektives Datum"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Bestandsänderungen"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Herkünfte"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Ausgehende Warenbewegungen"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Verpackt durch"
+
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Teilweise Reserviert"
+
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Kommissioniert durch"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Geplantes Datum"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Referenz"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Logistikstandort Ausgang"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Logistikstandort Lagerung"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Kontaktadresse"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Lagerort Kunde"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Erledigt durch"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Effektives Datum"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Eingehende Warenbewegungen"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Bestandsänderungen"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Herkünfte"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Geplantes Datum"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Entgegen genommen von"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Referenz"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Logistikstandort Eingang"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Logistikstandort Lagerung"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr "Aktivieren um die Lieferungen an diese Adresse zu versenden."
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+"Aktivieren um die Kontaktinformation für die Kommunikation mit Bezug zu "
+"Lieferungen zu nutzen."
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "Standardbestimmungsort für Lieferungen an die Partei."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "Standardherkunftsort für von der Partei erhaltene Lieferungen."
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "Standardbestimmungsort für Lieferungen an die Partei."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "Standardherkunftsort für von der Partei erhaltene Lieferungen."
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Das Datum für das der Lagerbestand berechnet wird.\n"
+"* Ein leerer Wert berechnet den Lagerbestand so weit voraus wie möglich.\n"
+"* Ein Datum in der Vergangenheit berechnet historische Lagerbestände."
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"Ein Pythonausdruck, der ausgewertet wird mit:\n"
+"- cost_price: Der aktuelle Einstandspreis des Artikels"
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"Ein Pythonausdruck, der ausgewertet wird mit:\n"
+"- cost_price: Der aktuelle Einstandspreis des Artikels"
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "Der Wert des Lagerbestands im Lagerort."
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "Der erwartete Lagerbestand im Lagerort."
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr "Der Lagerbestand im Lagerort."
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "Der Wert des Lagerbestands im Lagerort."
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "Der erwartete Lagerbestand im Lagerort."
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr "Der Lagerbestand im Lagerort."
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr "Der Logistikstandort in dem der Benutzer arbeitet."
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr "Wird zur Generierung von Nummern für Inventuren genutzt."
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+"Wird zur Generierung von Nummern für Rückgaben an Lieferanten genutzt."
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+"Wird zur Generierung von Nummern für Wareneingangslieferungen genutzt."
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr "Wird zur Generierung von Nummern für interne Lieferungen genutzt."
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"Standardlagerort der für Lieferungen zwischen Logistikstandorten benutzt "
+"wird."
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+"Wird zur Generierung von Nummern für Warenrücknahmen von Kunden genutzt."
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+"Wird zur Generierung von Nummern für Warenausgangslieferungen genutzt."
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"Standardlagerort der für Lieferungen zwischen Logistikstandorten benutzt "
+"wird."
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr "Das Unternehmen für das die Inventur angefertigt wird."
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr "Das Datum der Bestandszählung."
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Bestimmt wie Positionen ohne erfasste Menge behandelt werden."
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr "Der Lagerort für den die Bestandsermittlung erfolgt."
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr "Das Hauptidentifizierungsmerkmal für die Inventur."
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr "Der aktuelle Status der Inventur."
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr "Die Anzahl, die der aktuellen Zählung hinzugefügt wird."
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr "Die bisher gezählte Menge der Inventurpositionen."
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr "Die Maßeinheit in der die Menge angegeben wird."
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr "Das Element für das gezählt wird."
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr "Die vom System für den Lagerort berechnete Menge."
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr "Die Inventur zu der die Inventurposition gehört."
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr "Die tatsächliche gezählte Menge für den Lagerort."
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "Die Maßeinheit in der die Menge angegeben wird."
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr "Wird zum Hinzufügen von untergeordneten Lagerorten genutzt."
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr "Das interne Identifizierungsmerkmal für den Lagerort."
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "Der Wert des Lagerbestands im Lagerort."
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr "Aktivieren, um nur eine Stufe untergeordneter Lagerorte zuzulassen."
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "Der erwartete Lagerbestand im Lagerort."
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr "Wo eingehende Lieferungen angenommen werden."
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+"Wird von Inventuren zur Korrektur des Warenbestands im Logistikstandort "
+"verwendet."
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr "Wo ausgehende Lieferungen versandt werden."
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr "Wird zum Hinzufügen eines übergeordneten Lagerorts genutzt."
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+"Wo Warenbestand entnommen wird.\n"
+"Leer lassen, um die Lagerzone zu verwenden."
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr "Der Lagerbestand im Lagerort."
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr "Die oberste Ebene der Lagerzone in der Ware gelagert wird."
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr "Der Lagerort der für Reste aus dem Logistikstandort verwendet wird."
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr "Die Logistikstandorte die diesen Lagerort für Reste verwenden."
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+"Die Zeit, die für Lieferungen zwischen Logistikstandorten benötigt wird."
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr "Das Unternehmen für das die Warenbewegung erfasst wird."
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "In dieser Währung ist der Einzelpreis angegeben."
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr "Zeitpunkt an dem die Ware tatsächlich bewegt wurde."
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Lagerort aus dem die Ware entnommen wird."
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr "Die Herkunft der Warenbewegung."
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr "Zeitpunkt an dem die Warenbewegung voraussichtlich stattfinden soll."
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr "Der Artikel für den die Lagerwegung erfasst wird."
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr "Die Menge die im Lager bewegt wird."
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr "Wird zum Gruppieren mehrere Warenbewegung genutzt."
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr "Der aktuelle Status der Warenbewegung."
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Lagerort zu dem die Ware bewegt wird."
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr "Einzelpreis in Unternehmenswährung."
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "Die Maßheit in der die Menge angegeben ist."
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr "Das Unternehmen für das der Lagerbuchungszeitraum erfasst wird."
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr "Das Ende des Lagerbuchungszeitraums."
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr "Der aktuelle Status des Lagerbuchungszeitraums."
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr "Auswählen, um nur die Menge der Lagerzone zu verwenden."
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr "Der Logistikstandort für den die Mengen berechnet werden."
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Das Datum für das der Lagerbestand berechnet wird.\n"
+"* Ein leerer Wert berechnet den Lagerbestand so weit voraus wie möglich.\n"
+"* Ein Datum in der Vergangenheit berechnet historische Lagerbestände."
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+"Bei Aktivierung werden die Kosten von Artikeln berücksichtigt, die über ein "
+"Inventurdifferenzlager ausgebucht wurden."
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr "Die Warenbewegungen, die nicht reserviert wurden."
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr "Das Unternehmen für das die Lieferung erfasst wird."
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr "Der Lieferant kann unter dieser Adresse kontaktiert werden."
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr "Zeitpunkt an dem die Ware tatsächlich angenommen wurde."
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Die Warenbewegungen für den Wareneingang."
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "Die Warenbewegungen zur Einlagerung in die Lagerzone."
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr "Das Hauptidentifizierungsmerkmal der Lieferung."
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr "Zeitpunkt an dem der Wareneingang erwartet wird."
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "Das Identifizierungsmerkmal des Lieferanten für die Lieferung."
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr "Der aktuelle Status der Lieferung."
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Die Partei, die Waren an das Lager liefert."
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr "Wo die Ware angenommen wird."
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "Das Unternehmen für das die Lieferung erfasst wird."
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Adresse an die Ware aus dem Lager geliefert wird."
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr "Zeitpunkt an dem die Ware tatsächlich zurückgesandt wurde."
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Lagerort aus dem die Ware entnommen wird."
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr "Die Warenbewegungen für die Warenrückgabe an den Lieferanten."
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "Das Hauptidentifizierungsmerkmal für die Lieferung."
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+"Zeitpunkt an dem die Warenrückgaben an den Lieferanten planmäßig erfolgen "
+"soll."
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "Das Identifizierungsmerkmal des Lieferanten für die Lieferung."
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr "Der aktuelle Status der Lieferung."
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Die Partei die Waren in das Lager liefert."
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Der Lagerort zu dem die Ware bewegt wird."
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr "Das Unternehmen für das die Lieferung erfasst wird."
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr "Zeitpunkt an dem die Lieferung tatsächlich erledigt wurde."
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr "Zeitpunkt an dem die Ware tatsächlich versandt wurde."
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Lagerort aus dem die Ware entnommen wird."
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr "Die Warenbewegungen für den Wareneingang."
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr "Die Warenbewegungen für die Lieferung."
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr "Das Hauptidentifizierungsmerkmal für die Lieferung."
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr "Die Warenbewegungen für den Warenversand."
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr "Zeitpunkt an dem die Lieferung planmäßig erledigt sein soll."
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Zeitpunkt an dem die Ware planmäßig versandt werden soll."
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr "Das externe Identifizierungsmerkmal für die Lieferung."
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr "Der aktuelle Status der Lieferung."
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Lagerort zu dem die Ware bewegt wird."
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+"Lagerort an dem die Ware während des Transit zwischen Logistikstandorten "
+"geführt wird."
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Logistikstandort aus dem die Ware versandt wird."
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr "Das Unternehmen für das die Lieferung erfasst wird."
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr "Die Partei die Waren aus dem Lager kauft."
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Adresse an die Ware aus dem Lager geliefert wird."
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Zeitpunkt an dem die Ware tatsächlich versandt wurde."
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+"Die Warenbewegungen mit denen die Ware aus der Lagerzone entnommen wird."
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr "Das Hauptidentifizierungsmerkmal der Lieferung."
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr "Die Warenbewegungen mit denen die Ware an den Kunden versandt wird."
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Zeitpunkt an dem die Ware planmäßig versandt werden soll."
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "Das Identifizierungsmerkmal des Kunden für die Lieferung."
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr "Der aktuelle Status der Lieferung."
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Logistikstandort aus dem die Ware versandt wird."
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "Das Unternehmen für das die Lieferung erfasst wird."
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr "Der Kunde kann unter dieser Adresse kontaktiert werden."
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr "Die Partei die Waren aus dem Lager kauft."
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr "Zeitpunkt an dem die Ware tatsächlich zurückgegeben wurde."
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+"Die Warenbewegungen mit denen die Ware in den Logistikstandort "
+"zurückgenommen wird."
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+"Die Warenbewegungen mit denen die Ware in die Lagerzone eingelagert wird."
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "Das Hauptidentifizierungsmerkmal der Lieferung."
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Zeitpunkt an dem die Ware planmäßig zurückgegeben werden soll."
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "Das Identifizierungsmerkmal des Kunden für die Lieferung."
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr "Der aktuelle Status der Lieferung."
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr "Logistikstandort an den die Ware zurückgegeben wird."
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventuren"
+
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventurpositionen"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Lagerorte"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Beschaffungszeiten zwischen Logistikstandorten"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Lagerbestand je Lagerort"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Lagerbestand (Strukturansicht)"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Lagerorte"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Lagerperioden"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Einstandspreisänderung"
+
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Lagerbestand je Logistikstandort (Zeitreihe)"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Warenbewegungen je Logistikstandort"
+
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Artikel je Lagerort"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr "Marge pro Artikelkategorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr "Marge pro Artikelkategorie (Zeitreihe)"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr "Marge pro Artikelkategorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Margen"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Margen"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr "Margen pro Artikel"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr "Margen pro Artikel"
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Wareneingangslieferungen"
+
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Warenrückgaben (an Lieferanten)"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Interne Lieferungen"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Warenausgangslieferungen"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Warenausgangslieferungen"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Wareneingangslieferungen"
+
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Warenrücknahmen (von Kunden)"
+
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Einlagerungsliste"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Interne Lieferung"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Lieferschein"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Pickliste"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Einlagerungsliste"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "Anzahl"
+
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Artikelanzahl je Logistikstandort"
+
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Einstandspreis ändern"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Einstandspreis neu berechnen"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Reservierung Warenrückgabe (an Lieferanten)"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Interne Lieferung reservieren"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "Warenausgangslieferung reservieren"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "Von Lieferanten"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "Von Lieferanten wartend"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "Zu Kunden"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Erhalten"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Reserviert"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Teilweise Reserviert"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Reserviert"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Teilweise Reserviert"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Anforderungen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Versendet"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Reserviert"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Teilweise Reserviert"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Verpackt"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Kommissioniert"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Erhalten"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+"Partei \"%(party)s\" kann nicht gelöscht werden solange noch Lieferungen bei"
+" Unternehmen \"%(company)s\" ausstehen."
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"Ungültiger Einstandspreis \"%(cost_price)s\" für Artikel \"%(product)s\" mit"
+" Ausnahme \"%(exception)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr "Keine Position für \"%(search)s\" gefunden."
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr "Die Inventuren \"%(inventories)s\" haben ein Datum in der Zukunft."
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+"Inventur \"%(inventory)s\" muss annullliert werden, damit sie gelöscht "
+"werden kann."
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+"Inventur \"%(inventory)s\" muss annulliert werden, damit "
+"Lagerbestandsposition \"%(line)s\" gelöscht werden kann."
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "Menge des Lagerbestands muss positiv sein."
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+"Die Lagerbestandsposition \"%(line)s\" von Inventur \"%(inventory)s\" ist "
+"nicht eindeutig."
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+"Damit die Inventur \"%(inventory)s\" bestätigt werden kann, muss zuerst eine"
+" Einstellung für die Inventurdifferenz auf einem übergeordneten Lagerort von"
+" \"%(location)s\" gesetzt werden."
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+"Damit die Inventur \"%(inventory)s\" bestätigt werden kann, muss zuerst eine"
+" Option zur Behandlung von leeren Mengen ausgewählt werden."
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+"Damit der Lagerort \"%(location)s\" als Lagerzone/Wareneingang/Warenausgang "
+"für den Logistikstandort \"%(warehouse)s\" verwendet werden kann, muss er "
+"als Teil des Logistikstandorts konfiguriert sein."
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+"Damit der Lagerort \"%(location)s\" deaktiviert werden kann, muss er leer "
+"sein."
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+"Der Typ des Lagerorts \"%(location)s\" kann nicht auf \"%(type)s\" gesetzt werden, \n"
+"da der Typ keine Warenbewegungen erlaubt und für den Lagerort bereits Warenbewegungen existieren."
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+"Damit die Warenbewegung \"%(move)s\" gelöscht werden kann, muss sie entweder"
+" annulliert werden oder auf den Entwurfsstatus zurückgesetzt werden."
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+"Die Warenbewegungen \"%(moves)s\" haben ein effektives Datum in der Zukunft."
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+"Herkunfts- und Bestimmungsort der Warenbewegung müssen unterschiedlich sein."
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "Die interne Menge der Warenbewegung muss positiv sein."
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+"Um die Warenbewegung \"%(move)s\" ändern zu können, muss dessen Status auf "
+"Entwurf zurückgesetzt werden."
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+"Die Warenbewegung \"%(move)s\" kann nicht geändert werden, weil sie bereits "
+"annulliert ist."
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+"Die Warenbewegung \"%(move)s\" kann nicht geändert werden, weil sie bereits "
+"erledigt ist."
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+"Um die Warenbewegung \"%(move)s\" ändern zu können, muss der "
+"Lagerbuchungszeitraum \"%(period)s\" wieder geöffnet werden."
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr "Die Warenbewegungen \"%(moves)s\" haben keine Herkunft."
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "Die zu bewegende Menge muss positiv sein."
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+"Lagerzeiträume mit reservierten Warenbewegungen können nicht geschlossen "
+"werden."
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+"Lagerzeiträume mit einem Datum ab heute und in Zukunft, dürfen nicht "
+"geschlossen werden."
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"Der Einstandspreis eines Artikels, dem Warenbewegungen zugeordnet sind, kann nicht geändert werden.\n"
+"Es muss der Assistent \"Einstandspreis ändern\" verwendet werden."
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"Die Standardmaßeinheit kann nicht für Artikel geändert werden, denen "
+"Warenbewegungen zugeordnet sind."
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+"Der Typ eines Artikels, dem Warenbewegungen zugeordnet sind, kann nicht mehr"
+" geändert werden."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+"Für den Artikel \"%(product)s\" sind noch Lagerstände in den Lagerorten "
+"\"%(locations)s\" für das Unternehmen \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+"Es wird empfohlen, vor der Deaktivierung des Artikels den Bestand aus den "
+"Lagerorten zu entfernen."
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+"Damit die Lieferung \"%(shipment)s\" gelöscht werden kann, muss sie zuerst "
+"annulliert werden."
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+"Damit die Lieferung \"%(shipment)s\" gepackt werden kann, müssen zuerst die "
+"Warenbewegungen zur Bestandsänderung ausgeführt werden."
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Währung"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr "Marge"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr "Margenentwicklung"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr "Gewinn"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr "Umsatz"
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr "Sind Sie sicher, dass Sie die Inventur abbrechen wollen?"
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr "Sind Sie sicher, dass Sie die Inventur bestätigen wollen?"
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr "Sind Sie sicher, dass Sie die Warenbewegung abbrechen wollen?"
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr "Sind Sie sicher, dass Sie die Warenbewegung fertigstellen wollen?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Sind Sie sicher, dass Sie die Lieferung empfangen wollen?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Sind Sie sicher, dass Sie die Lieferung fertigstellen wollen?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Sind Sie sicher, dass Sie die Lieferung fertigstellen wollen?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Sind Sie sicher, dass Sie die Lieferung zurücknehmen wollen?"
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Inventurpositionen für fehlende Artikel erstellen"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "Startet den Assistenten zum Zählen der Artikel"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "Vorbereiten"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Bestätigen"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "Zählen"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Durchführen"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Auf Entwurf zurücksetzen"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Schließen"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Auf Entwurf zurücksetzen"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Einlagern"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Reservieren"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Warten"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Reservieren"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Versenden"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Warten"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Reservieren"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Packen"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "Kommissionieren"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Einlagern"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Warten"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventur"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Wareneingangslieferung"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Warenrückgabe (an Lieferanten)"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Interne Lieferung"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Warenausgangslieferung"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Warenrücknahme (von Kunden)"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventur"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Wareneingangslieferung"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Warenrückgabe (an Lieferanten)"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Interne Lieferung"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Warenausgangslieferung"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Warenrücknahme (von Kunden)"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventuren"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Lagerorte"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Lagerorte"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Beschaffungszeiten zwischen Logistikstandorten"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Lagerorte"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Lagerperioden"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Auswertungen"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Margen"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Lieferungen"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Wareneingang"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Warenrückgaben (an Lieferanten)"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Interne Lieferungen"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Warenausgang"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Warenrücknahmen (von Kunden)"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Lager & Inventur"
+
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Einstellungen"
+
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Partei Lieferung an Logistikstandort"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Partei Ort"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Artikel je Lagerort"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr "Artikel Einstandspreis Änderung"
+
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Einstandspreis ändern"
+
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Einstandspreis neu berechnen"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Lager"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Lager Administration"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Lager Reservierung erzwingen"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Einstellungen Lager"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "Einstellungen Lager Lagerort"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr "Einstellungen Lager Nummernkreis"
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Lager Lagerbestand"
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Lagerbestand Anzahl"
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Lagerbestand Anzahl"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Lagerbestandsposition"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Lager Lagerort"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Wareneingang"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Inventurdifferenz"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Warenausgang"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Lagerzone"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Beschaffungszeit zwischen Lagerorten"
+
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Logistikstandort Reste Lagerort"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Warenbewegung"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Lagerbuchungszeitraum"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "Lagerbuchungszeitraum Cache"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Lagerbestand je Logistikstandort (Zeitreihe)"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Lagerbestand je Logistikstandort (Zeitreihe)"
+
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Artikelanzahl je Warenbewegung je Logistikstandort"
+
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Artikel je Lagerort"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Artikel je Lagerort"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Lager Auswertung Marge pro Artikelkategorie"
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Lager Auswertung Marge Pro Artikelkategorie (Zeitreihe)"
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Lager Auswertung Marge Pro Artikelkategorie"
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr "Lager Auswertung Marge Kontext"
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr "Lager Auswertung Marge"
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr "Lager Auswertung Marge"
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr "Lager Auswertung Marge Pro Artikel"
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr "Lager Auswertung Lager Pro Artikel (Zeitreihe)"
+
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Lieferung reservieren"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Wareneingangslieferung"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Warenrückgabe (an Lieferanten)"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Interne Lieferung"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Warenausgangslieferung"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Warenrücknahme (von Kunden)"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Von Lagerort"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Geplantes Datum:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Referenz:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Einlagerungsliste"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Lieferscheinnummer"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Lieferant:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Zu Lagerort"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Logistikstandort:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Von Lagerort"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Von Lagerort:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Interne Lieferung"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Geplantes Datum:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Referenz:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Lieferscheinnummer"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Zu Lagerort"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Zu Lagerort:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Kundennr:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Datum:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Lieferschein"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Referenz:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Lieferscheinnummer:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Kunde:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Von Lagerort"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Pickliste"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Geplantes Datum:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Referenz:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Lieferscheinnummer"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Zu Lagerort"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Logistikstandort:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Von Lagerort"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Geplantes Datum:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Referenz:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Einlagerungsliste"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Lieferung"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Zu Lagerort"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Logistikstandort:"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Warenausgangslieferungen reservieren"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Interne Lieferungen reservieren"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Einstandspreis von Warenbewegungen neu berechnen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Warenausgangslieferungen neu planen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Interne Lieferungen neu planen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Warenrückgaben (an Lieferanten) neu planen"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "Ausbuchen"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "Beibehalten"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "Direktlieferung"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Inventurdifferenz"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Lager"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Sicht"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Reserviert"
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr "Vorläufig"
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Geschlossen"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr "Tag"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr "Monat"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr "Jahr"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Erhalten"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Reserviert"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Reserviert"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Angefordert"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Versendet"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Reserviert"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Gepackt"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Kommissioniert"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Wartend"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Erhalten"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Lager"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr "Der Logistikstandort an dem Sie arbeiten."
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Nummernkreis Warenrücknahme (von Kunden)"
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Nummernkreis Warenausgangslieferungen"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Nummernkreis Interne Lieferungen"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Interner Transit"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventur"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Nummernkreis"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Lieferungen"
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Nummernkreis Warenrückgabe (an Lieferanten)"
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Nummernkreis Wareneingangslieferung"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Warenbewegung"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Kosten"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr "Umsatz"
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr "Umsatz"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr "Umsatz"
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Folgende Artikel können nicht reserviert werden:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Sonstiges"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Ausgehende Warenbewegungen"
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Neu berechnen"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "Aktualisieren"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "Fertig"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "Auswählen"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Warten"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr "Erzwingen"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr "Ignorieren"
diff --git a/modules/stock/locale/es.po b/modules/stock/locale/es.po
new file mode 100644
index 0000000000..97efc8d0bc
--- /dev/null
+++ b/modules/stock/locale/es.po
@@ -0,0 +1,3410 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Envío"
+
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Almacenes"
+
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Envío"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Ubicación de cliente"
+
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Enviado a los almacenes"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Ubicaciones"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Ubicación de proveedor"
+
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Tercero"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Ubicación de cliente"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Tercero"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Ubicación de proveedor"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "A la fecha"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "A la fecha"
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Nuevo precio de coste"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Nuevo precio de coste"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de coste"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Cantidad prevista"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "De"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de coste"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Cantidad prevista"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Almacén actual"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Secuencia de inventario"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Secuencia de albarán devolución proveedor"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Secuencia de albarán proveedor"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Secuencia de albarán interno"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Transito albaranes internos"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Secuencia de albarán devolución cliente"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Secuencia de albarán cliente"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Transito albaranes internos"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Secuencia de inventario"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Secuencia de albarán devolución proveedor"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Secuencia de albarán proveedor"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Secuencia de albarán interno"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Secuencia de albarán devolución cliente"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Secuencia de albarán cliente"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Cantidad en blanco"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Línea"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "Cantidad total"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Buscar"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Cantidad estimada"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventario"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "Estado inventario"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Cantidad actual"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Dirección"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr "Permitir recogida"
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Hijos"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de coste"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Hijos llanos"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Cantidad prevista"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Entrada"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Izquierda"
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Perdido y encontrado"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Salida"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Recogida"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "UdM cantidad"
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Dígitos de la UdM de la cantidad"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Derecha"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Interna"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Tipo de ubicación"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Ubicación residuos"
+
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Almacén residuos"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Tiempo de espera"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Desde el almacén"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Hasta el almacén"
+
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Ubicación residuos"
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Reserva obligatoria"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Precio de coste"
+
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Precio de coste obligatorio"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Fecha efectiva"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Desde ubicación"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Cantidad interna"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Origen"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Fecha estimada"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoría UdM del producto"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Albarán"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Precio unitario obligatorio"
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Precio unitario actualizado"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "UdM"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Precalculado"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Cantidad interna"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Periodo"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Solo zona de almacenamiento"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr "Diferencia de cantidad acumulada"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr "Cantidad final acumulada"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr "Cantidad acumulada incial"
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr "Documento"
+
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Origen"
+
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr "Consumible"
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de coste"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "UdM por defecto"
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Decimales de la UdM por defecto"
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Cantidad prevista"
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "A la fecha"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "A la fecha"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr "Series temporales"
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Hijos"
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Desde la fecha"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr "Incluye perdidos"
+
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Periodo"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr "Series temporales"
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Cantidad interna"
+
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr "Series temporales"
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Cantidad interna"
+
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Dirección de contacto"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Finalizado por"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Fecha efectiva"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Movimientos de entrada"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Movimientos internos"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Orígenes"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Fecha estimada"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Recibido por"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Ubicación de proveedor"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Almacén-ubicación de entrada"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Ubicación de almacenamiento"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Reservador por"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Dirección de envío"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Finalizado por"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Fecha efectiva"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Desde ubicación"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Orígenes"
+
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Reservado parcialmente"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Fecha estimada"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Recibido por"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Finalizado por"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Fecha efectiva"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Fecha inicio efectiva"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Desde ubicación"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Movimientos de entrada"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Movimientos de salida"
+
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Reservado parcialmente"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Fecha estimada"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Fecha inicio estimada"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Enviado por"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "Ubicación en tránsito"
+
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Ubicación de cliente"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Dirección de envío"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Finalizado por"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Fecha efectiva"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Movimientos de inventario"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Origen"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Movimientos de salida"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Empaquetado por"
+
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Reservado parcialmente"
+
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Recogido por"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Fecha estimada"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Ubicación de salida"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Ubicación de almacenamiento"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Dirección de contacto"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Ubicación de cliente"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Finalizado por"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Fecha efectiva"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Movimientos de entrada"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Movimientos internos"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Orígenes"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Fecha estimada"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Recibido por"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Referencia"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Ubicación de entrada"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Ubicación de almacenamiento"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr "Marcar para enviar mercancías a esta dirección."
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr "Marcar para utilizar en los envíos."
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "La ubicación de destino por defecto para enviar productos al tercero."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+"La ubicación de origen por defecto para recibir productos del tercero."
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "La ubicación de destino por defecto para envíar productos al tercero."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+"La ubicación de origen por defecto para recibir productos del tercero."
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Fecha en la que la cantidad de existencias es calculada.\n"
+"* Un valor vacío realizará el cálculo lo mas lejos posible.\n"
+"* Una fecha pasada proporcionará valores históricos."
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"Expresión Python que se evaluará con:\n"
+"- cost_price: el precio de coste actual del producto"
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"Expresión Python que se evaluará con:\n"
+"- cost_price: el precio de coste actual del producto"
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "El valor de las existencias en la ubicación."
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "La cantidad de existencias que se espera tener en la ubicación."
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr "La cantidad de existencias en la ubicación."
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "El valor de las existencias en la ubicación."
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "La cantidad de existencias que se espera tener en la ubicación."
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr "La cantidad de existencias en la ubicación."
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr "Al almacén al que trabaja el usuario."
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr "Usado para generar el número asignado a los inventarios."
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+"Usado para generar el número asignado a los albaranes de devolución de "
+"proveedor."
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr "Usado para generar el número asignado a los albaranes de proveedor."
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr "Usado para generar el número asignado a los albaranes internos."
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"La ubicación por defecto usada para las existencias en tránsito entre "
+"almacenes."
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+"Usado para generar el número asignado a los albaranes de devolución de "
+"cliente."
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr "Usado para generar el número asignado a los albaranes de cliente."
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"La ubicación por defecto usada para las existencias en tránsito entre "
+"almacenes."
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr "La empresa a la que se le asocia el inventario."
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr "La fecha cuando se realiza el recuento de productos."
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Como se gestionan las líneas sin cantidad."
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr "La ubicación inventariada."
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr "El identificador principal del inventario."
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr "El estado actual del inventario."
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr "La cantidad a añadir al recuento actual."
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr "La cantidad total de la línea contada hasta el momento."
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr "La unidad en la que se especifican las cantidades."
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr "El elemento que ha sido contado."
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr "La cantidad que debería haber en la ubicación según el sistema."
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr "El inventario al que pertenece la línea."
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr "La cantidad actual que se encuentra en la ubicación."
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "La unidad en la que se especifica la cantidad."
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr "Usado para añadir estructura por debajo de la ubicación."
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr "El identificador interno usado para la ubicación."
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "El valor de las existencias en la ubicación."
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr "Marcar para forzar un solo nivel de hijos sin nietos."
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "La cantidad de existencias que se espera tener en la ubicación."
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr "Donde se recibe las existencias entrantes."
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+"Utilizado en los inventarios para corregir los niveles de existencias en el "
+"almacén."
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr "Donde se envían las existencias salientes."
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr "Utilizado para añadir estructura por encima de la ubicación."
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+"Desde donde se recogen las existencias.\n"
+"Déjelo vacío para utilizar la ubicación de almacenamiento."
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr "La cantidad de existencias en la ubicación."
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr "La ubicación superior dónde se almacenan las existencias."
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr "Las ubicaciones usadas para los residuos de productos del almacén."
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr "Los almacenes que usan la ubicación de residuos de productos."
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr "El tiempo que lleva mover las existencias entre almacenes."
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr "La empresa con la que se asocia el movimiento de existencias."
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "La moneda en la que se especifica el precio unitario."
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr "Cuando se movieran realmente las existencias."
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Desde donde se mueven las existencias."
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr "El origen del movimiento de existencias."
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr "Cuando esta previsto mover las existencias."
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr "El producto con el que se asocia el movimiento."
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr "La cantidad de existencias que se mueven."
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr "Usado para agrupar varios movimientos de existencias juntos."
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr "El estado actual del movimiento de existencias."
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr "A donde se mueven las existencias."
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr "Precio unitario en la moneda de la empresa."
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "La unidad en la que se especifica la cantidad."
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr "La empresa con la que se asocia el periodo de existencias."
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr "Cuando finaliza el periodo de existencias."
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr "El estado actual del periodo de existencias."
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr "Marcar para utilizar solo la cantidad de la zona de almacenaje."
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr "El almacén para el cual se calculan las cantidades."
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"La fecha para calcular la cantidad de existencias.\n"
+"* Un valor vacío calcula lo más adelantado posible.\n"
+"* Una fecha pasada proporcionará valores históricos."
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+"Si se marca, se incluye el cost de los productos movidos a las ubicaciones "
+"de Perdido y Encontrado."
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr "Los movimientos que no fueron reservados."
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr "La empresa a la que está asociada el albarán."
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr "La dirección en la que puede contactarse con el proveedor."
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr "Cuando las existencias fueron realmente recibidas."
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Los movimientos que traen las existencias al almacén."
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "Los movimientos que traen las existencias al área de almacenamiento."
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr "El identificador principal del albarán."
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr "Cuando se esperan recibir las existencias."
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "El identificador del proveedor para el albarán."
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr "El estado actual del albarán."
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Tercero que proporciona las existencias."
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr "Donde se reciben las existencias."
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "La empresa con la que está asociado el albarán."
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "A donde se envían las existencias."
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr "Cuando se han devuelto realmente las existencias."
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr "De donde se mueven las existencias."
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr "Los movimientos que devuelven las existencias al proveedor."
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "El identificador principal del albarán."
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Cuando se espera que se devuelvan las existencias."
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "El identificador del proveedor para el albarán."
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr "El estado actual del albarán."
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr "El tercero que subministra las existencias."
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Donde se mueven las existencias."
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr "La empresa con la que está asociada el albarán."
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr "Cuando se completo realmente el albarán."
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr "Cuando se enviaron realmente las existencias."
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Desde donde se mueven las existencias."
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr "Los movimientos que reciben las existencias."
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr "Los movimientos que realizan el albarán."
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr "El identificador principal del albarán."
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr "Los movimientos que envían las existencias."
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr "Cuando se espera completar el albarán."
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Cuando se espera que las existencias sean enviadas."
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr "El identificador externo del albarán."
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr "El estado actual del albarán."
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr "A donde se mueven las existencias."
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+"Donde se encuentran las existencias mientras están en tránsito entre "
+"almacenes."
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Desde donde se envían las existencias."
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr "La empresa con la que el albarán está asociado."
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr "El tercero que compró las existencias."
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "A donde se envía el sotck."
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Cuando se han enviado realmente las existencias."
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+"Los movimientos que recogen las existencias desde el área de almacenamiento."
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr "El identificador principal del albarán."
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr "Los movimientos que envían las existencias al cliente."
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Cuando se tiene previsto enviar las existencias."
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "El identificador del cliente para el albarán."
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr "El estado actual del albarán."
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Desde donde se envían las existencias."
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "La empresa con la que el albarán está asociado."
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr "La dirección en la que el cliente puede ser contactado."
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr "El tercero que compró las existencias."
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr "Cuando fueron devueltas las existencias."
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Los movimientos que llevan las existencias al almacén."
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "Los movimientos que sacan las existencias del área de almacenamiento."
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "El identificador principal del albarán."
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Cuando se espera que las existencias sean devueltas."
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "El identificador del cliente para el albarán."
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr "El estado actual del albarán."
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr "Donde se devuelven las existencias."
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventarios"
+
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Líneas de inventario"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Ubicaciones"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Tiempo de espera entre ubicaciones"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Cantidad por ubicaciones (listado)"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Cantidad por ubicaciones"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Ubicaciones"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periodos"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Revisión del precio de coste"
+
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Movimientos de existencias"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Cantidades de producto por almacén"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Movimientos por almacén"
+
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Productos por ubicación"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr "Márgenes por categoría"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr "Márgenes por categoría"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr "Márgenes por categoría"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Márgenes"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Márgenes"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr "Márgenes por producto"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr "Márgenes por producto"
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Albaranes de proveedor"
+
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Devoluciones de proveedor"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Albaranes internos"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Albaranes de cliente"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Albaranes de cliente"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Albaranes de proveedores"
+
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Devoluciones de cliente"
+
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Lista de reabastecimiento"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Albaranes internos"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Nota de envío"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Lista recogida"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Lista de reabastecimiento"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "Recuento"
+
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Cantidades de producto por almacén"
+
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Movimientos de existencias"
+
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Modicar el precio de coste"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recalcular precio de coste"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Reservar el albarán de devolución de proveedor"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Reserva el albarán interno"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "Reservar albarán de cliente"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "Desde proveedores"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "Desde proveedores en espera"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "Hacia clientes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Recibido"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Reservado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Reservado parcialmente"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Reservado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Reservado parcialmente"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Solicitudes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Enviado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Reservado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Reservado parcialmente"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Empaquetado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Recogido"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Recibido"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+"No puede eliminar el tercero \"%(party)s\" mientras tengan albaranes "
+"pendientes con la empresa \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"El precio de coste \"%(cost_price)s\" para el producto \"%(product)s\" es "
+"inválido con la excepción \"%(exception)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr "No se ha encontrado ninguna línea existente para %(search)s."
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr "Los inventarios \"%(inventories)s\" tienen fecha en el futuro."
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr "Para eliminar el inventario \"%(inventory)s\" debe cancelarlo."
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+"Para eliminar la línea de inventario \"%(line)s\" debe cancelar el "
+"inventario \"%(inventory)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "La cantidad de la linea de inventario debe ser positiva."
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+"La línea de inventario \"%(line)s\" no es única en el inventario "
+"\"%(inventory)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+"Para confirmar el inventario \"%(inventory)s\" debe seleccionar una "
+"ubicación de perdido y encontrado para alguno de los padres de la ubicación "
+"\"%(location)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+"Para confirmar el inventario \"%(inventory)s\" debe seleccionar una opción "
+"para la cantidad vacía."
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+"Para establecer la ubicación \"%(location)s\" como "
+"almacenamiento/entrada/salida del almacén \"%(warehouse)s\", debe estar en "
+"el almacén."
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr "Para desactivar la ubicación \"%(location)s\", debe vaciarla."
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+"No puede cambiar el tipo de ubicación \"%(location)s\" a \"%(type)s\"\n"
+"porque el tipo no soporta movimientos y la ubicación los tiene."
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+"Para eliminar el movimiento de existencias \"%(move)s\" debe cancelarlo o "
+"restaurar su estado a borrador."
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr "Los movimientos \"%(moves)s\" tienen fecha efectiva en el futuro."
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr "El origen y destino del movimiento de existencias debe ser diferente."
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "La cantidad interna del movimiento debe ser positiva."
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+"Para modificar el movimiento de exitencias \"%(move)s\" debe restaurar su "
+"estado a borrador."
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+"No puede modificar el movimiento de existencias \"%(move)s\" porque está "
+"cancelado."
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+"No puede modificar el movimiento de existencias \"%(move)s\" porqué está "
+"realizado."
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+"Para modificar el movimiento de existencias \"%(move)s\" debe reabrir el "
+"periodo \"%(period)s\"."
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr "Los movimientos de existencias \"%(moves)s\" no tienen origen."
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "La cantidad del movimiento tiene que ser positiva."
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr "No puede cerrar periodos que contienen movimientos reservados."
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr "No puede cerrar periodos con fecha de hoy o en el futuro."
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"No se puede cambiar el precio de coste de un producto que esta asociado con movimientos de existencias.\n"
+"Debéis ejecutar el asistente \"Modificar precio de coste\"."
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"No puede cambiar la UdM por defecto de un producto que esta asociado con "
+"movimientos de existencias."
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+"No se puede cambiar el tipo de un producto que esta asociado con movimientos"
+" de existencias."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+"El producto \"%(product)s\" aún tiene algunas cantidades en las ubicaciones "
+"\"%(locations)s\" para la empresa \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+"Es recomendado vaciar las existencias de las ubicaciones de almacenamiento "
+"antes de desactivar el producto."
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr "Para eliminar el albarán \"%(shipment)s\" debe cancelarlo."
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+"Para empaquetar el envío \"%(shipment)s\" debe realizar los movimientos de "
+"inventario."
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr "Coste"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Moneda"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr "Margen"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr "Tendencia del margen"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr "Beneficio"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr "Ingresos"
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr "¿Estás seguro que quieres cancelar el inventario?"
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr "¿Estás seguro que quieres confirmar el inventario?"
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr "¿Estás seguro que quieres cancelar el movimiento?"
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr "¿Estás seguro que quieres finalizar el movimiento?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "¿Estás seguro que quieres recibir el albarán?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "¿Estás seguro que quieres finalizar el albarán?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "¿Estás seguro que quieres finalizar el albarán?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "¿Estás seguro que quieres recibir el albarán?"
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Añadir una línea de inventario por cada producto que falta"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "Abre el asistente para hacer recuento de productos"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "Completar"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "Recuento"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Finalizar"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Restaurar a borrador"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Cerrar"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Finalizar"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Restaurar a borrador"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Recibir"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Reservar"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Finalizar"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "En espera"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Reservar"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Finalizar"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Enviar"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "En espera"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Reservar"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Finalizar"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Empaquetar"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "Recoger"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Finalizar"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Recibir"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "En espera"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventario"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Albarán de proveedor"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Albarán de devolución de proveedor"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Albarán interno"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Albarán de cliente"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Albarán de devolución de cliente"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventario"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Albarán de proveedor"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Albarán de devolución de proveedor"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Albarán interno"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Albarán de cliente"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Albarán de devolución de cliente"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventarios"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Ubicaciones"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Ubicaciones"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Tiempo de espera entre ubicaciones"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Ubicaciones"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periodos"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Informes"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Márgenes"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Albaranes"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Albaranes de proveedor"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Devoluciones de proveedor"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Albaranes internos"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Albaranes de cliente"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Devoluciones de cliente"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Logística"
+
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuración"
+
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Tercero entregado en almacén"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Ubicación del tercero"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Productos por ubicación"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr "Revisión del precio de coste"
+
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Modifcar el precio de coste"
+
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recalcular precio de coste"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Logística"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Administración de logística"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Forzar reserva en logística"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Configuración existencias"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "Configuración de ubicaciones de existencias"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr "Configuración de secuencias de existencias"
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Inventario de existencias"
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Recuento de inventario"
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Recuento de inventario"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Línea inventario de existencias"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Ubicación de existencias"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Zona de entrada"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Perdido y encontrado"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Zona de salida"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Zona de almacenamiento"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Tránsito"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Ubicación tiempo de espera"
+
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Ubicación de residuos del almacén"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Movimiento de existencias"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Periodo de existencias"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "Periodo de existencias precalculado"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Cantidades de producto por almacén"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Cantidades de producto por almacén"
+
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Cantidades de producto por movimientos de almacén"
+
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Productos por ubicación"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Productos por ubicación"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Informe de márgenes por categoría"
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Informe de márgenes por categoría"
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Informe de márgenes por categoría"
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr "Contexto de los informes de Márgenes"
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr "Informe de margen de existencias"
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr "Informe de margen de existencias"
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr "Informe de margenes por producto"
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr "Informe de margenes por producto"
+
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Reservar el albarán"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Albaranes proveedor"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Albarán devolución proveedor"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Albarán interno"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Albarán cliente"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Albarán devolución cliente"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Desde ubicación"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Fecha estimada:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Referencia:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Lista de reabastecimiento"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Número de albarán"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Proveedor:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Almacén:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Desde ubicación"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Desde ubicación:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Albarán interno"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Fecha estimada:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Referencia:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Número de albarán"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "A ubicación:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Código de cliente:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Fecha:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Nota de envío"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Referencia:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Número de albarán:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Cliente:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Desde ubicación"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Lista recogida"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Fecha estimada:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Referencia:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Número de albarán"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Almacén:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Desde ubicación"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Fecha estimada:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Referencia:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Lista de reabastecimiento"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Albarán"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "A ubicación"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Almacén:"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Reserva los albaranes de cliente"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Reserva los albaranes internos"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recalcular precio de coste a partir de los movimientos"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Replanificar los albaranes de cliente"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Replanificar los albaranes internos"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Replanifica los albaranes de devolución de proveedor"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "Vacío"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "Mantener"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Finalizar"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "Envío directo"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Perdido-encontrado"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Interna"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Reservado"
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr "En proceso"
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Cerrado"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr "Día"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr "Mes"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr "Año"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Recibido"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Reservado"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Reservado"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Solicitud"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Enviado"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Reservado"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Empaquetado"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Recogido"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "En espera"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Recibido"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Logística"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr "El almacén al que estas trabajando."
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Secuencia de devoluciones cliente"
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Secuencia clientes"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Secuencia internos"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Tránsito interno"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventario"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Albaranes"
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Secuencia devoluciones proveedor"
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Secuencia proveedores"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr "Coste"
+
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Valor de coste"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr "Coste"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr "Ingresos"
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr "Coste"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr "Ingresos"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr "Coste"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr "Ingresos"
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "No se pueden reservar estos productos:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Información adicional"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Movimientos de salida"
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "Aceptar"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recalcular"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "Añadir"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "Finalizar"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "Seleccionar"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Esperar"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr "Forzar"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr "Ignorar"
diff --git a/modules/stock/locale/es_419.po b/modules/stock/locale/es_419.po
new file mode 100644
index 0000000000..767fcdcbdc
--- /dev/null
+++ b/modules/stock/locale/es_419.po
@@ -0,0 +1,3457 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Bodega"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Remisión"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Bodega"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Costo"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Costo"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Costo"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Costo"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Bodega"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Secuencia de envío de devolución a proveedor"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Secuencia de envío de proveedor"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Secuencia de envío interna"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Tránsito de envíos internas"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Secuencia de envíos de devolución de cliente"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Secuencia de envíos a cliente"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Tránsito de envíos internos"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Secuencia de envíos de devolución a proveedor"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Secuencia de envíos de proveedor"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Secuencia de envío interno"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Secuencia de envío de devolución de cliente"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Secuencia de envíos a cliente"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Envío interno"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Envío interno"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Costo"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr ""
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Perdido y encontrado"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr ""
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Almacenamiento"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr ""
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Bodega"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Desde la bodega"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Hasta la bodega"
+
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Costo"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Precio unitario requerido"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Envío"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Precio unitario requerido"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Precio unitario"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr ""
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Costo"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Envío interno"
+
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Envío interno"
+
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Stock"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Referencias:"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Bodega de entrada"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Bodega de almacenamiento"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Dirección de entrega"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Referencias:"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Fecha de inicio efectiva"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Referencias:"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Dirección de entrega"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Empacado"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Referencias:"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Bodega de salida"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Bodega de almacenamiento"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Referencias:"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Bodega de entrada"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Bodega de almacenamiento"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Línea de inventario de stock"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Costo"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Stock"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Cantidades de producto por bodega"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Cantidades de producto por bodega"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Bodega de almacenamiento"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Envío de proveedor"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Devolución a proveedor"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Envío interno"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Envío a cliente"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Envío a cliente"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Envío de proveedor"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Devolución de cliente"
+
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Envío interno"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Remisión"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Cantidades de producto por bodega"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Stock"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Costo"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Reservar devolución a proveedor"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Envío interno"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Empacado"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Empacado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "La cantidad del movimiento debe ser positiva"
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "La cantidad del movimiento debe ser positiva"
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "La cantidad del movimiento debe ser positiva"
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Empacado"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Envío de proveedor"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Devolución a proveedor"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Envío interno"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Envío a cliente"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Devolución de cliente"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Envío de proveedor"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Devolución a proveedor"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Envío interno"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Envío a cliente"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Devolución de cliente"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Envíos"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Envío de proveedor"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Devolución a proveedor"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Envío interno"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Envío a cliente"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Devolución de cliente"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Bodega"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr ""
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Costo"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Costo"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr ""
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr ""
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Línea de inventario de stock"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Línea de inventario de stock"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Línea de inventario de stock"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Línea de inventario de stock"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Perdido y encontrado"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Bodega de almacenamiento"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr ""
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr ""
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Cantidades de producto por bodega"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Cantidades de producto por bodega"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Cantidades de producto por bodega"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Bodega de almacenamiento"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Reservar envío interno"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Envío de proveedor"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Devolución a proveedor"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Envío interno"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Envío a cliente"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Devolución de cliente"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Referencias:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Número de envío"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Bodega:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Envío interno"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Referencias:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Número de Envío"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Remisión"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Referencias:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Número de Envío:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Referencias:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Número de Envío"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Bodega:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Referencias:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Envío"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Bodega:"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Envío a cliente"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Envío interno"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Envío a cliente"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Envío interno"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Devolución a proveedor"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "Rechazado"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Perdido y encontrado"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Almacenamiento"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Bodega"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr ""
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Empacado"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Empacado"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Realizar"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Secuencia de envíos de devolución de cliente"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Secuencia de envíos a cliente"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Secuencia de envío interna"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Envío interno"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Envíos"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Secuencia de envío de devolución a proveedor"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Secuencia de envío de proveedor"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Stock"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Costo"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr ""
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/et.po b/modules/stock/locale/et.po
new file mode 100644
index 0000000000..245ca4ec89
--- /dev/null
+++ b/modules/stock/locale/et.po
@@ -0,0 +1,3512 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Tarne"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Ladu"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Tarne"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Kliendi asukoht"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Ladu"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Asukohad"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Hankija asukoht"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Asukoht"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Osapool"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Kliendi asukoht"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Osapool"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Hankija asukoht"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Kuupäeval"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Kuupäeval"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Kuluväärtus"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Kuluväärtus"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Kuluväärtus"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognoositav kogus"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Kuluväärtus"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognoositav kogus"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Varude järjestus"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Hankija tagastuse järjestus"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Tarnete järjestus"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Sisemise lähetuse järjestus"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Sisemine transiit"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Kliendi tagastuse järjestus"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Lähetuste järjestus"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Sisemine transiit"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Varude järjestus"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Hankija tagastuse järjestus"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Tarnete järjestus"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Sisemise lähetuse järjestus"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Kliendi tagastuse järjestus"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Lähetuste järjestus"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Nullkogus"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Read"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Asukoht"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Rida"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "Üldkogus"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "Ühik"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Otsi"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Oodatav kogus"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Kaup"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Asukoht"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "Kauba olek"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Üldkogus"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "Ühik"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Aadress"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Alamjaotis"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Kood"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Kuluväärtus"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Alamjaotise paraleel"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognoositav kogus"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Sisend"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Vasak"
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Leiunurk"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Nimi"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Väljund"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Ülem"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Noppimine"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Kogus"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Ühiku numbriline arv"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Parem"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Hoiuala"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Asukoha tüüp"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Transiitasukoht"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Ladu"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Ooteaeg"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Laost"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Lattu"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Transiitasukoht"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Kohustuslik"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Kuluväärtus"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Ühiku hind nõutud"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Valuuta"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Kehtiv kuupäev"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Asukohast"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Sisemine kogus"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Päritolu"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Planeeritud kuupäev"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Toote mõõtühiku kategooria"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Lähetus"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Asukohta"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Ühiku hind"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Ühiku hind"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Ühiku hind nõutud"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Ühiku hind"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "Mõõtühik"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Vahemälu"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Sisemine kogus"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Asukoht"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Periood"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Hoiuala"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Liikumised"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Päritolu"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Kuluväärtus"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognoositav kogus"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "Kuupäeval"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "Kuupäeval"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Alamjaotis"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Nimi"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Ülem"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Asukohast"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Periood"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Kuupäev"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Sisemine kogus"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Sisemine kogus"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Kontaktaadress"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Tehtud"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Kehtivusaeg"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Sissetulevad liikumised"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Varude liikumised"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Päritolu"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Planeeritud kuupäev"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Vastuvõtja"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Viide"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Hankija asukoht"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Lao saabumisala"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Lao hoiuala"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Omistatud"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Tarneaadress"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Tehtud"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Kehtivusaeg"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Asukohast"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Päritolu"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Määratud"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Planeeritud kuupäev"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Viide"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Asukohta"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Vastuvõtja"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Tehtud"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Kehtivusaeg"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Tegelik alguskuupäev"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Asukohast"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Sissetulevad liikumised"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Väljuvad liikumised"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Määratud"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Planeeritud kuupäev"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Planeeritud alguskuupäev"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Viide"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Lähetatud"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Asukohta"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "Transiitasukoht"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Klient"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Kliendi asukoht"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Tarneaadress"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Tehtud"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Kehtivusaeg"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Varude liikumised"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Päritolu"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Väljuvad liikumised"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Pakitud"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Määratud"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Pakitud"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Planeeritud kuupäev"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Viide"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Lao väljastusala"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Lao hoiuala"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Kontaktaadress"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Klient"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Kliendi asukoht"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "tehtud"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Kehtivusaeg"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Sissetulevad liikumised"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Sissetulevad liikumised"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Päritolu"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Planeeritud kuupäev"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Vastuvõtja"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Viide"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Lao saabumisala"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Lao hoiuala"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr "Märgista, et saata tarned antud aadressile"
+
+#, fuzzy
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr "Märgista, et saata tarned antud aadressile"
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "Osapoolele saadetud lao vaikimis asukoht."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "Hankijalt saadud kauba vaikimisi saabumise koht"
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "Osapoolele saadetud lao vaikimis sihtkoha asukoht."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "Hankijalt saadud kauba vaikimisi saabumise koht"
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Lao koguse arvutamise kuupäev* tühi väärtus arvutab nii kaugele tulevikku "
+"kui võimalik* mineviku kuupäev esitab ajaloolised väärtused"
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "Lao väärtus asukohas."
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "Eeldatav kaubakogus asukohas."
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr "Kauba kogus asukohas."
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "Kauba väärtus asukohas."
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "Eeldatav kaubakogus asukohas."
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr "Kauba kogus asukohas."
+
+#, fuzzy
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr "Kanded mis liigutavad kauba välja"
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr "Kasutatakse varude numbri genereerimiseks"
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr "Kasutatakse hankija tarne tagastuse numbri genetreerimiseks"
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr "Kasuatakse hankija tarne numbri genereerimiseks"
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr "Kasutatakse sisemise tarne numbri genereerimiseks"
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr "Kaubale määratud vaikimisi asukoht kuniks toimub vedu ladude vahel"
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr "Kasutatakse kliendi tarne tagastuse numbri genereerimiseks"
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr "Kasutatakse kliendi tarne numbri genereerimiseks"
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr "Kaubale määratud vaikimisi asukoht kuniks toimub vedu ladude vahel"
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr "Ettevõte, kellega varud on seotud"
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr "Inventuuri kuupäev."
+
+#, fuzzy
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Kuidas käsitleda ilma koguseta ridasid."
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr "Inventeeritav asukoht."
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr "Varude peamine identifikaator"
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr "Varude hetke staatus"
+
+#, fuzzy
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr "Hetkeväärtusele lisanduv kogus"
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr "Rea hetkeline koguväärtus"
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr "Koguste mõõtühik"
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr "Loendamisel olev üksus"
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr "Süsteemi poolt arvutatud kogus peaks olema selles asukohas"
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr "Varu mille juurde rida kuulub"
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr "Asukohas olev tegelik kogus"
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "Koguse mõõtühik"
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr "Kasutatkse asukoha alla struktuuri lisamiseks"
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr "Asukoha sisemine idenifikaator"
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "Kauba väärtus asukohas."
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+"Märgista et rakendada ühetasandiline alamjaotus ilma teie taseme "
+"alajaotuseta"
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "Eeldatav kaubakogus asukohas"
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr "Asukoht kus võetakse vastu saabuv kaup"
+
+#, fuzzy
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr "Kanded kauba lattu liigutamiseks"
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr "Asukoht kust väljastatakse lähetatav kaup"
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr "Kasutatkse asukoha kohale struktuuri lisamiseks"
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr "Kauba noppimise asukohtJäta tühjaks et kasutada lao asukohta"
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr "Kauba kogus asukohas."
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr "Kõrgema taseme asukohta kus kaupa hoiustatakse"
+
+#, fuzzy
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr "Kaubale määratud vaikimisi asukoht kuniks toimub vedu ladude vahel"
+
+#, fuzzy
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr "Kanded mis liigutavad kauba välja"
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr "Aeg, mis kulub kauba liigutamiseks ladude vahel."
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr "Ettevõte, millega laoliikumine on seotud."
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "Valuuta, milles ühiku hind on määratud"
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr "Kui kaupa tegelikult liigutati"
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Kuhu kaupa liigutati"
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr "Laokande allikas"
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr "Millal toimub eeldatav kauba liigutamine"
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr "Toode millega kanne on seotud"
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr "Liigutatava laoseisu väärtus"
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr "Kasutatakse mitme kauba liikumise grupeerimiseks"
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr "Laoliikumise olek."
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Kuhu kaup liigutatakse"
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "Koguse mõõtühik"
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr "Lao perioodiga seotud ettevõte"
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr "Millal laoperiood lõppeb."
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr "Lao perioodi hetkeseis"
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr "Koguste arvutamise aluseks oleva ladu"
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Laokoguse arvutamise kuupäev* Tühi väärtus arvutab tulevikku nii pikalt kui "
+"võimalik* Mineviku kuupäev kuvab ajaloolisi väärtusi"
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr "Kanded mis ei ole seotud"
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr "Ettevõte, kellega vedu on seotud"
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr "Hankija aadress"
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr "Kauba tegelik vastuvõtmine"
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Kanded kauba lattu liigutamiseks"
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "Kanded mis panevad kauba ära laokohtadele"
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr "Tarne peamine identifikaator"
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr "Millal oodatakse kauba saabumist"
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "Hankija tarne tunnus"
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr "Lähetuse olek."
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Tarnija."
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr "Kus kaup vastu võetakse"
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "Ettevõte kellega tarne on seotud"
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Kuhu kaup saadetakse"
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr "Millal kaubad tegelikult tagastakse"
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Kaupade liigutamise algpunkt"
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr "Kanded mis tagatsavad kauba hankijale"
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "Tarne peamine tunnus"
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Millal toimub kauba eelduslik tagastamine"
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "Tarnijapoolne tarne tunnus"
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr "Lähetuse olek."
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Tarnija."
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Kuhu kaup liigutatakse"
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr "Ettevõte, millega tarne on seotud"
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr "Millal tarne tegelikult lõpetati"
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr "Millal kaup tegelikult saadeti"
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Kauba liigutamise algkoht"
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr "Kanded mis võtavad kauba vastu"
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr "Tarne kanded"
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr "Tarne peamine tunnus"
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr "Kanded mis liigutavad kauba välja"
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr "Millal tarne eelduslikult lõpetatakse"
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Millal kaup eelduslikult saadetakse"
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr "Lähetuse väline viide."
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr "Lähetuse olek."
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Kuhu kaup liigutatakse"
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr "Kauba asukoht kuniks seda liigutatakse ladude vahel"
+
+#, fuzzy
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Kauba saatmise lähtekoht"
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr "Ettevõte millega vedu on seotud"
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr "Osapool kes kauba soetas"
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Kuhu kaup saadetakse"
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Kuhu kaup tegelikult saadeti"
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr "Kanded mis nopivad kaubad laokohtadelt"
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr "Tarne peamine tunnus"
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr "Kanded mis liigutavad kauba kliendile"
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Millal kaup eelduslikult saadetakse"
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "Kliendipoolne tarne tunnus"
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr "Lähetuse olek."
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Kauba saatmise lähtekoht"
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "Ettevõte kellega tarne on seotud"
+
+#, fuzzy
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr "Kliendi aadress"
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr "Kauba soetaja osapool"
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr "Kauba tagastamise kuupäev"
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Kanded mis liigutavad kauba lattu"
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "Kanded mis liigutavad kaubad laokohtadele"
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "Tarne peamine tunnus"
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Kauba eeldatav tagastuse kuupäev"
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "Kliendipoole tarne tunnus"
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr "Lähetuse olek."
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr "Kuhu kaup tagastatakse"
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventuurid"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventuurid"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Asukohad"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Asukoha viiteaeg"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "asukoha koguse nimekiri"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Asukoha koguse puu"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Asukohad"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Perioodid"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Kuluväärtus"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Laoliikumine"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Toote kogused ladude lõikes"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Toote kogused ladude lõikes"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Kaubad asukohtade järgi"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Päritolu"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Päritolu"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Tarned"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Hankija tagastused"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Sisemised lähetused"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Lähetused"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Lähetused"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Tarned"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Kliendi tagastused"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Ümberladustamise nimekiri"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Sisemine lähetus"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Saateleht"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Noppeleht"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Ümberladustamise nimekiri"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "Loendus"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Toote kogused ladude lõikes"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Laoliikumine"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Kuluväärtus"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Omahinna ümberarvutus"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Omista hankija tagastus"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Sisemine lähetus"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "Lisa kliendi lähetus"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "Hankijatelt"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "Hankijatelt ootel"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "Klientidele"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Vastu võetud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Määratud"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Määratud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Määratud"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Määratud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Päringud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Lähetatud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Määratud"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Määratud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Pakitud"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Pakitud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Vastu võetud"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "Kauba rida peab olema positiivne"
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr "Laokande lähtekoht ja sihtkoht peavad olema erinevad"
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "Sisemise kande kogus peab olema positiivne"
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "Kande kogus peab olema positiivne"
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr "Kannetega seotud perioode ei saa sulgeda"
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr "Tänase või tuleviku kuupäevaga perioode ei saa sulgeda"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr "Laoliikumistel oleva toote tüüpi ei saa muuta."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr "Laoliikumistel oleva toote ühikut ei saa muuta."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr "Laoliikumistel oleva toote tüüpi ei saa muuta."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Valuuta"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr "Oled kindel et tahad varu tühistada?"
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr "Oled kindel et tahad varu lõpetada?"
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr "Oled kindel et tahad kande tühistada?"
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr "Oled kindel et tahad kande lõpetada?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Oled kindel et tahad tarne vastu võtta?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Oled kindel et tahad tarne lõpetada?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Oled kindel et tahad tarne lõpetada?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Oled kindel et tahad tarne vastu võtta?"
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Lisa puuduolevatele toodetele varu rida"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "Käivita viisard et loendada tooted"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "Lõoetatud"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Kinnita"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "Loenda"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Teha"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Lähtesta mustandiks"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Suletud"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Lähtesta mustandiks"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Võta vastu"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Määratud"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Oota"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Määratud"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Tarni"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Oota"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Määratud"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Mustand"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Pakitud"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "Noppimine"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Võta vastu"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Ootsa"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "Kasutaja ettevõttes"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Kaup"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Tarne"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Hankija tagastus"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Sisemine lähetus"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Lähetus"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Kliendi tagastus"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Varud"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Tarne"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Hankija tagastus"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Sisemine lähetus"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Lähetus"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Kliendi tagastus"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Seadistus"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Kaubad"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Asukohad"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Asukohad"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Asukoha viiteaeg"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Asukohad"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Perioodid"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Aruandlus"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Päritolu"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Lähetused"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Tarned"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Hankija tagastus"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Sisemised lähetused"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Lähetused"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Kliendi tagastused"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Varud & ladu"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Seadistus"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Ladu"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Osapoole asukoht"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Kaup asukoha järgi"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Kuluväärtus"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Omahinna ümberarvutus"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Varud"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Varude administreerimine"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr ""
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Varude seadistus"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Lao inventuur"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Lao inventuuri rida"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Lao inventuuri rida"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Lao inventuuri rida"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Lao asukoht"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Klient"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Saabumisala"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Leiunurk"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Väljastusala"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Hoiuala"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transiit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Ladu"
+
+#, fuzzy
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Asukoha viiteaeg"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Transiitasukoht"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Laoliikumine"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Lao periood"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "Lao perioodi vahemälu"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Toote kogused laos"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Toote kogused laos"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Toote kogused ladude lõikes"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Kaubad asukohtade järgi"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Kaubad asukohtade järgi"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Omista sisemine lähetus"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Tarne"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Hankija tagastus"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Sisemine lähetus"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Lähetus"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Kliendi tagastus"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Asukohast"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Planeeritud kuupäev:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Viide:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Ümberladustamise nimekiri"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Lähetuse number"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Hankija:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Asukohta"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Ladu:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Asukohast"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Asukohast"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Sisemine lähetus"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Planeeritud kuupäev:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Viide:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Lähetuse number"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Asukohta"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Asukohta"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Kliendikood:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Kuupäev:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Saateleht"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Viide:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Lähetuse number"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Klient:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Asukohast"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Noppeleht"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Planeeritud kuupäev:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Viide:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Lähetuse number"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Asukohta"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Ladu:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Klient"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Asukohast"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Planeeritud kuupäev:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Viide:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Ümberladustamise nimekiri"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Lähetus"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Asukohta"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Ladu:"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Lisa kliendi lähetus"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Sisemine lähetus"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Omahinna ümberarvutus"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Lähetused"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Sisemised lähetused"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Hankija tagastused"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "Tühi"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "Hoia"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Klient"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Leiunurk"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Tootmine"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Hoiuala"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Vaade"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Ladu"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Omistatud"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Suletud"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Vastu võetud"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Omistatud"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Omistatud"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Päring"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Lähetatud"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Ootel"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Omistatud"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Pakitud"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Pakitud"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Ootel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Tühistatud"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Vastu võetud"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Varud"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Kliendi tagastuse järjestus"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Lähetuste järjestus"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Sisemise lähetuse järjestus"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Sisemine kogus"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Kaup"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Järjestus"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Lähetused"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Hankija tagastuse järjestus"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Tarnete järjestus"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Liikumised"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Täiendav info"
+
+#, fuzzy
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Kuluväärtus"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Ei saa lisada neid tooteid:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Täiendav info"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Täiendav info"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Täiendav info"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Täiendav info"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Muu info"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Väljuvad liikumised"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "OK"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Omahinna ümberarvutus"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "Lisa"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "Lõpp"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "Vali"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Tühista"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Oota"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/fa.po b/modules/stock/locale/fa.po
new file mode 100644
index 0000000000..d7ba302c84
--- /dev/null
+++ b/modules/stock/locale/fa.po
@@ -0,0 +1,3531 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "تحویل"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "انبار"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "تحویل"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "محل مشتری"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "انبار"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "مکان ها"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "محل تامین کننده"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "مکان"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "نهاد/سازمان"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "محل مشتری"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "نهاد/سازمان"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "محل تامین کننده"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "در تاریخ"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "در تاریخ"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "شرکت"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "ارزش بها"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "ارزش بها"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "مقدار هزینه"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "مقدار پیش بینی شده"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "مقدار هزینه"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "مقدار پیش بینی شده"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "انبار"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "ادامه فهرست دارایی"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "ادامه ارچاع محموله مرجوعی به تأمیین کننده"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "ادامه محموله تأمیین کننده"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "ادامه حمل محموله داخلی"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "حمل ونقل محموله داخلی"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "ادامه محموله مرجوعی مشتری"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "ادامه حمل و نقل مشتری"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "حمل ونقل محموله داخلی"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "ادامه فهرست دارایی"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "ادامه محموله مرجوعی به تأمیین کننده"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "ادامه محموله تأمیین کننده"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "ادامه محموله داخلی"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "ادامه محموله مرجوعی مشتری"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "ادامه حمل و نقل مشتری"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "مقدار خالی"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "سطرها"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "مکان"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "سطر"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "تعداد کل"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "واحد اندازی گیری"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "جستجو"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "مقدار مورد انتظار"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "دفتر دارایی"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "تاریخ"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "مکان"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "وضعیت دفتر دارایی"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "تعداد کل"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "واحد اندازی گیری"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "آدرس"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "زیر مجموعه"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "کد"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "مقدار هزینه"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "مجموعه یکنواخت"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "مقدار پیش بینی شده"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "ورودی"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "چپ"
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "گمشده ها و یافته ها"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "نام"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "خروجی"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "منبع"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "چیدن"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "مقدار/تعداد"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "ارقام واحد"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "راست"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "مخزن"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "نوع موقعیت"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "مکان حمل و نقل"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "انبار"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "زمان پیشبرد"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "از انبار"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "به انبار"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "مکان حمل و نقل"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "تخصیص ضروری است"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "ارزش بها"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "قیمت واحد مورد نیاز"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "واحد پول"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "تاریخ موثر"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "از مکان"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "مقدار داخلی"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "مبداء"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "تاریخ برنامه ریزی شده"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "دسته بندی واحد اندازه گیری محصول"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "محموله"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "به مکان"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "قیمت واحد"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "قیمت واحد"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "قیمت واحد مورد نیاز"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "قیمت واحد"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "واحد اندازی گیری"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "مخازن نگهداری"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "مقدار داخلی"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "مکان"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "دوره زمانی"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "منطقه ذخیره سازی"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "جابجایی ها"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "مبداء"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "مقدار هزینه"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "مقدار پیش بینی شده"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "در تاریخ"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "در تاریخ"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "زیر مجموعه"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "نام"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "منبع"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "شرکت"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "از مکان"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "دوره زمانی"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "تاریخ"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "مقدار داخلی"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "مقدار داخلی"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "آدرس تماس"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "انجام شد توسط"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "تاریخ موثر"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "جابجایی های ورودی"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "دفتر دارایی جابجایی ها"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "مبداء"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "تاریخ برنامه ریزی شده"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "دریافت شده توسط"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "مرجع"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "تامین کننده"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "محل تامین کننده"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "انبار ورودی"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "انبار ذخیره سازی"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "اختصاص داده شده توسط"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "آدرس تحویل"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "انجام شد توسط"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "تاریخ موثر"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "از مکان"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "مبداء"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "تخصیص داده شده"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "تاریخ برنامه ریزی شده"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "مرجع"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "تامین کننده"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "به مکان"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "دریافت شده توسط"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "انجام شد توسط"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "تاریخ موثر"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "شروع تاریخ موثر"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "از مکان"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "جابجایی های ورودی"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "جابجایی های خروجی"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "تخصیص داده شده"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "تاریخ برنامه ریزی شده"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "شروع تاریخ برنامه ریزی شده"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "مرجع"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "حمل شد توسط"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "به مکان"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "مکان حمل و نقل"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "مشتری"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "محل مشتری"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "آدرس تحویل"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "انجام شد توسط"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "تاریخ موثر"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "دفتر دارایی جابجایی"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "مبداء"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "جابجایی های خروجی"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "بسته بندی شده توسط"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "تخصیص داده شده"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "بسته بندی شده توسط"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "تاریخ برنامه ریزی شده"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "مرجع"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "انبار خروجی"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "انبار ذخیره سازی"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "شرکت"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "آدرس تماس"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "مشتری"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "محل مشتری"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "انجام شد توسط"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "تاریخ موثر"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "جابجایی های ورودی"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "دفتر دارایی جابجایی"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "مبداء"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "تاریخ برنامه ریزی شده"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "دریافت شده توسط"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "مرجع"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "انبار ورودی"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "انبار ذخیره سازی"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr "برای ارسال تحویل ها به آدرس ها، بررسی کنید."
+
+#, fuzzy
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr "برای ارسال تحویل ها به آدرس ها، بررسی کنید."
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "مکان مقصد پیش فرض هنگام ارسال کردن محصولات به نهاد/سازمان."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "مکان منبع پیش فرض هنگام دریافت کردن محصولات از نهاد/سازمان."
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "مکان مقصد پیش فرض هنگام ارسال کردن محصولات به نهاد/سازمان."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "مکان منبع پیش فرض هنگام دریافت کردن محصولات از نهاد/سازمان."
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"تاریخی که مقدار محصولات محاسبه می شود.\n"
+"* مقدار خالی محاسبه شده تا آنجا که امکان دارد.\n"
+"* یک تاریخ در گذشته مقادیر تاریخی را ارائه می دهد."
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "ارزش محصولات در محل."
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "مقدار محصولاتی که انتظار می رود در محل باشد."
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr "مقدار محصولات در محل."
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "ارزش محصولات در محل."
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "مقدار محصولاتی که انتظار می رود در محل باشد."
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr "مقدار محصولات در محل."
+
+#, fuzzy
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr "جابجایی هایی که سهام را خارج می کند."
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr "برای تولید تعداد داده شده به موجودی استفاده می شود."
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+"برای تولید تعداد داده شده برای برگشت کالا به تامین کننده استفاده می شود."
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr "برای تولید تعداد داده شده برای محموله های تامین کننده استفاده میشود."
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr "برای تولید تعداد داده شده برای محموله های داخلی استفاده میشود."
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"محل پیش فرض مورد استفاده برای محصولات است که در حال حمل بین انبارها است."
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr "برای تولید تعداد داده شده برای برگشت کالا به مشتری استفاده می شود."
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr "برای تولید تعداد داده شده برای کالا به مشتری استفاده می شود."
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"محل پیش فرض مورد استفاده برای محصولات است که در حال حمل بین انبارها است."
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr "شرکت موجودی مرتبط با آن است."
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr "تاریخ شمارش اموال."
+
+#, fuzzy
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "چگونه سطرهای بدون مقدار مورد استفاده قرار می گیرند."
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr "محل انبار شده است."
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr "شناسه اصلی موجودی."
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr "وضعیت جاری موجودی."
+
+#, fuzzy
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr "مقدار اضافه کردن به تعداد موجود."
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr "مقدار کل سطر که تا کنون محاسبه شده است."
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr "واحد که مقدار آن مشخص شده است."
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr "مورد شمارش شده است."
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr "مقدار سیستم محاسبه شده باید در محل باشد."
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr "موجودی سطر به آن تعلق دارد."
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr "مقدار واقعی موجود در محل."
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "واحد که مقدار آن مشخص شده است."
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr "استفاده می شود برای اضافه کردن ساختار زیر محل."
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr "شناسه داخلی مورد استفاده برای مکان."
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "مقدار اموال در محل."
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr "برای تکمیل یک سطح تک فرزندی که هیچ نوه نداشته باشد، بررسی کنید."
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "مقدار اموال که انتظار می رود در محل باشد."
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr "جایی که اموال ورودی دریافت شده است."
+
+#, fuzzy
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr "جابجایی که سهام را به انبار می آورد."
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr "جایی که اموال خروجی از آنجا ارسال میشود."
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr "استفاده می شود برای اضافه کردن ساختار در بالای محل."
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+"جایی که اموال از آن گرفته شده است.\n"
+"برای استفاده مکان ذخیره سازی، خالی بگذارید."
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr "مقدار اموال در محل."
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr "سطح بالای محل ذخیره سازی اموال."
+
+#, fuzzy
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+"محل پیش فرض مورد استفاده برای محصولات است که در حال حمل بین انبارها است."
+
+#, fuzzy
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr "جابجایی هایی که سهام را خارج می کند."
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr "زمان لازم برای جابجایی اموال بین انبارها است."
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr "شرکت جابجایی اموال با آن مرتبط است."
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "ارزی که در آن واحد قیمت مشخص شده است."
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr "زمانی که اموال واقعاً جابجا شده است."
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr "جایی که اموال از آنجا جابجا شده است."
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr "منبع جابجایی اموال."
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr "زمان مورد انتظار جابجایی اموال."
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr "محصولی که جابجایی با آن ارتباط دارد."
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr "مقدار اموال جابجا شده."
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr "برای گروه بندی چندین جابجایی اموال با هم استفاده میشود."
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr "وضعیت جاری جابجایی اموال."
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr "جایی که اموال به آن جابجا شده است."
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "واحد که مقدار آن مشخص شده است."
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr "دوره اموال با شرکت مرتبط است."
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr "زمانی که دوره اموال به پایان می رسد."
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr "وضعیت جاری دوره اموال."
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr "انباری که مقدار آن محاسبه خواهد شد."
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"تاریخی که مقدار اموال محاسبه می شود.\n"
+"* مقدار خالی محاسبه شده تا آنجا که امکان دارد.\n"
+"* یک تاریخ در گذشته مقادیر تاریخی را ارائه می دهد."
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr "جابجایی هایی که اختصاصی نبودند."
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr "شرکت حمل و نقل با آن مرتبط است."
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr "آدرس که در آن فروشنده می تواند با آن تماس بگیرد."
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr "هنگامی که اموال در واقع دریافت شد."
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "جابجایی که سهام را به انبار می آورد."
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "جابجایی که اموال را به محل ذخیره سازی منتقل می کند."
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr "شناسه اصلی برای حمل و نقل."
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr "زمانی که انتظار می رود اموال دریافت شود."
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "شناسه تامین کننده برای حمل و نقل."
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr "وضعیت فعلی حمل و نقل."
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr "نهاد/سازمان که اموال را تامین کرد."
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr "جایی که اموال دریافت می شود."
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "شرکت حمل و نقل با آن مرتبط است."
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "جایی که اموال ارسال میشود."
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr "زمانی که اموال واقعاً برگشت شده است."
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr "جایی که اموال از آن جابجا شده است."
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr "جابجایی که اموال به تأمین کننده عودت می شود."
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "شناسه اصلی برای حمل و نقل."
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "زمانی که انتظار میرود اموال بازگشت شود."
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "شناسه تأمین کننده برای حمل و نقل."
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr "وضعیت جاری حمل و نقل."
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr "نهاد/سازمانی که اموال را تآمین کرده است."
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr "جایی که اموال به ان جابجا شده است."
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr "شرکت حمل و نقل مرتبط با آن."
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr "هنگامی که حمل و نقل در واقع انجام شد."
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr "هنگامی که اموال در واقع فرستاده شد."
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr "جایی که اموال از آن جابجا شد."
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr "جابجایی هایی که اموال را دریافت می کند."
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr "جابجایی هایی که حمل ونقل را انجام می دهند."
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr "شناسه اصلی برای حمل و نقل."
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr "جابجایی هایی که سهام را خارج می کند."
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr "زمانی که انتظار می رود حمل و نقل تکمیل شود."
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr "زمانی که انتظار می رود اموال فرستاده شود."
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr "شناسه های خارجی برای حمل و نقل."
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr "وضعیت فعلی حمل و نقل."
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr "جایی که اموال به آن جابجا شده است."
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr "جایی که اموال موجود است، در حالی که در حال حمل و نقل بین انبارها است."
+
+#, fuzzy
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "جایی که اموال از آن فرستاده شده."
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr "شرکت حمل و نقل با آن مرتبط است."
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr "نهاد/سازمانی که اموال را خریداری کرده است."
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "جایی که اموال به آن ارسال می شود."
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "زمانی که اموال در واقع فرستاده شد."
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr "جابجایی که اموال را از منطقه ذخیره سازی انتخاب می کند."
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr "شناسه اصلی برای حمل و نقل."
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr "جابجایی که اموال را به مشتری ارسال می کند."
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr "زمانی که انتظار می رود اموال فرستاده شود."
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "شناسه مشتری برای حمل و نقل."
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr "وضعیت فعلی حمل و نقل."
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "جایی که اموال از آن فرستاده شده."
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "شرکت حمل و نقل با آن مرتبط است."
+
+#, fuzzy
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr "آدرس مشتری که می توان با آن تماس گرفت."
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr "نهاد/سازمانی که اموال را خریداری کرده است."
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr "هنگامی که اموال بازگشت."
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "جابجایی که اموال را به انبار می آورد."
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "جابجایی هایی که اموال را به محل ذخیره سازی منتقل می کند."
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "شناسه اصلی برای حمل و نقل."
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "زمانی که انتظار می رود اموال بازگردانده شود."
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "شناسه مشتری برای حمل و نقل."
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr "وضعیت فعلی حمل و نقل."
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr "جایی که اموال بازگشته است."
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "فهرست موجودی"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "فهرست موجودی"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "مکان ها"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "مکان آماده سازی"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "مکان ها"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "دوره ها"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "ارزش بها"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "جابجایی موجودی"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "مقادیر محصول توسط انبار"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "مقادیر محصول توسط انبار"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "محصولات توسط مکان ها"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "مبداء"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "مبداء"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "محموله تامین کننده"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "محموله برگشتی به تامین کننده"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "محموله های داخلی"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "محموله های مشتری"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "محموله های مشتری"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "محموله تامین کننده"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "محموله مرجوعی مشتری"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "فهرست درحال تأمیین"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "حمل و نقل داخلی"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "متن تحویل"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "لیست انتخاب"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "فهرست درحال تأمیین"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "شمردن"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "مقادیر محصول توسط انبار"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "جابجایی موجودی"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "ارزش بها"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "محاسبه مجدد ارزش بها"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "تخصیص محموله برگشتی به تامین کننده"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "حمل و نقل داخلی"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "تخصیص حمل و نقل مشتری"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "از تامین کنندگان"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "از تامین کنندگان منتظر"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "به مشتریان"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "دریافت شده"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "تخصیص داده شده"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "تخصیص داده شده"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "در انتظار"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "تخصیص داده شده"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "تخصیص داده شده"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "درخواست ها"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "ارسال شد"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "در انتظار"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "تخصیص داده شده"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "تخصیص داده شده"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "بسته بندي شده"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "بسته بندي شده"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "در انتظار"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "دریافت شده"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+"شما نمی توانید نهاد/سازمان :\"%(party)s\"را حذف کنید در حالی که آنها محموله "
+"در حال انتظار با شرکت :\"%(company)s\" دارد."
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr "هیچ سطرایجاد شده ای برای \"%(search)s\"پیدا نشد ."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr "برای حذف موجودی :\"%(inventory)s\" شما باید آن را لغو کنید."
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr "برای حذف موجودی :\"%(inventory)s\" شما باید آن را لغو کنید."
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+"برای حذف موجودی سطر:\"%(line)s\" شما باید موجودی :\"%(inventory)s\"را لغو "
+"کنید."
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "مقدار سطر موجودی باید مثبت باشد."
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr "سطرموجودی :\"%(line)s\" در موجودی :\"%(inventory)s\" منحصر بفرد نیست."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+"برای تایید موجودی :\"%(inventory)s\" شما باید یک گزینه برای مقدار خالی را "
+"انتخاب کنید."
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+"برای تایید موجودی :\"%(inventory)s\" شما باید یک گزینه برای مقدار خالی را "
+"انتخاب کنید."
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+"برای تعیین مکان :\"%(location)s\" به عنوان انبار/ ورودی / خروجی از انبار "
+":\"%(warehouse)s\"، آن باید در انبار باشد."
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr "برای غیرفعال کردن مکان :\"%(location)s\"، باید آن را خالی کنید."
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+"شما نمیتوانید نوع مکان :\"%(location)s\"را به \"%(type)s\" تغییر دهید\n"
+"چراکه نوع جابجایی را پشتیبانی نمی کند و مکان جابجایی هایی موجود دارد."
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+"برای حذف جابجایی اموال :\"%(move)s\"شما باید آن را لغو یا به حالت پیش نویس "
+"بازنشانی کنید."
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr "منبع و مقصد جابجایی اموال باید متفاوت باشد."
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "مقدار جابجایی داخلی باید مثبت باشد."
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+"برای تغییر جابجایی اموال :\"%(move)s\" شما باید آنرا به حالت پیش نویس "
+"بازنشانی کنید."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+"شما نمی توانید جابجایی اموال :\"%(move)s\"را تغییر دهید، زیرا آن لغو شده "
+"است."
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+"شما نمی توانید جابجایی اموال :\"%(move)s\"را تغییر دهید، زیرا آن انجام شده "
+"است."
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+"برای تغییرجابجایی اموال :\"%(move)s\"شما باید دوره :\"%(period)s\" را مجدداً"
+" باز کنید."
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr "جابجایی اموال :\"%(move)s\" هیچ منشأی ندارد."
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "مقدار جابجایی باید مثبت باشد."
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+"شما نمی توانید دوره هایی را با جابجایی های مشخص شده در آن، تعطیل کنید."
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr "شما نمیتوانید دوره هایی با یک تاریخ در آینده یا امروز تعطیل کنید."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"برای یك محصول که به جابجایی موجودی مرتبط شده است، شما نمی توانید نوع آن را "
+"تغییر دهید."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"برای یك محصول که به جابجایی موجودی مرتبط شده است، شما نمی توانید واحد "
+"مقدارپیش فرض را تغییر دهید."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+"برای یك محصول که به جابجایی موجودی مرتبط شده است، شما نمی توانید نوع آن را "
+"تغییر دهید."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr "برای حذف حمل ونقل :\"%(shipment)s\" شما باید آن را لغو کنید."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr "برای حذف حمل ونقل :\"%(shipment)s\" شما باید آن را لغو کنید."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "واحد پول"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "اجرای ویزارد برای شمارش محصولات"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "کامل"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "شمردن"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Close"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "بسته بندي شده"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "چیدن"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "فهرست موجودی"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "محموله تامین کننده"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "محموله برگشتی به تامین کننده"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "محموله داخلی"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "محموله مشتری"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "محموله مرجوعی مشتری"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "فهرست موجودی"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "محموله تامین کننده"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "محموله برگشتی به تامین کننده"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "محموله داخلی"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "محموله مشتری"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "محموله مرجوعی مشتری"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "فهرست موجودی"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "مکان ها"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "مکان آماده سازی"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "مکان ها"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "دوره ها"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "گزارش گیری"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "مبداء"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "محموله ها"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "محموله های تأمین کننده"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "محموله های برگشتی به تأمین کننده"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "محموله های داخلی"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "محموله های مشتری"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "محموله های مرجوعی مشتری"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "دفتر دارایی انبار & موجودی"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "پیکربندی"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "انبار"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "مکان نهاد/سازمان"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "محصول توسط محل"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "ارزش بها"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "محاسبه مجدد ارزش بها"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "موجودی"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "اداره کردن موجودی"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "تخصیص زوری موجودی"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "پیکربندی موجودی"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "پیکره بندی مکان موجودی"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr "ادامه پیکربندی موجودی"
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "موجودی انبار"
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "تعداد موجودی انبار"
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "تعداد موجودی انبار"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "سطر موجودی انبار"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "مکان انبار"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "مشتری"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "منطقه ورودی"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "گمشده ها و یافته ها"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "منطقه خروجی"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "منطقه ذخیره سازی"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "تأمین کننده"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "حمل و نقل"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "مکان آماده سازی"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "مکان حمل و نقل"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "جابجایی موجودی"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "دوره موجودی"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "دوره موجودی انبار"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "مقادیر محصول توسط انبار"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "مقادیر محصول توسط انبار"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "مقادیر محصول توسط انبار"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "محصولات توسط مکان ها"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "محصولات توسط مکان ها"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "تخصیص حمل محموله داخلی"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "محموله تامین کننده"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "محموله برگشتی به تامین کننده"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "محموله داخلی"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "محموله مشتری"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "محموله مرجوعی مشتری"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "از مکان"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "تاریخ برنامه ریزی شده :"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "ارجاع :"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "فهرست درحال تأمیین"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "شماره محموله"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "تامین کننده :"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "به مکان"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "انبار :"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "از مکان"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "از مکان :"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "محموله داخلی"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "تاریخ برنامه ریزی شده :"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "ارجاع :"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "شماره محموله"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "به مکان"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "به مکان :"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "کد مشتری :"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "تاریخ:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "متن تحویل"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "ارجاع :"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "شماره محموله :"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "مشتری :"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "از مکان"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "لیست انتخاب"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "تاریخ برنامه ریزی شده :"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "ارجاع :"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "شماره محموله"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "به مکان"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "انبار :"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "مشتری"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "از مکان"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "تاریخ برنامه ریزی شده :"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "ارجاع :"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "فهرست درحال تأمیین"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "محموله"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "به مکان"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "انبار :"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "تخصیص حمل و نقل مشتری"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "حمل و نقل داخلی"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "محاسبه مجدد ارزش بها"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "محموله های مشتری"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "محموله های داخلی"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "محموله برگشتی به تامین کننده"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "خالی"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "نگه داشتن"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "مشتری"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "دراپ"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "گمشده ها و یافته ها"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "تهیه کننده"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "مخزن"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "تامین کننده"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "مشاهده"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "انبار"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "تخصیص داده شده"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr "استقرار"
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "بسته شده"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "دریافت شده"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "تخصیص داده شده"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "در انتظار"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "تخصیص داده شده"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "درخواست"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "حمل شد"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "در انتظار"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "تخصیص داده شده"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "بسته بندی شده"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "بسته بندی شده"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "در انتظار"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "لغو شده"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "دریافت شده"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "موجودی"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "ادامه محموله مرجوعی مشتری"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "ادامه حمل و نقل مشتری"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "ادامه حمل محموله داخلی"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "مقدار داخلی"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "فهرست موجودی"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "ادامه"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "محموله ها"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "ادامه ارچاع محموله مرجوعی به تأمیین کننده"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "ادامه محموله تأمیین کننده"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "جابجایی ها"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "سایر اطلاعات"
+
+#, fuzzy
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "مقدار هزینه"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "این محصولات قابل اختصاص دادن نیستند :"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "سایر اطلاعات"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "سایر اطلاعات"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "سایر اطلاعات"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "سایر اطلاعات"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "سایر اطلاعات"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "جابجایی های خروجی"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "قبول"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "محاسبه مجدد ارزش بها"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "افزودن"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "لغو"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "پایان"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "انتخاب"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/fi.po b/modules/stock/locale/fi.po
new file mode 100644
index 0000000000..b80a355baf
--- /dev/null
+++ b/modules/stock/locale/fi.po
@@ -0,0 +1,3535 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Delivery Note"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Locations"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Locations"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Locations"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr ""
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr ""
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Warehouse"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Recompute Cost Price"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Moves"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Periods"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Packed"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Moves"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Warehouse"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "From Suppliers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "From Suppliers Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "To Customers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Packed"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Close"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Packed"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Supplier Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventory & Stock"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Warehouse"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr ""
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+#, fuzzy
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Stock Configuration"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr ""
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Input Zone"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Output Zone"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Storage Zone"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Warehouse"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr ""
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr ""
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Warehouse"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Supplier"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Customer"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipments"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Close"
+
+#, fuzzy
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Receive"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Receive"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Supplier Shipment"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Moves"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr ""
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recompute Cost Price"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/fr.po b/modules/stock/locale/fr.po
new file mode 100644
index 0000000000..372054f44a
--- /dev/null
+++ b/modules/stock/locale/fr.po
@@ -0,0 +1,3408 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Livraison"
+
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Entrepôts"
+
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Livraison"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Emplacement client"
+
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Livré aux entrepôts"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Emplacement fournisseur"
+
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Tiers"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Emplacement client"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Tiers"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Emplacement fournisseur"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "À la date"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "À la date"
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Nouveau prix de revient"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Nouveau prix de revient"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Valeur du coût"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantités prévisionnelles"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "Depuis"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Valeur du coût"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantité prévisionnelle"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Entrepôt actuel"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Séquence d'inventaire"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Séquence de retour d'expédition fournisseur"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Séquence d'expédition fournisseur"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Séquence d'expédition interne"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Transit d'expédition interne"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Séquence de retour d'expédition cliente"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Séquence d'expédition cliente"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Transit d'expédition interne"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Séquence d'inventaire"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Séquence de retour d'expédition fournisseur"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Séquence d'expédition fournisseur"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Séquence d'expédition interne"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Séquence de retour d'expédition cliente"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Séquence d'expédition cliente"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Quantité vide"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Ligne"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "Quantité Totale"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "UDM"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Recherche"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Quantité attendue"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventaire"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "État de l'inventaire"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Quantité réelle"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "UDM"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Adresse"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr "Autoriser le ramassage"
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Enfants"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Valeur du coût"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Enfants plats"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantité prévisionnelle"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Réception"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Gauche"
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Pertes et surplus"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Expédition"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Prélèvement"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Quantité UDM"
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Décimales de quantité d'UDM"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Droite"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Magasin"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Type d'emplacement"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Emplacements de déchets"
+
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Entrepôts de déchets"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Délai de livraison"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Entrepôt d'origine"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Entrepôt de destination"
+
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Emplacement de déchets"
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Assignation requise"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Prix de revient"
+
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Prix de revient requis"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Date effective"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Emplacement d'origine"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantité interne"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Origine"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Date planifiée"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Expédition"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Emplacement de destination"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Prix unitaire requis"
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Prix unitaire actualisé"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "UDM"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Caches"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantité interne"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Période"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Zone de magasin uniquement"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr "Delta de quantité cumulée"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr "Quantité cumulée à la fin"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr "Quantité cumulée au début"
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr "Document"
+
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Origine"
+
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr "Consommable"
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Valeur du coût"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "UDM par défaut"
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Décimales d'UDM par défaut"
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantité prévisionnelle"
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "À la date"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "À la date"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr "Séries temporelles"
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Enfants"
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Date de début"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr "Inclure les pertes"
+
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Période"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Date de fin"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr "Séries temporelles"
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantité interne"
+
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr "Séries temporelles"
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantité interne"
+
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Adresse de contact"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Effectué par"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Date effective"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Mouvements entrants"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Mouvement internes"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Origines"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Date planifiée"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Reçu par"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Emplacement fournisseur"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Entrée entrepôt"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Magasin de l'entrepôt"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Assigné par"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adresse de livraison"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Effectué par"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Date effective"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Emplacement d'origine"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Origines"
+
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Partiellement assignées"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Date planifiée"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Emplacement de destination"
+
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Reçu par"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Effectué par"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Date effective"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Date de début effective"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Emplacement d'origine"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Mouvements entrants"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Mouvements sortants"
+
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Partiellement assignées"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Date planifiée"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Date de début planifiée"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Livré par"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Emplacement de destination"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "Emplacement de transit"
+
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Emplacement client"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adresse de livraison"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Effectué par"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Date effective"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Mouvements internes"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Origines"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Mouvements sortants"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Emballé par"
+
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Partiellement assignées"
+
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Prélevée par"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Date planifiée"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Sortie entrepôt"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Magasin de l'entrepôt"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Adresse de contact"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Emplacement client"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Effectué par"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Date effective"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Mouvements entrants"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Mouvements internes"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Origines"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Date planifiée"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Reçu par"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Référence"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Entrée entrepôt"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Magasin de l'entrepôt"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr "Cochez pour envoyer les livraisons à cette adresse."
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr "Cocher pour utiliser pour la livraison."
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"L'emplacement de destination par défaut pour les produits envoyés au tiers."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "L'emplacement source par défaut pour les produits reçus du tiers."
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"L'emplacement de destination par défaut pour les produits envoyés au tiers."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "L'emplacement source par défaut pour les produits reçus du tiers."
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"La date pour laquelle la quantité de stock est calculée.\n"
+"* Une valeur vide calcule aussi loin que possible.\n"
+"* Une date dans le passé fournit les valeurs historiques."
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"Expression Python qui sera évaluée avec :\n"
+"- cost_price : le prix de revient actuel du produit"
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"Expression Python qui sera évaluée avec :\n"
+"- cost_price : le prix de revient actuel du produit"
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "La valeur du stock à l'emplacement."
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "La quantité de stock attendue à l'emplacement."
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr "La valeur du stock à l'emplacement."
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "La valeur du stock à l'emplacement."
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "La quantité de stock attendue à l'emplacement."
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr "La quantité de stock à l'emplacement."
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr "L'entrepôt dans lequel l'utilisateur travaille."
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr "Utilisé pour générer le numéro des inventaires."
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr "Utilisé pour générer le numéro des retours d'expédition fournisseur."
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr "Utilisé pour générer le numéro des expéditions fournisseurs."
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr "Utilisé pour générer le numéro des expéditions internes."
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"L'emplacement par défaut utilisé pour les produits qui sont en transit entre"
+" des entrepôts."
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+"Utilisé pour générer le numéro donné aux retours d'expéditions clientes."
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr "Utilisé pour générer le numéro donné aux expéditions clientes."
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"L'emplacement par défaut utilisé par le stock qui est en transit entre des "
+"entrepôts."
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr "La société à laquelle l'inventaire est associé."
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr "La date du comptage des stocks."
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Comment les lignes sans quantité sont traitées."
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr "L'emplacement inventorié."
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr "L'identifiant principal de l'inventaire."
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr "L'état actuel de l'inventaire."
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr "La quantité à ajouter au comptage existant."
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr "La quantité totale des lignes comptées jusqu'ici."
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr "L'unité dans laquelle les quantités sont spécifiées."
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr "L'article qui est compté."
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr "La quantité que le système a calculé pour l'emplacement."
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr "L'inventaire auquel appartient la ligne."
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr "La quantité trouvée à cet emplacement."
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "L'unité dans laquelle la quantité est spécifiée."
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr "Utilisé pour ajouter une structure sous l'emplacement."
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr "L'identifiant interne utilisé pour cet emplacement."
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "La valeur du stock à l'emplacement."
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr "Cochez pour appliquer un seul niveau d'enfants sans petits-enfants."
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "La quantité de stock attendue dans l'emplacement."
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr "Où les produits entrants sont reçus."
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+"Utilisé, par les inventaires, lors de la correction des niveaux de stock "
+"dans l'entrepôt."
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr "D'où les produits sortants sont envoyés."
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr "Utilisé pour ajouter une structure au-dessus de l'emplacement."
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+"D'où les produits sont pris.\n"
+"Laissez vide pour utiliser l'emplacement de stockage."
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr "La quantité de stock dans l'emplacement."
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr "L'emplacement de premier niveau où les produits sont stockés."
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr "Les emplacements utilisés pour les déchets de l'entrepôt."
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr "Les entrepôts qui utilisent l'emplacement pour les déchets."
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr "Le temps qu'il faut pour déplacer des produits entre les entrepôts."
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr "La société avec laquelle le mouvement de stock est associé."
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "La devise dans laquelle le prix unitaire est spécifié."
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr "Quand les produits ont été réellement déplacés."
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr "D'où les produits viennent."
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr "La source du mouvement de stock."
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr "Quand les produits devraient être déplacés."
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr "Le produit avec lequel le mouvement est associé."
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr "La quantité de stock déplacée."
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr "Utilisé pour grouper plusieurs mouvements de stock ensemble."
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr "L'état actuel du mouvement de stock."
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Vers où les produits sont déplacés."
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr "Prix unitaire dans la devise de la société."
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "L'unité dans laquelle la quantité est spécifiée."
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr "La société avec laquelle la période de stock est associée."
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr "Quand la période de stock termine."
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr "L'état actuel de la période de stock."
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr "Cochez pour n'utiliser que la quantité de la zone de magasin."
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr "L'entrepôt pour lequel les quantités seront calculées."
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"La date pour laquelle la quantité de stock est calculée.\n"
+"* Une valeur vide calcule aussi loin que possible.\n"
+"* Une date dans le passé fournira des valeurs historiques."
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+"Si coché, le coût des produits déplacés vers un emplacement pertes et "
+"surplus est inclus."
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr "Les mouvements qui n'ont pas été assignés."
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr "La société avec laquelle l'expédition est associée."
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr "L'adresse à laquelle le fournisseur peut être contacté."
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr "Quand les produits ont été réellement reçus."
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Les mouvements qui font entrer les produits dans l'entrepôt."
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+"Les mouvements qui déplacent les produits dans l'emplacement de stockage."
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identifiant principal de l'expédition."
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr "Quand les produits devraient être reçus."
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "L'identifiant du fournisseur pour l'expédition."
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr "L'état actuel de l'expédition."
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Le tiers qui fournit les produits."
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr "Où les produits sont reçus."
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "La société avec laquelle l'expédition est associée."
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Vers où les produits sont envoyés."
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr "Quand les produits ont été réellement retournés."
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr "D'où les produits sont déplacés."
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr "Les mouvements qui retournent les produits au fournisseur."
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identifiant principal de l'expédition."
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Quand les produits doivent être retournés."
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "L'identifiant du fournisseur de l'expédition."
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr "L'état actuel de l'expédition."
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Le tiers qui fournit les produits."
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr "D'où le produit est déplacé."
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr "La société avec laquelle l'expédition est associée."
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr "Quand l'expédition a été réellement terminé."
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr "Quand les produits ont été réellement envoyés."
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr "D'où les produits sont déplacés."
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr "Les mouvements qui reçoivent les produits."
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr "Les mouvements qui effectuent l'expédition."
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identifiant principal de l'expédition."
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr "Les mouvements qui envoient les produits."
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr "Quand l'expédition devrait être terminées."
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Quand les produits devraient être envoyés."
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr "L'identifiant externe de l'expédition."
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr "L'état actuel de l'expédition."
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Vers où les produits sont déplacés."
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+"Où se trouvent les produits quand ils sont en transit entre les entrepôts."
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "D'où le stock est envoyé."
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr "La société avec laquelle l'expédition est associée."
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr "Le tiers qui achète les produits."
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Vers où les produits sont envoyés."
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Quand les produits ont été effectivement envoyés."
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr "Les mouvements qui prennent les produits de la zone de stockage."
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identifiant principal de l'expédition."
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr "Les mouvements qui envoient les produits au client."
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Quand les produits doivent être envoyés."
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "L'identifiant du client pour l'expédition."
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr "L'état actuel de l'expédition."
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "D'où les produits sont envoyés."
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "La société avec laquelle l'expédition est associée."
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr "L'adresse à laquelle le client peut être contacté."
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr "Le tiers qui a acheté les produits."
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr "Quand les produits ont été retournés."
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Les mouvements qui apportent les produits dans l'entrepôt."
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "Les mouvements qui mettent les produits dans la zone de stockage."
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "L'identifiant principal de l'expédition."
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Quand les produits doivent être retournés."
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "L'identifiant du client pour l'expédition."
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr "L'état actuel de l'expédition."
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr "Où les produits sont retournés."
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventaires"
+
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Lignes d'inventaire"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Délais de livraison entre emplacements"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Liste des quantités par emplacements"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Arbre des quantité par emplacements"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Périodes"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Révision du prix de revient"
+
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Mouvements de stock"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Quantités de produit par entrepôt"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Mouvements de stock par entrepôt"
+
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Produits par emplacements"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr "Marges par catégorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr "Marges par catégorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr "Marges par catégorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Marges"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Marges"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr "Marges par produit"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr "Marges par produit"
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Expéditions fournisseur"
+
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Retours fournisseurs"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Expéditions internes"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Expéditions client"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Expéditions client"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Expéditions fournisseur"
+
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Retours clients"
+
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Liste de restockage"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Expédition interne"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Bon de livraison"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Liste de prélèvement"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Liste de restockage"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "Compter"
+
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Quantités de produit par entrepôt"
+
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Mouvements de stock"
+
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Modifier le prix de revient"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recalculer le prix de revient"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Assigner le retour d'expédition fournisseur"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Assigner l'expédition interne"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "Assigner l'expédition cliente"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "Tous"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "Tous"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "Depuis les fournisseurs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "En attente depuis les fournisseurs"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "Vers les clients"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "Toutes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Reçues"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "Toutes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assignées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Partiellement assignées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "Toutes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assignées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Partiellement assignées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Demandes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Livrées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "Toutes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assignées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Partiellement assignées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Emballées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Prélevées"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "Tous"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillons"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Reçus"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+"Vous ne pouvez pas effacer le tiers « %(party)s » tant qu'il a des "
+"expéditions en attente pour la société « %(company)s »."
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"Prix de revient non-valide « %(cost_price)s » pour le produit "
+"« %(product)s » avec l'exception « %(exception)s »."
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr "Aucune ligne existante n'a été trouvée pour « %(search)s »."
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr "Les inventaires « %(inventories)s » ont des dates dans le futur."
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr "Pour supprimer l'inventaire « %(inventory)s », vous devez l'annuler."
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+"Pour supprimer la ligne d'inventaire « %(line)s », vous devez annuler "
+"l'inventaire « %(inventory)s »."
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "La quantité de la ligne d'inventaire doit être positive."
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+"Le ligne d'inventaire « %(line)s » n'est pas unique sur l'inventaire "
+"« %(inventory)s »."
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+"Pour confirmer l'inventaire « %(inventory)s », vous devez définir une perte "
+"et surplus sur un parent de l'emplacement « %(location)s »."
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+"Pour confirmer l'inventaire « %(inventory)s », vous devez sélectionner une "
+"option pour les quantités vides."
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+"Pour définir l'emplacement « %(location)s » comme stockage/entrée/sortie de "
+"l'entrepôt « %(warehouse)s », il doit être dans l'entrepôt."
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr "Pour désactiver l'emplacement « %(location)s », vous devez la vider."
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+"Vous ne pouvez pas changer le type de l'emplacement « %(location)s » en « %(type)s »\n"
+"car le type ne supporte pas les mouvements et l'emplacement a déjà des mouvements."
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+"Pour supprimer le mouvement de stock « %(move)s », vous devez l'annuler ou "
+"le réinitialiser à l'état brouillon."
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr "Les mouvements « %(moves)s » ont des dates effectives dans le futur."
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+"La source et destination du mouvement de stock doivent être différentes."
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "La quantité interne doit être positive."
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+"Pour modifier le mouvement de stock « %(move)s », vous devez le "
+"réinitialiser à l'état brouillon."
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+"Vous ne pouvez pas modifier le mouvement de stock « %(move)s » car il est "
+"annulé."
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+"Vous ne pouvez pas modifier le mouvement de stock « %(move)s » car il est "
+"effectué."
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+"Pour modifier le mouvement de stock « %(move)s », vous devez rouvrir la "
+"période « %(period)s »."
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr "Les mouvements de stock « %(moves)s » n'ont pas d'origine."
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "La quantité sur le mouvement doit être positive."
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+"Vous ne pouvez pas clôturer des périodes avec des mouvements assignés."
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+"Vous ne pouvez pas clôturer des périodes avec une date dans le future ou "
+"d'aujourd'hui."
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"Vous ne pouvez pas modifier le prix de revient d'un produit associé à des mouvements de stock.\n"
+"Vous devez utiliser l'assistant « Modifier le prix de revient »."
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"Vous ne pouvez pas modifier l'UdM par défaut d'un produit associé à des "
+"mouvements de stock."
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+"Vous ne pouvez pas modifier le type d'un produit associé à des mouvements de"
+" stock."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+"Le produit « %(product)s » a encore des quantités dans les emplacements "
+"« %(locations)s » pour la société « %(company)s »."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+"Il est recommandé de vider le stock des emplacements de magasin avant de "
+"désactiver le produit."
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr "Pour supprimer l'expédition « %(shipment)s », vous devez l'annuler."
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+"Pour emballer l'expédition « %(shipment)s », vous devez effectuer les "
+"mouvements d'inventaire."
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr "Coût"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Devise"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr "Marge"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr "Tendance de la marge"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr "Profit"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr "Revenu"
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr "Êtes-vous sûr de vouloir annuler l'inventaire ?"
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr "Êtes-vous sûr de vouloir confirmer l'inventaire ?"
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr "Êtes-vous sûr de vouloir annuler le mouvement ?"
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr "Êtes-vous sûr de vouloir terminer le mouvement ?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Êtes-vous sûr de vouloir réceptionner l'expédition ?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Êtes-vous sûr de vouloir terminer l'expédition ?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Êtes-vous sûr de vouloir terminer l'expédition ?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Êtes-vous sûr de vouloir réceptionner l'expédition ?"
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Ajouter une ligne d'inventaire pour chaque produit manquant"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "Lance l’assistant pour compter les produits"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "Compléter"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirmer"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "Compter"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Effectuer"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Réinitialiser à l'état brouillon"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Fermer"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Réinitialiser à l'état brouillon"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Recevoir"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assigner"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Attendre"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assigner"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Livrer"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Attendre"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assigner"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Emballer"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "Prélever"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Recevoir"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Attendre"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventaire"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Expédition fournisseur"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Retour d'expédition fournisseur"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Expédition interne"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Expédition cliente"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Retour d'expédition cliente"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventaire"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Expédition fournisseur"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Retour d'expédition fournisseur"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Expédition interne"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Expédition cliente"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Retour d'expédition cliente"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventaires"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Délais de livraison entre emplacements"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Périodes"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapports"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Marges"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Expéditions fournisseurs"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Retours fournisseurs"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Expéditions internes"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Expéditions clientes"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Retours clients"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Stocks & inventaires"
+
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Tiers livrée à l'entrepôt"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Emplacement tiers"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Produits par emplacement"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr "Révision du prix de revient de produit"
+
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Modifier le prix de revient"
+
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recalculer le prix de revient"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Administration des stocks"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Forcer l'assignation de stock"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Configuration des stocks"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "Configuration des emplacements de stockage"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr "Configuration de stock Séquence"
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Inventaire du stock"
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Comptage d'inventaire de stock"
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Comptage d'inventaire de stock"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Ligne d'inventaire de stock"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Emplacement de Stockage"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Zone d'entrée"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Pertes et surplus"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Zone de sortie"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Zone de magasin"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Délai de livraison d'emplacement"
+
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Emplacement des déchets d'entrepôt"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Mouvement de stock"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Période de stock"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "Cache de période et stock"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Quantités de produit par entrepôt"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Quantités de produit par entrepôt"
+
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Quantités de produit par mouvements d'entrepôt"
+
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Produits par emplacements"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Produits par emplacements"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Rapport de marge de stock par catégorie"
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Rapport de marge de stock par catégorie"
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Rapport de marge de stock par catégorie"
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr "Contexte de rapport de marge de stock"
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr "Rapport de marge de stock"
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr "Rapport de marge de stock"
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr "Rapport de marge de stock par produit"
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr "Rapport de marge de stock par produit"
+
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assigner l'expédition"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Expédition fournisseur"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Retour d'expédition fournisseur"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Expédition interne"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Expédition cliente"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Retour d'expédition cliente"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr " :"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Emplacement d'origine"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Date planifiée :"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Référence :"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Liste de restockage"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Numéro d'expédition"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Fournisseur :"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Emplacement de destination"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Entrepôt :"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr " :"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Emplacement d'origine"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Emplacement d'origine :"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Expédition interne"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Date planifiée :"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Référence :"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Numéro d'expédition"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Emplacement de destination"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Emplacement de destination :"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Code client :"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Date :"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Bon de livraison"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Référence :"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Numéro d'expédition :"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr " :"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Client :"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Emplacement d'origine"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Liste de prélèvement"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Date planifiée :"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Référence :"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Numéro d'expédition"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Emplacement de destination"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Entrepôt :"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr " :"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Emplacement d'origine"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Date planifiée :"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Référence :"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Liste de restockage"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Expédition"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Emplacement de destination"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Entrepôt :"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Assigner les expéditions clientes"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Assigner les expéditions internes"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recalculer le prix de revient à partir des mouvements"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Re-planifier les expéditions clientes"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Re-planifier les expéditions internes"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Re-planifier les retours d'expédition fournisseur"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "Vider"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "Garder"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Effectué"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "Livraison directe"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Pertes et surplus"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Magasin"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Vue"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Assigné"
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Effectué"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr "Intermédiaire"
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Clôturée"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr "Jour"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr "Mois"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr "Année"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Annulée"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Reçu"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Assigné"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Assigné"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Annulée"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Demande"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Livrée"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Assigné"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Annulée"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Emballé"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Prélevée"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "En attente"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Reçu"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr "L'entrepôt dans lequel vous travaillez."
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Séquence de retour client"
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Séquence cliente"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Séquence interne"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Transit interne"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventaire"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Expéditions"
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Séquence de retour fournisseur"
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Séquence fournisseur"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr "Coût"
+
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Valeur du coût"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr "Coût"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr "Revenu"
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr "Coût"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr "Revenu"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr "Coût"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr "Revenu"
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Impossible d'assigner ces produits :"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Autre information"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Mouvements sortants"
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recalculer"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "Ajouter"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "Terminer"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "Sélectionner"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Attendre"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr "Forcer"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr "Ignorer"
diff --git a/modules/stock/locale/hu.po b/modules/stock/locale/hu.po
new file mode 100644
index 0000000000..419b5ed2db
--- /dev/null
+++ b/modules/stock/locale/hu.po
@@ -0,0 +1,3457 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Szállítási"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Raktár"
+
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Szállítási"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "vevőnél lévő tárhely"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Kiválasztott raktár"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Tárhelyek"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "szállítónál lévő tárhely"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Tárhely"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Ügyfél"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "vevőnél lévő tárhely"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Ügyfél"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "szállítónál lévő tárhely"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Kimutatás dátuma"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Kimutatás dátuma"
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Új költségár"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Dátum"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr "Változat"
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Új költségár"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Dátum"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Áru bekerülési értéke"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Előrejelzett mennyiség"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "Ettől kezdve"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Áru bekerülési értéke"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Előrejelzett mennyiség"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Kiválasztott raktár"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Dátum"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Üres mennyiség"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Sorok"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Tárhely"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Állapot"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Sor"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "Összmennyiség"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "Mértékegység"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Keresés"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Elvárt mennyiség"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Leltár"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Dátum"
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Tárhely"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Mozgások"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Összmennyiség"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "Mértékegység"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Cím"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Altárhelyek"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Kód"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Áru bekerülési értéke"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Csak közvetlen altárhelyek"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Előrejelzett mennyiség"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Áruátvevő"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Bal oldalon"
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Leltár"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Árukiadó"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Fölérendelt"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Kigyűjtés"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Mennyiség"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Tizedes vessző utáni számjegy"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Jobb oldalon"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Tárolótér"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Tárhely típusa"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Raktárhely"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Raktár"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Átfutási idő"
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Raktár"
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Raktár"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Raktár hely"
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Költségár"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Költség"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Pénznem"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Befejezés dátuma"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Induló tárhely"
+
+#, fuzzy
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Belső mennyiség"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Eredet"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Tervezett dátum"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Mértékegység kategória"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Szállítmány"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Állapot"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Cél tárhely"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Egységár"
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Egységár"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "ME"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Dátum"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Állapot"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Belső mennyiség"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Tárhely"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Periódus"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Dátum"
+
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Csak tárolóhely"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr "Össz zárómennyiség"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr "Össz kezdőmennyiség"
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Dátum"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Tétel"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Eredet"
+
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr "Fogyóeszköz"
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Áru bekerülési értéke"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "Alapegység"
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Előrejelzett mennyiség"
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "Kimutatás dátuma"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "Kimutatás dátuma"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr "Kategória"
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr "Kategória"
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Dátum"
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Alárendelt rekordok"
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Név"
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Fölérendelt"
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Ettől"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr "Hiány beleszámítása"
+
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Periódus"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Eddig"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Dátum"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Belső mennyiség"
+
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr "Mértékegység"
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Dátum"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Belső mennyiség"
+
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr "Mértékegység"
+
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Mozgások"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Kapcsolattartó"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Befejezte"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Befejezés dátuma"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Bejövő mozgások"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Raktármozgások"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Mozgások"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Tervezett dátum"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Átvette"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Hivatkozás"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Állapot"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Szállító"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "szállítónál lévő tárhely"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Szállítási cím"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Befejezte"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Befejezés dátuma"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Induló tárhely"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Mozgások"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "rendelkezésre áll"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Tervezett dátum"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Hivatkozás"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Állapot"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Szállító"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Cél tárhely"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Átvette"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Befejezte"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Befejezés dátuma"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Elküldés dátuma (tényleges)"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Induló tárhely"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Bejövő mozgások"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Mozgások"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Kimenő mozgások"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "rendelkezésre áll"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Tervezett dátum"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Elküldés dátuma (tervezett)"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Hivatkozás"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Elküldte"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Állapot"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Cél tárhely"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Vevő"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "vevőnél lévő tárhely"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Szállítási cím"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Befejezte"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Befejezés dátuma"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Raktármozgások"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Mozgások"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Kimenő mozgások"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Csomagolta"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "rendelkezésre áll"
+
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Kigyűjtötte"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Tervezett dátum"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Hivatkozás"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Állapot"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Cég"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Kapcsolattartó"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Vevő"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "vevőnél lévő tárhely"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Befejezte"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Befejezés dátuma"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Bejövő mozgások"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Raktármozgások"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Mozgások"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Tervezett dátum"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Átvette"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Hivatkozás"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Állapot"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr "Jelölje be, hogy erre a címre szállíthasson."
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Az ezen a napon érvényes készletszintet mutatja.\n"
+"* Ha üresen hagyja, minden jövőbeni mozgást is figyelembe vesz.\n"
+"* Múltbeli dátummal korábbi napok készletszintjeit tudja megnézni."
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr "A felhasználó ebben a raktárban dolgozik."
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr "A leltárhoz kapcsolódó cég."
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr "A leltár dátuma."
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Mit tegyen a rendszer, ha nem adott meg aktuális mennyiséget."
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr "A leltárazott tárhely."
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr "A leltár azonosítója."
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr "A leltározás jelenlegi állása."
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr "Ezt a mennyiséget hozzáadja az eddig megszámolt mennyiséghez."
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr "Ebből a tételből összesen ennyit számolt meg eddig."
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr "A megszámolandó tétel."
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr "A rendszer szerint ennek a mennyiségnek kellene a tárhelyen lennie."
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr "Ténylegesen ezt a mennyiséget találták a leltározás alkalmával."
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "Ebben a mértékegységben van a mennyiség megadva."
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr "Itt egyből megadhatja az altárhelyeket."
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr "A tárhely azonosítója."
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+"Ha bejelöli, csak egy szintű (a közvetlen) altárhelyeket hozhat lére. Ez sok"
+" tárhely esetén gyorsabbá teszi a rendszert."
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr "Itt megadhatja vagy létrehozhatja a főtárhelyet."
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+"Ebből a tárhelyből indul az áru kigyűjtése.\n"
+"Hagyja üresen a tárolótér használatához."
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr "Az áthelyezett termék tulajdonosa."
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "Ebben a pénzemben van az egységár megadva."
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr "A készletmozgás tényleges dátuma."
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Az áru ebből a tárhelyből indul."
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr "A készletmozgás ebből a dokumentumból lett létrehozva."
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr "A készletmozgás tervezett dátuma."
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr "A készletmozgás ezt a terméket mozgatja."
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr "A megmozgatott áru mennyisége."
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr "Készletmozgások csoportosítására szolgál."
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr "A készletmozgás feldolgozásának jelenlegi állása."
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Az áru ebbe a tárhelybe megy."
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "Ebben a mértékegységben van a mennyiség megadva."
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+"Jelölje be, hogy a raktárnak csak a tárolóhelyén lévő mennyiségeket vegye "
+"figyelembe."
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr "Ennek a raktárnak a mennyiségeit mutatja."
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Az ezen a napon érvényes készletszintet mutatja.\n"
+"* Ha üresen hagyja, minden jövőbeni mozgást is figyelembe vesz.\n"
+"* Múltbeli dátummal korábbi napok készletszintjeit tudja megnézni."
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+"Ha be van jelölve, a hiányként leleltározott termékek költségét is "
+"beleszámítja."
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr "Ezeket a készletmozgásokat nem tudta rendelkezésre állítani."
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr "A szállítmány tulajdonosa."
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr "Az árut ténylegesen ekkor vettük át."
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "A készletmozgások a szállítótól a raktár áruátvételig."
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "A készletmozgások, amiket az átvett áru betárolására használnak."
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr "Az az azonosító, amit mi adtunk a szállítmánynak."
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr "Ekkorra van tervezve az áru átvétele."
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "A szállítmánynak az az azonosítója, amit a beszállító adott."
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr "A szállítmány feldolgozásának jelenlegi állása."
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Az ügyfél, akitől az árut beszereztük."
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr "Ebbe a raktárba lesz bevételezve az áru."
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "A szállítmány tulajdonosa."
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Erre a címre megy az áru."
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr "Az árut ekkor küldtük vissza."
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Az áru ebből a tárhelyből indul."
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "Az az azonosító, amit mi adtunk a szállítmánynak."
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Amikor a készlet várhatóan visszaérkezik."
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "A szállítmánynak az az azonosítója, amit a beszállító adott."
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr "A szállítmány feldolgozásának jelenlegi állása."
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Az ügyfél, akitől az árut beszereztük."
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Az áru ebbe a tárhelybe megy."
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr "A szállítmány tulajdonosa."
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr "Az áru ténylegesen ekkor érkezett meg és került a cél tárhelyre."
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr "Az árut ténylegesen ekkor küldtük el."
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Az áru ebből a tárhelyből indul."
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr "Az áru átvételére használt készletmozgások."
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr "A szállítmányhoz tartozó készletmozgások."
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr "Az az azonosító, amit mi adtunk a szállítmánynak."
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr "Az áru elküldésére használt készletmozgások."
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr "Ekkorra van tervezve az áru érkezése és betárolása a cél tárhelynél."
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Ekkorra van tervezve az áru elküldése."
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr "A szállítmány külső azonosítója."
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr "A szállítmány feldolgozásának jelenlegi állása."
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Az áru ebbe a tárhelybe megy."
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Ebből a raktárból küldjük az árut."
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr "A szállítmány tulajdonosa."
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr "Az ügyfél, aki megveszi az árut."
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Erre a címre megy az áru."
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Az árut ténylegesen ekkor küldtük el."
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr "A készletmozgások, amik az áru kigyűjtésére szolgálnak."
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr "Az az azonosító, amit mi adtunk a szállítmánynak."
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr "A készletmozgások a raktárból a vevőhöz."
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Ekkorra van tervezve az áru elküldése."
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "A szállítmánynak az az azonosítója, amit a vevő adott."
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr "A szállítmány feldolgozásának jelenlegi állása."
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Ebből a raktárból küldjük az árut."
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "A szállítmány tulajdonosa."
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr "Az ügyfél, aki megveszi az árut."
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "A készletmozgások a szállítótól a raktár áruátvételig."
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "A készletmozgások, amiket az átvett áru betárolására használnak."
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "Az az azonosító, amit mi adtunk a szállítmánynak."
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "A szállítmánynak az az azonosítója, amit a vevő adott."
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr "A szállítmány feldolgozásának jelenlegi állása."
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Leltárak"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Tárhelyek"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Átfutási idők tárhelyek között"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Tárhelylista mennyiségekkel"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Tárhelyfa mennyiségekkel"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Tárhelyek"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Mozgások"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periódusok"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Költségár változás"
+
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Készletmozgások"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Készletszint raktáranként"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Készletmozgások raktáranként"
+
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Termékek tárhelyenként"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr "Árrés termék kategóriánként"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr "Árrés termék kategóriánként"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr "Árrés termék kategóriánként"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Árrések"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Árrések"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr "Árrés termékenként"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr "Árrés termékenként"
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Beszállítók szállítmányai"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Belső szállítmányok"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Vevői szállítmányok"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Vevői szállítmányok"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Beszállítók szállítmányai"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Beállítások"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Árubetöltési lista"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Belső szállítmány"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Szállítólevél"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Gyűjtőlap"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Árubetöltési lista"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "Megszámolás"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Készletmozgások"
+
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Költségár módosítása"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Költségár újraszámítása"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Szállítóhoz visszaküldött áru rendelkezésére állásának ellenőrzése"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Belső szállítmány rendelkezésére állásának ellenőrzése"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "Vevői szállítmány rendelkezésére állásának ellenőrzése"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "összes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "összes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "szállítóktól"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "szállítóktól várakozók"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "vevőkhöz"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "összes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "átvett"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "összes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "rendelkezésre áll"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "rendelkezésre áll"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "várakozik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "összes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "rendelkezésre áll"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "rendelkezésre áll"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Kérések"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "elküldve"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "várakozik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "összes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "rendelkezésre áll"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "rendelkezésre áll"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "csomagolva"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "kigyűjtve"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "várakozik"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "összes"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "átvett"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr "A „%(search)s” tétel még nincs a leltárban."
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr "A „%(inventories)s” leltáraknak jövőbeni dátuma van."
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "A sorban szereplő mennyiség pozitívnak kell lenni."
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr "A „%(line)s” tételhez több sor is van a „%(inventory)s” leltárban."
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+"Mielőtt jóváhagyja a „%(inventory)s” számú leltárt, döntse el, mit tesz az "
+"üresen hagyott mennyiségekkel."
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+"Ahhoz, hogy a „%(location)s” tárhelyet tárolótérnek/áruátvevőnek/árukiadónak"
+" használja a „%(warehouse)s” raktárban, hozzá kell legyen rendelve ahhoz a "
+"raktárhoz."
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "A sorban szereplő mennyiség pozitívnak kell lenni."
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "A sorban szereplő mennyiség pozitívnak kell lenni."
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"A típusa egy terméknek nem változtatható meg, ami raktármozgatáshoz "
+"hozzárendelt."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"AZ alap mértékegység egy terméknek nem változtatható meg, ami "
+"raktármozgatáshoz hozzárendelt."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+"A típusa egy terméknek nem változtatható meg, ami raktármozgatáshoz "
+"hozzárendelt."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr "Költség"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Pénznem"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr "Árrés"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr "Árbevétel"
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr "Biztos, hogy érvényteleníteni akarja a leltárt?"
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr "Biztos, hogy jóvá akarja hagyni a leltárt?"
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr "Biztos, hogy érvényteleníteni akarja a készletmozgást?"
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr "Biztos, hogy be akarja fejezni a készletmozgást?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Biztos, hogy át akarja venni a szállítmányt?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Biztos, hogy be akarja fejezni a szállítmányt?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Biztos, hogy be akarja fejezni a szállítmányt?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Biztos, hogy át akarja venni a szállítmányt?"
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Ad egy leltársort a tárhelyen lévő összes termékhez"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "A számolást segítő varázsló indítása"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Érvénytelenítés"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "Feltöltés"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Jóváhagyás"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "Megszámolás"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Érvénytelenítés"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Végrehajtás"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Újra vázlatba"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Bezárás"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Érvénytelenítés"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Újra vázlatba"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Áruátvétel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Kigyűjtés megkezdése"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Érvénytelenítés"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Újra vázlatba"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Várakozás"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Kigyűjtés megkezdése"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Érvénytelenítés"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Újra vázlatba"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Elküldés"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Várakozás"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Kigyűjtés megkezdése"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Érvénytelenítés"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Újra vázlatba"
+
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Csomag"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Érvénytelenítés"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Újra vázlatba"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Áruátvétel"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Várakozás"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "Felhasználó a cég alkalmazotta"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Leltár"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Beszállító szállítmánya"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Beszállítóhoz visszaküldött szállítmány"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Belső szállítmány"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Vevői szállítmány"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Visszaküldött vevői szállítmány"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Leltár"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Beszállító szállítmánya"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Beszállítóhoz visszaküldött szállítmány"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Belső szállítmány"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Vevői szállítmány"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Visszaküldött vevői szállítmány"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Beállítások"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Leltárak"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Tárhelyek"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Tárhelyek"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Átfutási idők tárhelyek között"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Tárhelyek"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Készletmozgások"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periódusok"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Jelentések"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Árrések"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Szállítmányok"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Beszállítók szállítmányai"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Belső szállítmányok"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Vevői szállítmányok"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Készletgazdálkodás"
+
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Beállítások"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Kiválasztott raktár"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr ""
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Költségár módosítása"
+
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Költségár újraszámítása"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Készlet"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+#, fuzzy
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Stock Configuration"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Leltársor"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Készlet tárolóhely"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Vevő"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Áruátvevő"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Leltár"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Árukiadó"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Tárolótér"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Szállító"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Úton lévő áru"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Átfutási idő tárhelyek között"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Raktár"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Készletmozgás"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr ""
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Készletszint raktáranként"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Készletszint raktáranként"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Termékek tárhelyenként"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Termékek tárhelyenként"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Beszállító szállítmánya"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Beszállítóhoz visszaküldött szállítmány"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Belső szállítmány"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Vevői szállítmány"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Visszaküldött vevői szállítmány"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Induló tárhely"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Tervezett dátum:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Hivatkozás:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Árubetöltési lista"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Szállítmány száma"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Szállító:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Cél tárhely"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Raktár:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Induló tárhely"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Induló tárhely:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Belső szállítmány"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Tervezett dátum:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Hivatkozás:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Szállítmány száma"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Cél tárhely"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Cél tárhely:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Vevő száma:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Dátum:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Szállítólevél"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Hivatkozás:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Szállítmány száma:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Vevő:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Induló tárhely"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Gyűjtőlap"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Tervezett dátum:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Hivatkozás:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Szállítmány száma"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Cél tárhely"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Raktár:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Vevő"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Induló tárhely"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Tervezett dátum:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Hivatkozás:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Árubetöltési lista"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Szállítmány"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Cél tárhely"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Raktár:"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Vevői szállítmány rendelkezésére állásának ellenőrzése"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Belső szállítmány rendelkezésére állásának ellenőrzése"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipments"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "Nullázza le"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "Ugorja át"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "érvénytelen"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Vevő"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Leltár"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "gyártás"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Tárolóhely"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Szállító"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Nézet"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Raktár"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "rendelkezésre áll"
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "érvénytelen"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "lezárt"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr "Változat"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr "Változat"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr "Nap"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr "Hónap"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr "Év"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "érvénytelen"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "átvett"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "rendelkezésre áll"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "érvénytelen"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "várakozik"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "rendelkezésre áll"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "érvénytelen"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Kérés"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "elküldve"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "várakozik"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "rendelkezésre áll"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "érvénytelen"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "csomagolva"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "kigyűjtve"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "várakozik"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "érvénytelen"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "átvett"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Készlet"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr "Válassza ki a raktárat, amelyikben munkát szeretne végezni."
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Visszaküldött vevői szállítmány"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Vevői szállítmány"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Belső szállítmány"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Belső mennyiség"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Leltár"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Számkör"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Szállítmányok"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Beszállítóhoz visszaküldött szállítmány"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Beszállító szállítmánya"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr "Költség"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Tétel"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Egyéb info"
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Áru bekerülési értéke"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr "Költség"
+
+#, fuzzy
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr "Árbevétel"
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr "Költség"
+
+#, fuzzy
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr "Árbevétel"
+
+#, fuzzy
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr "%"
+
+#, fuzzy
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr "Költség"
+
+#, fuzzy
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr "Árbevétel"
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Ezek a termékek nem állnak rendelkezésre:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Egyéb info"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Egyéb info"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Egyéb info"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Egyéb info"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Egyéb info"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Kimenő mozgások"
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Mégse"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Mégse"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Újraszámítás"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "Hozzáad"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Mégse"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "Befejezés"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "Kiválaszt"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Mégse"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Várakozás"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr "Kényszerítés"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr "Kihagyás"
diff --git a/modules/stock/locale/id.po b/modules/stock/locale/id.po
new file mode 100644
index 0000000000..50a4f558c4
--- /dev/null
+++ b/modules/stock/locale/id.po
@@ -0,0 +1,3407 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Pengiriman"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Gudang"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Pengiriman"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Lokasi Pelanggan"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Gudang saat ini"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Lokasi"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lokasi Pemasok"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Lokasi"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Pihak"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Lokasi Pelanggan"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Pihak"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lokasi Pemasok"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Pada Tanggal"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Pada Tanggal"
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Nilai Biaya"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "Dari"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Nilai Biaya"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Gudang saat ini"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Baris"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Lokasi"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Baris"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "UOM"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Lokasi"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "UOM"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Alamat"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Cabang"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Kode"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Nilai Biaya"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr ""
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Kiri"
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr ""
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Induk"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Kanan"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr ""
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Lokasi Pelanggan"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Gudang"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr ""
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Lokasi Pelanggan"
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr ""
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Mata Uang"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Tanggal Efektif"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Asal"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Harga Satuan"
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Harga Satuan"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Lokasi"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Periode"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Produk"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr "Dokumen"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Asal"
+
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Nilai Biaya"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "Pada Tanggal"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "Pada Tanggal"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Cabang"
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Induk"
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Tanggal Penulisan"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Periode"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Ke Tanggal"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Kuantitas"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Kuantitas"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr "Satuan"
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Dilakukan Oleh"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Tanggal Efektif"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Referensi"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lokasi Pemasok"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Dilakukan Oleh"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Tanggal Efektif"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Referensi"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Diterima oleh"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Dilakukan Oleh"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Tanggal Efektif"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Perpindahan Keluar"
+
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Tanggal yang Direncanakan"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Tanggal Mulai yang Direncanakan"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Referensi"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Pelanggan"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Lokasi Pelanggan"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Alamat Pengiriman"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Dilakukan Oleh"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Tanggal Efektif"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Referensi"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Alamat"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Pelanggan"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Lokasi Pelanggan"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Dilakukan Oleh"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Tanggal Efektif"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Referensi"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periode-Periode"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Perpindahan Keluar"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Produksi"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Lokasi Pemasok"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Lokasi Pelanggan"
+
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Perpindahan Keluar"
+
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Mata uang"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr "Pendapatan"
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr "Apakah Anda yakin Anda ingin membatalkan inventaris?"
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "Luncurkan wisaya untuk menghitung produk"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Konfirmasi"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Tutup"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Konsep"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "Pengguna di dalam perusahaan"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periode"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Pelaporan"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Lokasi Pemasok"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Lokasi Pelanggan"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Konfigurasi"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Gudang saat ini"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr ""
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr ""
+
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Persediaan"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr ""
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr ""
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr ""
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Pelanggan"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Lokasi Pelanggan"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr ""
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr ""
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr ""
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr ""
+
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Produksi"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Tanggal:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Pelanggan"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Tanggal yang Direncanakan:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Batal"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Pelanggan"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Batal"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr "Bulan"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr "Tahun"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Dibatalkan"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Batal"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Batal"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Batal"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Batal"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Persediaan"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Pelanggan"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Urutan"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Urutan"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Pemasok"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr "Biaya"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Perpindahan"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Info Lain"
+
+#, fuzzy
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Nilai Biaya"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr "Biaya"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr "Pendapatan"
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr "Biaya"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr "Pendapatan"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr "Biaya"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr "Pendapatan"
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr ""
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Info Lain"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Info Lain"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Info Lain"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Info Lain"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Info Lain"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "Tambahkan"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/it.po b/modules/stock/locale/it.po
new file mode 100644
index 0000000000..dbc3a8f343
--- /dev/null
+++ b/modules/stock/locale/it.po
@@ -0,0 +1,3541 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Consegna"
+
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Magazzini"
+
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Consegna"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Luogo del cliente"
+
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Consegnato ai Magazzini"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Luoghi"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Luogo del fornitore"
+
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Luogo"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Controparte"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Luogo del cliente"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Controparte"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Luogo del fornitore"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "A data"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "A data"
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Nuovo prezzo di costo"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Nuovo prezzo di costo"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Valore di costo"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantità prevista"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "Da"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Valore di costo"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantità prevista"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Magazzino attuale"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Sequenza di inventario"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Sequenza di spedizione del reso del fornitore"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Sequenza di spedizione del fornitore"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Sequenza di spedizione interna"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Transito spedizione interna"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Sequenza di spedizione del reso del cliente"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Sequenza di spedizione del cliente"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Transito spedizione interna"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Sequenza di inventario"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Sequenza di spedizione del reso del fornitore"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Sequenza di spedizione del fornitore"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Sequenza di spedizione interna"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Sequenza di spedizione del reso del cliente"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Sequenza di spedizione del cliente"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Quantità vuota"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Righe"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Luogo"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Numero"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Riga"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "Quantità totale"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Ricerca"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Quantità attesa"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventario"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Luogo"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "Stato dell'inventario"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Quantità effettiva"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Indirizzo"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr "Consenti ritiro"
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Figlio"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Codice"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Valore di costo"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Figli piatti"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantità prevista"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Ingresso"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Sinistra"
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Perso e ritrovato"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Uscita"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "UdM quantità"
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Cifre della UdM di quantità"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Destra"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Deposito"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Tipo di posizione"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Posizioni dei rifiuti"
+
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Magazzini rifiuti"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Tempi di consegna"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Magazzino di provenienza"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Magazzino di destinazione"
+
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Posizione dei rifiuti"
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Assegnazione richiesta"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Prezzo di costo"
+
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Prezzo di costo richiesto"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Decorrenza"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Origine"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categotia UdM prodotto"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Prezzo unitario"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Prezzo unitario"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Prezzo unitario"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Luogo"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Periodo"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Storage Zone"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Movimenti"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Origine"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Valore di costo"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantità prevista"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Figlio"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Nome"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Utente scrittura"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Periodo"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantità totale"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantità totale"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Fatto da"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Decorrenza"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Numero"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Origini"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Riferimento"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Stato"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Assegnato da"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Fatto da"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Decorrenza"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Numero"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Origini"
+
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assegnato parzialmente"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Riferimento"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Stato"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Fatto da"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Decorrenza"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Numero"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assegnato parzialmente"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Riferimento"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Fatto da"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Decorrenza"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Numero"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Origini"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assegnato parzialmente"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Packed"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Riferimento"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Azienda"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Indirizzo"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Fatto da"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Decorrenza"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Numero"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Origini"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Riferimento"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Stato"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Luogo"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Luogo"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Movimenti"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periodi"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Movimento di magazzino"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Luogo del cliente"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Origini"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Origini"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Movimento di magazzino"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "From Suppliers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "From Suppliers Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "To Customers"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assegnato parzialmente"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "In attesa"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assegnato parzialmente"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Richieste"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "In attesa"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assegnato parzialmente"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "In attesa"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr "Costo"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Valute"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Numero"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Chiudi"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Packed"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventario"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventario"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configurazione"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Luogo"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Luogo"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Movimenti"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periodi"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapporti"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Origini"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Supplier Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventory & Stock"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configurazione"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Magazzino attuale"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr ""
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Magazzino"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+#, fuzzy
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Stock Configuration"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr ""
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Input Zone"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Perso e ritrovato"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Output Zone"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+#, fuzzy
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Luogo del cliente"
+
+#, fuzzy
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Movimento di magazzino"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr ""
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Luogo del cliente"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Riferimento:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Fornitore:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Magazzino:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Riferimento:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Data:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Riferimento:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Cliente:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Riferimento:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Magazzino:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Numero"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Riferimento:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Magazzino:"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipments"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Perso e ritrovato"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Deposito"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Vista"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Chiuso"
+
+#, fuzzy
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr "Variante"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr "Variante"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr "Giorno"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr "Mese"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr "Anno"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Receive"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "In attesa"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "In attesa"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "In attesa"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Receive"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Magazzino"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Quantità totale"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventario"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Sequenza"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Supplier Shipment"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr "Costo"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Movimenti"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Valore di costo"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr "Costo"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr "Costo"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr "Costo"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr ""
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recompute Cost Price"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Annulla"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/lo.po b/modules/stock/locale/lo.po
new file mode 100644
index 0000000000..a78db04aa3
--- /dev/null
+++ b/modules/stock/locale/lo.po
@@ -0,0 +1,3675 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "ມອບສົ່ງ"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "ມອບສົ່ງ"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "ບ່ອນຢູ່"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "ບ່ອນຢູ່"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "ລາຄາຄິດໄລ່"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "ລາຄາຄິດໄລ່"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "ຮ່ວງ"
+
+#, fuzzy
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "ບ່ອນຢູ່"
+
+#, fuzzy
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+#, fuzzy
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "ຮ່ວງ"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "ບ່ອນຢູ່"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "ຈຳນວນພາຍໃນ"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "ທີ່ຢູ່"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "ໝວດຍ່ອຍ"
+
+#, fuzzy
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "ລະຫັດແຂວງ"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr ""
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "ລໍຮັບຈ່າຍ"
+
+#, fuzzy
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "ຮ່ວງ"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "ຫົວໜ່ວຍເສດ"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "ຫ້ອງເກັບມ້ຽນຢາ"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "ບ່ອນຢູ່"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Warehouse"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "ບ່ອນຢູ່"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "ລາຄາຄິດໄລ່"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "ລາຄາຄິດໄລ່"
+
+#, fuzzy
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "ສະກຸນເງິນ"
+
+#, fuzzy
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "ວັນທີມີຜົນ"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "ຈຳນວນພາຍໃນ"
+
+#, fuzzy
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "ລາຍການຂັ້ນຕົ້ນ"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "ລາຄາຫົວໜ່ວຍ"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "ລາຄາຫົວໜ່ວຍ"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "ລາຄາຫົວໜ່ວຍ"
+
+#, fuzzy
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "ຫົວໜ່ວຍ"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "ຈຳນວນພາຍໃນ"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "ບ່ອນຢູ່"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "ງວດ"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "ລາຍການຂັ້ນຕົ້ນ"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "ບ່ອນຢູ່"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "ໝວດຍ່ອຍ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "ຮ່ວງ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "ຂຽນວັນທີ"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "ງວດ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "ວັນທີ"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "ຈຳນວນພາຍໃນ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "ຈຳນວນພາຍໃນ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "ວັນທີມີຜົນ"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "ຕົ້ນສະບັບ"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "ເອກະສານອ້າງອີງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "ວັນທີມີຜົນ"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "ຕົ້ນສະບັບ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "ເອກະສານອ້າງອີງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "ວັນທີມີຜົນ"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "ເອກະສານອ້າງອີງ"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "ວັນທີມີຜົນ"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "ຕົ້ນສະບັບ"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Packed"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "ເອກະສານອ້າງອີງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "ທີ່ຢູ່"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "ວັນທີມີຜົນ"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "ຕົ້ນສະບັບ"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "ເອກະສານອ້າງອີງ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "ລາຄາຄິດໄລ່"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "ເຄື່ອນຍ້າຍສາງ"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "ຜະລິດຕະພັນຕາມບ່ອນຢູ່"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "ຕົ້ນສະບັບ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "ຕົ້ນສະບັບ"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "ການຈັດສົ່ງຂອງຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "ຈັດສົ່ງພາຍໃນ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "ຈັດສົ່ງໃຫ້ລູກຄ້າ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "ຈັດສົ່ງໃຫ້ລູກຄ້າ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "ການຈັດສົ່ງຂອງຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "ການຈັດສົ່ງຄືນຂອງລູກຄ້າ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "ຈັດສົ່ງພາຍໃນ"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "ເຄື່ອນຍ້າຍສາງ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "ລາຄາຄິດໄລ່"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "ການຈັດສົ່ງຄືນໃຫ້ຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "ຈັດສົ່ງພາຍໃນ"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "From Suppliers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "From Suppliers Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "To Customers"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Packed"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "ສຳນັກງານ"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "ສະກຸນເງິນ"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "ເລກທີ"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Close"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Packed"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "ການຈັດສົ່ງຂອງຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "ການຈັດສົ່ງຄືນໃຫ້ຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "ຈັດສົ່ງພາຍໃນ"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "ການຈັດສົ່ງຂອງຜູ້ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "ການຈັດສົ່ງຄືນຂອງລູກຄ້າ"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "ການຈັດສົ່ງຂອງຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "ການຈັດສົ່ງຄືນໃຫ້ຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "ຈັດສົ່ງພາຍໃນ"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "ການຈັດສົ່ງຂອງຜູ້ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "ການຈັດສົ່ງຄືນຂອງລູກຄ້າ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "ກຳລັງລາຍງາຍ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "ຕົ້ນສະບັບ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "ການຈັດສົ່ງຂອງຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventory & Stock"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Warehouse"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "ຜະລິດຕະພັນຕາມບ່ອນຢູ່"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "ລາຄາຄິດໄລ່"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "ສາງ"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+#, fuzzy
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "ການຕັ້ງຄ່າສາງ"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr ""
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Input Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "ລໍຮັບຈ່າຍ"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Output Zone"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "ຜະລິດຕະພັນຕາມບ່ອນຢູ່"
+
+#, fuzzy
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "ເຄື່ອນຍ້າຍສາງ"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr ""
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "ຜະລິດຕະພັນຕາມບ່ອນຢູ່"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "ຜະລິດຕະພັນຕາມບ່ອນຢູ່"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "ການຈັດສົ່ງຂອງຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "ການຈັດສົ່ງຄືນໃຫ້ຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "ຈັດສົ່ງພາຍໃນ"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "ການຈັດສົ່ງຂອງຜູ້ສະໜອງ"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "ການຈັດສົ່ງຄືນຂອງລູກຄ້າ"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "ເອກະສານອ້າງອີງ"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "ຈັດສົ່ງພາຍໃນ"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "ເອກະສານອ້າງອີງ"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "ວັນທີ"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "ເອກະສານອ້າງອີງ"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Customer"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "ເອກະສານອ້າງອີງ"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "ເອກະສານອ້າງອີງ"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "ຈັດສົ່ງໃຫ້ລູກຄ້າ"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "ຈັດສົ່ງພາຍໃນ"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "ຈັດສົ່ງໃຫ້ລູກຄ້າ"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "ຈັດສົ່ງພາຍໃນ"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipments"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກແລ້ວ"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "ລໍຮັບຈ່າຍ"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "ຫ້ອງເກັບມ້ຽນຢາ"
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "ເບິ່ງ"
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກແລ້ວ"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "ປິດແລ້ວ"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກແລ້ວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Receive"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກແລ້ວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກແລ້ວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກແລ້ວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກແລ້ວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "ຊົ່ວຄາວ"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Receive"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "ສາງ"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "ການຈັດສົ່ງຄືນຂອງລູກຄ້າ"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "ການຈັດສົ່ງຂອງຜູ້ສະໜອງ"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "ຈັດສົ່ງພາຍໃນ"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "ຈຳນວນພາຍໃນ"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "ລໍາດັບ"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "ການຈັດສົ່ງຄືນໃຫ້ຜູ່ສະໜອງ"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "ການຈັດສົ່ງຂອງຜູ່ສະໜອງ"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "ຕັດບັນຊີສາງ"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr ""
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "ຕົກລົງ"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recompute Cost Price"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/lt.po b/modules/stock/locale/lt.po
new file mode 100644
index 0000000000..3849263493
--- /dev/null
+++ b/modules/stock/locale/lt.po
@@ -0,0 +1,3490 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Pristatymas"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Sandėlys"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Pristatymas"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Pirkėjo vieta"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Sandėlys"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Vietos"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Tiekėjo vieta"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Vietos"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Kontrahentas"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Pirkėjo vieta"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Kontrahentas"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Tiekėjo vieta"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Data"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Savikaina"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Prekė"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Savikaina"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Bendra savikaina"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognozuojamas kiekis"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Bendra savikaina"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognozuojamas kiekis"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Inventorizacijos numeruotė"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Grąžinimų tiekėjui numeruotė"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Tiekėjo siuntimų numeruotė"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Vidinių siuntimų numeruotė"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Vidinio siuntimo tranzitas"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Gražinimų iš pirkėjų numeruotė"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Siuntimų pirkėjui numeruotė"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Vidinio siuntimo tranzitas"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Inventorizacijos numeruotė"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Grąžinimų tiekėjui numeruotė"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Tiekėjo siuntimų numeruotė"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Vidinių siuntimų numeruotė"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Gražinimų iš pirkėjų numeruotė"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Siuntimų pirkėjui numeruotė"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Tušti kiekiai"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Eilutės"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Vietos"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Numeris"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Būsena"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Eilutė"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Prekė"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "Bendras kiekis"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "Mato vienetas"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Ieškoti"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Laukiamas kiekis"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventorizacija"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Vietos"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "Inventorizacijos būsena"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Prekė"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Bendras kiekis"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "Mato vienetas"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Adresas"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Dukteriniai"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Kodas"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Bendra savikaina"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Plokšti dukteriniai"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognozuojamas kiekis"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Priėmimas"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Kairė"
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Prarasta ir rasta"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Pavadinimas"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Išdavimas"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Motininis"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Pakavimas"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Kiekis"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Mato vieneto skaitmenų po kablelio skaičius"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Dešinė"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Saugojimas"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Vietos tipas"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Tranzito vieta"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Sandėlys"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Tiekimo laikas"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Sandėlys"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Į sandėlį"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Tranzito vieta"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Būtinas priskyrimas"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Savikaina"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Būtina vieneto kaina"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Valiuta"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Faktinė data"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Išsiuntimo vieta"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Vidinis kiekis"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Šaltinis"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Planuojama data"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Prekės mato vieneto kategorija"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Transportavimas"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Būsena"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Gavimo vieta"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Kaina"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Kaina"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Būtina vieneto kaina"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Kaina"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "Mato vienetas"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Išsaugotos vertės"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Būsena"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Vidinis kiekis"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Vietos"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Periodas"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Prekė"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Saugojimo zona"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Operacijos"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Šaltinis"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Prekė"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Bendra savikaina"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognozuojamas kiekis"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Prekė"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "Data"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Dukteriniai"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Pavadinimas"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Motininis"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Išsiuntimo vieta"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Periodas"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Vidinis kiekis"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Prekė"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Vidinis kiekis"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Prekė"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Kontaktinis adresas"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Įvykdęs naudotojas"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Faktinė data"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Gavimo operacijos"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Inventorizacijos operacijos"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Numeris"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Šaltiniai"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Planuojama data"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Priėmęs naudotojas"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Nuoroda"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Būsena"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Tiekėjas"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Tiekėjo vieta"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Sandėlio priėmimo vieta"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Sandėlio saugojimo vieta"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Priskirta"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Siuntimo adresas"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Įvykdęs naudotojas"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Faktinė data"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Išsiuntimo vieta"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Numeris"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Šaltiniai"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Priskirti"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Planuojama data"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Nuoroda"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Būsena"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Tiekėjas"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Gavimo vieta"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Priėmęs naudotojas"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Įvykdęs naudotojas"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Faktinė data"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Faktinė pradžios data"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Išsiuntimo vieta"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Gavimo operacijos"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Numeris"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Išsiuntimo operacijos"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Priskirti"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Planuojama data"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Planuojama pradžios data"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Nuoroda"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Išsiuntęs naudotojas"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Būsena"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Gavimo vieta"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "Tranzito vieta"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Pirkėjas"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Pirkėjo vieta"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Siuntimo adresas"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Įvykdęs naudotojas"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Faktinė data"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Inventorizacijos operacijos"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Numeris"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Šaltiniai"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Išsiuntimo operacijos"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Supakavęs naudotojas"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Priskirti"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Supakavęs naudotojas"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Planuojama data"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Nuoroda"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Būsena"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Sandėlio išdavimo vieta"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Sandėlio saugojimo vieta"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Kontaktinis adresas"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Pirkėjas"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Pirkėjo vieta"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Įvykdęs naudotojas"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Faktinė data"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Gavimo operacijos"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Inventorizacijos operacijos"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Numeris"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Šaltiniai"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Planuojama data"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Priėmęs naudotojas"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Nuoroda"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Būsena"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Sandėlio priėmimo vieta"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Sandėlio saugojimo vieta"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "Valiuta, kuria nurodyta vieneto kaina."
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventorizacijos"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventorizacijos"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Vietos"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Tiekimo terminas vietai"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Vietų sąrašas - Kiekis"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Hierarchinis sąrašas - Kiekis"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Vietos"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periodai"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Savikaina"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Sandėlio operacijos"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Prekių kiekis pagal sandėlius"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Prekių kiekis pagal sandėlius"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Prekės pagal vietas"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Šaltiniai"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Šaltiniai"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Tiekėjo siuntimai"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Grąžinimo tiekėjui siuntimai"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Vidiniai siuntimai"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Siuntimai pirkėjui"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Siuntimai pirkėjui"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Tiekėjo siuntimai"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Pirkėjų grąžinimo siuntimai"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Sandėlio papildymo sąrašas"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Vidinis siuntimas"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Važtaraštis"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Pakavimo lapas"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Sandėlio papildymo sąrašas"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "Skaičiavimas"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Prekių kiekis pagal sandėlius"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Sandėlio operacijos"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Savikaina"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Perskaičiuoti savikainą"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Grąžinimo tiekėjui siuntimas"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Vidinis siuntimas"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "Priskirti siuntimą pirkėjui"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "Visi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "Visi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "Iš tiekėjų"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "Laukiantys iš tiekėjų"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "Pirkėjams"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "Visi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Gauti"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "Visi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Priskirti"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Priskirti"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Laukiantis"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "Visi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Priskirti"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Priskirti"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Užklausimai"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Įvykdyti"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Laukiantys"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "Visi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Priskirti"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Priskirti"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Supakuotas"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Supakuotas"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Laukiantys"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "Visi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Gauti"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Valiuta"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Numeris"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "Užpildyti"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Patvirtinti"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "Skaičiuoti"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Vykdyti"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Taisyti"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Užverti"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Taisyti"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Atlikti"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Taisyti"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Gauta"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Priskirti"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Atlikti"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Taisyti"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Laukti"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Priskirti"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Atlikti"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Taisyti"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Siųsti"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Laukti"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Priskirti"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Atlikti"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Taisyti"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Supakuotas"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "Pakavimas"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Pabaigti"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Taisyti"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Gauti"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Laukti"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "Organizacijos naudotojas"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventorizacija"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Tiekėjo siuntimas"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Grąžinimo tiekėjui siuntimas"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Vidinis siuntimas"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Siuntimas pirkėjui"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Pirkėjo grąžinimo siuntimas"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventorizacija"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Tiekėjo siuntimas"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Grąžinimo tiekėjui siuntimas"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Vidinis siuntimas"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Siuntimas pirkėjui"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Pirkėjo grąžinimo siuntimas"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventorizacijos"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Vietos"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Vietos"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Tiekimo terminas vietai"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Vietos"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Operacijos"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periodai"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Ataskaitos"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Šaltiniai"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Siuntimai"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Tiekėjo siuntimai"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Grąžinimo tiekėjui siuntimai"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Vidiniai siuntimai"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Siuntimai pirkėjui"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Pirkėjų grąžinimo siuntimai"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventorizacijos ir sandėlys"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Nuostatos"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Kontrahento vieta"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Prekės pagal vietą"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Savikaina"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Perskaičiuoti savikainą"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Sandėlys"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Sandėlio valdymas"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Forsuoti priskyrimą sandėlyje"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Sandėlio nuostatos"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "Sandėlio valdymas - vietos"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr "Sandėlio valdymas - numeruotė"
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Sandėlio inventorizacija"
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Sandėlio inventorizacijos kiekis"
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Sandėlio inventorizacija - skaičiavimas"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Sandėlio inventorizacijos eilutė"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Sandėlio vieta"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Pirkėjas"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Priėmimo zona"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Prarasta ir rasta"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Išdavimo zona"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Saugojimo zona"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Tiekėjas"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Tranzitas"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Tiekimo laikas iš šios vietos"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Tranzito vieta"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Sandėlio operacija"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Sandėlio periodas"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "Išsaugotas sandėlio periodas"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Prekių kiekis pagal sandėlius"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Prekių kiekis pagal sandėlius"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Prekių kiekis pagal sandėlius"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Prekės pagal vietas"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Prekės pagal vietas"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Priskirti vidinį siuntimą"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Tiekėjo siuntimas"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Grąžinimo tiekėjui siuntimas"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Vidinis siuntimas"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Siuntimas pirkėjui"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Pirkėjo grąžinimo siuntimas"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Išsiuntimo vieta"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Planuojama data:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Nuoroda:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Sandėlio papildymo sąrašas"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Siuntimo numeris"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Tiekėjas:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Gavimo vieta"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Sandėlys:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Išsiuntimo vieta"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Išsiuntimo vieta:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Vidinis siuntimas"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Planuojama data:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Nuoroda:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Siuntimo numeris"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Gavimo vieta"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Gavimo vieta:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Pirkėjo kodas:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Važtaraštis"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Nuoroda:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Siuntimo numeris:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Pirkėjas:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Išsiuntimo vieta"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Pakavimo lapas"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Planuojama data:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Nuoroda:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Siuntimo numeris"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Gavimo vieta"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Sandėlys:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Pirkėjas"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Išsiuntimo vieta"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Numeris"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Planuojama data:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Kiekis"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Nuoroda:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Sandėlio papildymo sąrašas"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Transportavimas"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Gavimo vieta"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Sandėlys:"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Priskirti siuntimą pirkėjui"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Vidinis siuntimas"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Perskaičiuoti savikainą"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Siuntimai pirkėjui"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Vidiniai siuntimai"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Grąžinimo tiekėjui siuntimai"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "Ištrinti"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "Nekeisti"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Anuliuota"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Pabaigta"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Pirkėjas"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "Trikampė prekyba"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Prarasta ir rasta"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Gamyba"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Saugojimas"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Tiekėjas"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Peržiūra"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Sandėlys"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Priskirta"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Anuliuota"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Pabaigta"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr "Saugojama"
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Pabaigta"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Juodraštis"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Prekė"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Anuliuota"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Pabaigta"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Gauta"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Priskirta"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Anuliuota"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Pabaigta"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Laukiama"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Priskirta"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Anuliuota"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Pabaigta"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Užklausa"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Nusiųsta"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Laukiama"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Priskirta"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Anuliuota"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Pabaigta"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Supakuota"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Supakuota"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Laukiama"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Anuliuota"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Pabaigta"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Juodraštis"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Gauta"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Sandėlys"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Gražinimų iš pirkėjų numeruotė"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Siuntimų pirkėjui numeruotė"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Vidinių siuntimų numeruotė"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Vidinis kiekis"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventorizacija"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Numeruotė"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Siuntimai"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Grąžinimų tiekėjui numeruotė"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Tiekėjo siuntimų numeruotė"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Operacijos"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Kita informacija"
+
+#, fuzzy
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Bendra savikaina"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Nepavyko priskirti šių prekių:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Kita informacija"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Kita informacija"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Kita informacija"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Kita informacija"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Kita informacija"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Išsiuntimo operacijos"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "Gerai"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Perskaičiuoti savikainą"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "Pridėti"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "Pabaigti"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "Pasirinkti"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Atsisakyti"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Laukti"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/nl.po b/modules/stock/locale/nl.po
new file mode 100644
index 0000000000..5082dde0f7
--- /dev/null
+++ b/modules/stock/locale/nl.po
@@ -0,0 +1,3419 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Levering"
+
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Magazijnen"
+
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Levering"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Klant locatie"
+
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Geleverd aan Magazijnen"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Locaties"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Leverancier locatie"
+
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Locatie"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Relatie"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Klant locatie"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Relatie"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Leverancier locatie"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Op datum"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Op datum"
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Nieuwe kostprijs"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Nieuwe kostprijs"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Kosten"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Verwachte hoeveelheid"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "Van"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Kosten"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Verwachte hoeveelheid"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Huidig magazijn"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Voorraad reeks"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Leverancier retourzending reeks"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Leveranciers zending reeks"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Interne zending reeks"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Interne zending doorvoer"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Klant retourzending reeks"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Klant zending reeks"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Interne zending doorvoer"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Voorraad reeks"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Leverancier retourzending reeks"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Leveranciers zending reeks"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Interne zending reeks"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Klant retourzending reeks"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Klant zending reeks"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Lege hoeveelheid"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Regels"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Locatie"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Regel"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "Totale hoeveelheid"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "Maateenheid"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Zoeken"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Verwachte hoeveelheid"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Voorraad"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Locatie"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "Voorraad status"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Actuele hoeveelheid"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "Maateenheid"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Adres"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr "Afhalen Toestaan"
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Onderliggende niveaus"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Kosten"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Platte structuur"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Verwachte hoeveelheid"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Binnenkomst"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Links"
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Voorraad verschil"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Uitgaand"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Verzamelen"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Hoeveelheid maateenheid"
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Standaard maateenheid decimalen"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Rechts"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Opslag"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Locatie soort"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Afval locaties"
+
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Afval magazijnen"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Doorlooptijd"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Magazijn van"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Magazijn naar"
+
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Afval locatie"
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Toewijzing verplicht"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Kostprijs"
+
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Kostprijs vereist"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Effectieve datum"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Van locatie"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Interne hoeveelheid"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Oorsprong"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Geplande datum"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categorie product maateenheid"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Levering"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Naar locatie"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Eenheidsprijs"
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Eenheidsprijs"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Eenheidsprijs vereist"
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Eenheidsprijs bijgewerkt"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "Maateenheid"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Opslag"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Interne hoeveelheid"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Locatie"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Periode"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Enkel opslagzone"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr "Cumulatieve verschil hoeveelheid"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr "Cumulatieve hoeveelheid einde"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr "Cumulatieve hoeveelheid start"
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr "Document"
+
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Voorraad beweging"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Oorsprong"
+
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr "Verbruiksartikel"
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Kosten"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "Standaard maateenheid"
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Standaard maateenheid decimalen"
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Verwachte hoeveelheid"
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "Op datum"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "Op datum"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr "Tijdreeksen"
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Onderliggende niveaus"
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Vanaf datum"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr "Inclusief voorraadverschil"
+
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Periode"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Tot datum"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr "Tijdreeksen"
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Interne hoeveelheid"
+
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr "Tijdreeksen"
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Interne hoeveelheid"
+
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Contact adres"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Afgerond door"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Effectieve datum"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Inkomende bewegingen"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Oorsprongen"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Geplande datum"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Ontvangen door"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Leverancier locatie"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Magazijn binnenkomst"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Magazijn opslag"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Toegewezen door"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Afleveradres"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Afgerond door"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Effectieve datum"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Van locatie"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Oorsprongen"
+
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Gedeeltelijk toegewezen"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Geplande datum"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Naar locatie"
+
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Ontvangen door"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Afgerond door"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Effectieve datum"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Effectieve startdatum"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Van locatie"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Inkomende bewegingen"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Uitgaande voorraadbewegingen"
+
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Gedeeltelijk toegewezen"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Geplande datum"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Geplande startdatum"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Verzonden door"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Naar locatie"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "Transport locatie"
+
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Klant"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Klant locatie"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Afleveradres"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Afgerond door"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Effectieve datum"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Oorsprongen"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Uitgaande voorraadbewegingen"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Verpakt door"
+
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Gedeeltelijk toegewezen"
+
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Verzameld door"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Geplande datum"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Magazijn uitgaand"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Magazijn opslag"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Contact adres"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Klant"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Klant locatie"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Afgerond door"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Effectieve datum"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Inkomende bewegingen"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Oorsprongen"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Geplande datum"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Ontvangen door"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Referentie"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Magazijn binnenkomst"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Magazijn opslag"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr "Vink aan om leveringen naar dit adres te verzenden."
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr "Vink aan om te gebruiken voor levering."
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"De standaard bestemming locatie voor voorraad die naar deze relatie "
+"verzonden word."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "De standaard locatie voor de voorraad geleverd door deze relatie ."
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"De standaard bestemming locatie voor voorraad die naar deze relatie "
+"verzonden word."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "De standaard locatie voor de voorraad geleverd door deze relatie ."
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"De datum waar de hoeveelheid voorraad voor wordt berekend.\n"
+"* Een lege waarde berekent zo ver mogelijk vooruit.\n"
+"* Een datum in het verleden geeft historische gegevens."
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"Python-expressie die wordt geëvalueerd met:\n"
+"- cost_price: de huidige kostprijs van het product"
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"Python-expressie die wordt geëvalueerd met:\n"
+"- cost_price: de huidige kostprijs van het product"
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "De waarde van de voorraad op de locatie."
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "De verwachte voorraad op de locatie."
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr "De voorraad op de locatie."
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "De waarde van de voorraad op de locatie."
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "De verwachte voorraad op de locatie."
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr "De voorraad op de locatie."
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr "Het magazijn waar de gebruiker werkt."
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+"Wordt gebruikt om het nummer te genereren dat aan de voorraden wordt "
+"gegeven."
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+"Wordt gebruikt om het nummer te genereren dat aan leverancier "
+"retourzendingen wordt gegeven."
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+"Wordt gebruikt om het nummer te genereren dat aan leverancier zendingen "
+"wordt gegeven."
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+"Wordt gebruikt om het nummer te genereren dat aan interne zendingen wordt "
+"gegeven."
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"De standaard locatie die wordt gebruikt voor voorraad die onderweg is tussen"
+" magazijnen."
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+"Wordt gebruikt om het nummer te genereren dat aan klant retourzendingen "
+"wordt gegeven."
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+"Wordt gebruikt om het nummer te genereren dat aan klant zendingen wordt "
+"gegeven."
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"De standaard locatie die wordt gebruikt voor voorraad die onderweg is tussen"
+" magazijnen."
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr "Het bedrijf waaraan de voorraad gekoppeld is."
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr "De datum van de voorraad telling."
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Hoe regels zonder hoeveelheid worden behandeld."
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr "De geïnventariseerde locatie."
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr "De belangrijkste referentie voor de voorraad."
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr "De huidige staat van de voorraad."
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr "De hoeveelheid die moet worden toegevoegd aan de bestaande telling."
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr "Het totale bedrag van de regels die tot nu toe geteld zijn."
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr "De eenheid waarin de hoeveelheden zijn opgegeven."
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr "Het item dat geteld is."
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr "De hoeveelheid die het systeem berekende voor de locatie."
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr "De voorraad waar de regel toe behoort."
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr "De werkelijke hoeveelheid die op de locatie is gevonden."
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "De eenheid waarin de hoeveelheid is opgegeven."
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr "Wordt gebruikt om structuur onder de locatie toe te voegen."
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr "De interne referentie die voor de locatie wordt gebruikt."
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "De waarde van de voorraad op de locatie."
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr "Vink aan om één onderliggend niveau zonder subniveau's af te dwingen."
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "De verwachte voorraad op de locatie."
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr "Inkomende voorraad wordt hier ontvangen."
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+"Wordt gebruikt door voorraden bij het corrigeren van voorraadniveaus in het "
+"magazijn."
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr "Uitgaande voorraad wordt van hieruit verzonden."
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr "Wordt gebruikt om structuur boven de locatie toe te voegen."
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+"Voorraad wordt van hieruit verzameld.\n"
+"Laat leeg om de opslaglocatie te gebruiken."
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr "De voorraad op de locatie."
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr "De locatie van het hoogste niveau waar de voorraad is opgeslagen."
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr "De locaties die worden gebruikt voor afvalproducten van het magazijn."
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr "De magazijnen die de locatie gebruiken voor afvalproducten."
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+"De tijd die het kost om de voorraad tussen de magazijnen te verplaatsen."
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr "Het bedrijf waar de voorraad beweging aan gekoppeld is."
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "De valuta waarin de eenheidsprijs is opgegeven."
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr "Wanneer de voorraad daadwerkelijk werd verplaatst."
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Waar de voorraad vanuit wordt verplaatst."
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr "De bron van de voorraad beweging."
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr "Wanneer wordt verwacht dat de voorraad wordt verplaatst."
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr "Het product waar de voorraad beweging aan gekoppeld is."
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr "De hoeveelheid voorraad die verplaatst is."
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr "Wordt gebruikt om verschillende voorraad bewegingen te groeperen."
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr "De huidige status van de voorraad beweging."
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Waar de voorraad naartoe wordt verplaatst."
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr "Eenheidsprijs in bedrijfsvaluta."
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "De eenheid waarin de hoeveelheid is opgegeven."
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr "Het bedrijf waar de voorraad periode aan gekoppeld is."
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr "Wanneer de voorraad periode eindigt."
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr "De huidige status van de voorraad periode."
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr "Vink aan om alleen de hoeveelheid van de opslag locatie te gebruiken."
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr "Het magazijn waarvoor de hoeveelheden worden berekend."
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"De datum waar de hoeveelheid voorraad voor wordt berekend.\n"
+"* Een lege waarde berekent zo ver mogelijk vooruit.\n"
+"* Een datum in het verleden geeft historische gegevens."
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+"Bij activering wordt rekening gehouden met de kosten van producten die naar "
+"een voorraadverschil locatie zijn geboekt."
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr "De voorraad bewegingen die niet zijn toegewezen."
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr "Het bedrijf waar de zending aan gekoppeld is."
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr "Het adres waar de leverancier op gecontacteerd kan worden."
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr "Wanneer de voorraad daadwerkelijk werd ontvangen."
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "De voorraad bewegingen die de voorraad naar het magazijn brengen."
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "De voorraad bewegingen die de voorraad in de opslagruimte plaatsen."
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr "De hoofd identificatie voor de zending."
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr "Wanneer wordt verwacht dat de voorraad wordt ontvangen."
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "De referentie van de leverancier voor de zending."
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr "De huidige status van de zending."
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr "De relatie die de voorraad heeft geleverd."
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr "Waar de voorraad is ontvangen."
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "Het bedrijf waar de zending aan gekoppeld is."
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Waar de voorraad naartoe wordt gezonden."
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr "Wanneer de voorraad daadwerkelijk werd geretourneerd."
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Waar de voorraad vanuit wordt verplaatst."
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+"De voorraad bewegingen die de voorraad terugsturen naar de leverancier."
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "De hoofd identificatie voor de zending."
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Wanneer wordt verwacht dat de voorraad wordt geretourneerd."
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "De referentie van de leverancier voor de zending."
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr "De huidige status van de zending."
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr "De relatie die de voorraad heeft geleverd."
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Waar de voorraad naartoe wordt verplaatst."
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr "Het bedrijf waar de zending aan gekoppeld is."
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr "Wanneer de zending daadwerkelijk werd afgerond."
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr "Wanneer de voorraad daadwerkelijk werd verzonden."
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr "Waar de voorraad vanuit wordt verplaatst."
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr "De voorraad bewegingen die de voorraad ontvangen."
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr "De voorraad bewegingen die de zending uitvoeren."
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr "De hoofd identificatie voor de zending."
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr "De voorraad bewegingen die de voorraad versturen."
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr "Wanneer de verzending naar verwachting wordt afgerond."
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Wanneer wordt verwacht dat de voorraad wordt verzonden."
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr "De externe referentie voor de zending."
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr "De huidige status van de zending."
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Waar de voorraad naartoe wordt verplaatst."
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+"Waar de voorraad zich bevindt terwijl deze onderweg is tussen de magazijnen."
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Magazijn van waaruit de goederen worden verzonden."
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr "Het bedrijf waar de zending aan gekoppeld is."
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr "De relatie die de voorraad heeft gekocht."
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Waar de voorraad naartoe wordt gezonden."
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Wanneer de voorraad daadwerkelijk werd verzonden."
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr "De voorraad bewegingen die de voorraad uit de opslag verzamelen."
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr "De hoofd identificatie voor de zending."
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr "De voorraad bewegingen die de voorraad naar de klant sturen."
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Wanneer wordt verwacht dat de voorraad wordt verzonden."
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "De referentie van de klant voor de zending."
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr "De huidige status van de zending."
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "Waar de voorraad vanuit wordt verzonden."
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "Het bedrijf waar de zending aan gekoppeld is."
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr "Het adres waar de klant op bereikt kan worden."
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr "De relatie die de voorraad heeft gekocht."
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr "Wanneer de voorraad werd geretourneerd."
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "De voorraad bewegingen die de voorraad naar het magazijn brengen."
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "De voorraad bewegingen die de voorraad in de opslagruimte plaatsen."
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "De hoofd identificatie voor de zending."
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Wanneer wordt verwacht dat de voorraad wordt geretourneerd."
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "De referentie van de klant voor de zending."
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr "De huidige status van de zending."
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr "Waar de voorraad wordt geretourneerd."
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Voorraden"
+
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Voorraad regels"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Locaties"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Locatie doorlooptijden"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Lijst met hoeveelheden per locatie"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Boomstructuur met hoeveelheden per locatie"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locaties"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periodes"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Kostprijs revisie"
+
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Voorraad beweging"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product hoeveelheden per magazijn"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Voorraad bewegingen per magazijn"
+
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Producten per locatie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr "Marges per categorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr "Marges per categorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr "Marges per categorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Marges"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Marges"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr "Marges per product"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr "Marges per product"
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Leveranciers zendingen"
+
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Retourzending leverancier"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Interne zendingen"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Klant zendingen"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Klant zendingen"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Leveranciers zendingen"
+
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Retourzending klant"
+
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Voorraad aanvul lijst"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Interne zending"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Afleverbon"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Verzamel lijst"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Voorraad aanvul lijst"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "Tellen"
+
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product hoeveelheden per magazijn"
+
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Voorraad beweging"
+
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Kostprijs wijzigen"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Kostprijs herberekenen"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Retour zending leverancier toewijzen"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Interne zending toewijzen"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "Klant zending toewijzen"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "Alles"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "Alles"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "Van leveranciers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "Wachtend van leveranciers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "Aan klanten"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "Alles"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Ontvangen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "Alles"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Toegewezen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Gedeeltelijk toegewezen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "Alles"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Toegewezen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Gedeeltelijk toegewezen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Verzoeken"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Verzonden"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "Alles"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Toegewezen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Gedeeltelijk toegewezen"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Verpakt"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Verzameld"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "Alles"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Ontvangen"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+"U kunt de relatie \"%(party)s\" niet verwijderen terwijl ze leveringen in "
+"behandeling hebben bij bedrijf \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"Ongeldige kostprijs \"%(cost_price)s\" voor product \"%(product)s\" met "
+"uitzondering \"%(exception)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr "Geen bestaande regel gevonden voor \"%(search)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr "De voorraden \"%(inventories)s\" hebben datums in de toekomst."
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr "Om de voorraad \"%(inventory)s\" te verwijderen, moet u deze annuleren."
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+"Om voorraad regel \"%(line)s\" te verwijderen, moet u de voorraad "
+"\"%(inventory)s\" annuleren."
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "Hoeveelheid van een voorraad regel moet positief zijn."
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr "Voorraad regel \"%(line)s\"is niet uniek op voorraad \"%(inventory)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+"Om de voorraad \"%(inventory)s\" te bevestigen, moet u voorraadverschillen "
+"op de hoofd locatie aanzetten \"%(location)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+"Om de voorraad \"%(inventory)s\" te bevestigen, moet u een optie voor de "
+"lege hoeveelheid selecteren."
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+"Om locatie \"%(location)s\" in te stellen als opslag / inkomend / uitgaand "
+"van magazijn \"%(warehouse)s\", moet deze zich in het magazijn bevinden."
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr "Om locatie \"%(location)s\" te deactiveren, moet deze leeg zijn."
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+"U kunt het soort van locatie \"%(location)s\" niet wijzigen in \"%(type)s\n"
+"omdat het soort geen voorraad bewegingen ondersteunt en de bestaande locatie voorraad bewegingen heeft."
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+"Als u voorraad bewegingen \"%(move)s\" wilt verwijderen, moet u deze "
+"annuleren of de status opnieuw instellen op concept."
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+"De voorraad bewegingen \"%(moves)s\" hebben effectieve datums in de "
+"toekomst."
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+"De bron en bestemming van de voorraad beweging moeten verschillend zijn."
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "De hoeveelheid van interne beweging moet positief zijn."
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+"Om voorraad beweging \"%(move)s\" te wijzigen, moet u de status opnieuw "
+"instellen op concept."
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+"U kunt voorraad beweging \"%(move)s\" niet wijzigen omdat deze is "
+"geannuleerd."
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+"U kunt voorraad beweging \"%(move)s\" niet wijzigen omdat deze al afgerond "
+"is."
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+"Om voorraad beweging \"%(move)s\" te wijzigen, moet u periode \"%(period)s\""
+" opnieuw openen."
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr "Voorraad bewegingen \"%(moves)s\" hebben geen oorsprong."
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "De hoeveelheid van de voorraad beweging moet positief zijn."
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr "U kunt geen periode sluiten met toegewezen voorraad bewegingen erin."
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr "U kunt geen periodes sluiten met een datum in de toekomst of vandaag."
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"U kunt de kostprijs van een product dat is gekoppeld aan voorraad bewegingen niet wijzigen.\n"
+"U moet de assistent \"Kostprijs wijzigen\" gebruiken."
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"U kunt de standaard maateenheid van een product dat gekoppeld is aan "
+"voorraad bewegingen niet wijzigen."
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+"U kunt het soort van het product dat is gekoppeld aan voorraad bewegingen "
+"niet wijzigen."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+"Het product \"%(product)s\" heeft nog een hoeveelheid op locatie "
+"\"%(locations)s\" voor bedrijf \"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+"Het is aan te raden om de voorraad op te maken in het magazijn voordat het "
+"product gedeactiveerd wordt."
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr "Om zending \"%(shipment)s\" te verwijderen, moet u deze annuleren."
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+"Om zending \"%(shipment)s\" in te pakken, moet u de voorraad bewegingen "
+"uitvoeren."
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr "Marge"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr "Marge trend"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr "Winst"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr "Omzet"
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr "Weet u zeker dat u de voorraad wilt annuleren?"
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr "Weet u zeker dat u de voorraad wilt bevestigen?"
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr "Weet u zeker dat u de voorraad beweging wilt annuleren?"
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr "Weet u zeker dat u de voorraad beweging wilt voltooien?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Weet u zeker dat u de zending wilt ontvangen?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Weet u zeker dat u de zending wilt voltooien?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Weet u zeker dat u de zending wilt voltooien?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Weet u zeker dat u de zending wilt ontvangen?"
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Voeg een voorraad regel toe voor elk ontbrekend product"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "Start de assistent om producten te tellen"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "Voltooien"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Bevestigen"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "Tellen"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Doe"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Terug naar concept"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Afsluiten"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Afronden"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Terug naar concept"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Ontvang"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Toewijzen"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Afronden"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wachten"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Toewijzen"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Afronden"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Verzend"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wachten"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Toewijzen"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Afronden"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Verpak"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "Verzamel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Afronden"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Ontvang"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wachten"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Voorraad"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Leverancier zending"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Leverancier retourzending"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Interne zending"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Klant zending"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Klant retourzending"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Voorraad"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Leverancier zending"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Leverancier retourzending"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Interne zending"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Klant zending"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Klant retourzending"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Voorraden"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locaties"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locaties"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Locatie doorlooptijden"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locaties"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Voorraad bewegingen"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periodes"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Rapportage"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Marges"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Zendingen"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Leveranciers zendingen"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Retourzending leverancier"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Interne zendingen"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Klant zendingen"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Retourzending klant"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Voorraad"
+
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Instellingen"
+
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Relatie Geleverd aan Magazijn"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Relatie locatie"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Product per locatie"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr "Product kostprijs revisie"
+
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Kostprijs wijzigen"
+
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Kostprijs herberekenen"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Voorraad"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Voorraad administratie"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Voorraad geforceerd toewijzen"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Voorraad configuratie"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "Voorraad configuratie locatie"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr "Voorraad configuratie reeks"
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Voorraad inventarisatie"
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Voorraad inventaris telling"
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Voorraad inventaris telling"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Voorraad inventaris regel"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Voorraad locatie"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Klant"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Binnenkomst locatie"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Voorraad verschil"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Uitgaande zone"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Opslag ruimte"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Op transport"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Locatie doorlooptijd"
+
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Magazijn afval locatie"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Voorraad beweging"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Voorraad periode"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "Voorraad periode opslag"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product hoeveelheden per magazijn"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product hoeveelheden per magazijn"
+
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product hoeveelheden per magazijn bewegingen"
+
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Producten per locatie"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Producten per locatie"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Voorraad marge rapportage per categorie"
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Voorraad marge rapportage per categorie"
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Voorraad marge rapportage per categorie"
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr "Context voorraad marge rapportage"
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr "Voorraad marge rapportage"
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr "Voorraad marge rapportage"
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr "Voorraad marge rapportage per product"
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr "Voorraad marge rapportage per product"
+
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Zending toewijzen"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Leverancier zending"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Leverancier retourzending"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Interne zending"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Klant zending"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Klant retourzending"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Van locatie"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Geplande datum:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Referentie:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Voorraad aanvul lijst"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Leveringsnummer"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Leverancier:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Naar locatie"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Magazijn:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Van locatie"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Van locatie:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Interne zending"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Geplande datum:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Referentie:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Leveringsnummer"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Naar locatie"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Naar locatie:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Klantnummer:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Datum:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Afleverbon"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Referentie:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Leveringsnummer:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Klant:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Van locatie"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Verzamel lijst"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Geplande datum:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Referentie:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Leveringsnummer"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Naar locatie"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Magazijn:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Klant"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Van locatie"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Geplande datum:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Referentie:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Voorraad aanvul lijst"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Levering"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Naar locatie"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Magazijn:"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Klant zending toewijzen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Interne zending toewijzen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Kostprijs berekenen aan de hand van voorraadbewegingen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Klant zendingen opnieuw inplannen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Interne zendingen opnieuw plannen"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Leveranciers retour zendingen opnieuw inplannen"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "Leeg"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "Behouden"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Afgerond"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Klant"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "Incourant"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Voorraad verschil"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Opslag"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Weergave"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Toegewezen"
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Afgerond"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr "In uitvoering"
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Afgesloten"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr "Variant"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr "Dag"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr "Maand"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr "Jaar"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Afgerond"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Ontvangen"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Toegewezen"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Afgerond"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Toegewezen"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Afgerond"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Verzoek"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Verzonden"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Toegewezen"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Afgerond"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Verpakt"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Verzameld"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "In afwachting"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Afgerond"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Ontvangen"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Voorraad"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr "Het magazijn waar u werkt."
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Klant retourzending reeks"
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Klant zending reeks"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Interne zending reeks"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Intern transport"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Voorraad"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Leveringen"
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Leverancier retourzending reeks"
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Leveranciers zending reeks"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Voorraad beweging"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Overige informatie"
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Kosten"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr "Omzet"
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr "Omzet"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr "Kosten"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr "Omzet"
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Kan deze producten niet toewijzen:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Overige informatie"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Overige informatie"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Overige informatie"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Overige informatie"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Overige informatie"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Uitgaande voorraadbewegingen"
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Herberekenen"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "Toevoegen"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "Einde"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "Selecteer"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wachten"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr "Afdwingen"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr "Negeren"
diff --git a/modules/stock/locale/pl.po b/modules/stock/locale/pl.po
new file mode 100644
index 0000000000..3eaa8be521
--- /dev/null
+++ b/modules/stock/locale/pl.po
@@ -0,0 +1,3576 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Dostawa"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Magazyn"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Dostawa"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Lokalizacja klienta"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Magazyn"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Lokalizacje"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lokalizacja dostawcy"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Lokalizacja"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Strona"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Lokalizacja klienta"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Strona"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lokalizacja dostawcy"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Na dzień"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na dzień"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Firma"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Cena kosztów"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr "Wariant"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Cena kosztów"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Wartość kosztu"
+
+#, fuzzy
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Ilość przewidywana"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "Od"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Wartość kosztu"
+
+#, fuzzy
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Ilość przewidywana"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Magazyn"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+#, fuzzy
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Wiersze"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Lokalizacja"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Wiersze"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "Jm"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Szukaj"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Oczekiwana ilość"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Lokalizacja"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Ilość przewidywana"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "Jm"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Adres"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Lokalizacje podrzędne"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Kod"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Wartość kosztu"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Ilość przewidywana"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Wejście"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "W lewo"
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Zgubione i znalezione"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Wyjście"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Lokalizacje nadrzędne"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Ilość"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Cyfry jednostki"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "W prawo"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Typ lokalizacji"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Lokalizacja strony"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Magazyn"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Czas przesunięcia"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Z magazynu"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Do magazynu"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Lokalizacja strony"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Cena kosztów"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Wymagana cena jednostkowa"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Waluta"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Data rzeczywista"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Z lokalizacji"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Źródło"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Data planowana"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Kategoria jm produktu"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Wysyłka"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Do lokalizacji"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Cena jednostkowa"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Cena jednostkowa"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Wymagana cena jednostkowa"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Cena jednostkowa"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "Jm"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Lokalizacja"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Okres"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Storage Zone"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Ruchy"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Źródło"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Wartość kosztu"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Ilość przewidywana"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "Na dzień"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na dzień"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Lokalizacje podrzędne"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Lokalizacje nadrzędne"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Firma"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Z lokalizacji"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Okres"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Ilość przewidywana"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Ilość przewidywana"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Adres kontaktowy"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Wykonano przez"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Data rzeczywista"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Źródła"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Data planowana"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Referencja"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Dostawca"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lokalizacja dostawcy"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adres dostawy"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Wykonano przez"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Data rzeczywista"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Z lokalizacji"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Źródła"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Data planowana"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Referencja"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Dostawca"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Do lokalizacji"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Firma"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Wykonano przez"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Data rzeczywista"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Rzeczywista data rozpoczęcia"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Z lokalizacji"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Data planowana"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Zaplanowana data rozpoczęcia"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Referencja"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Do lokalizacji"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Klient"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Lokalizacja klienta"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adres dostawy"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Wykonano przez"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Rzeczywista data"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Źródła"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Packed"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Data planowana"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Referencja"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Firma"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Adres kontaktowy"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Odbiorca"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Lokalizacja odbiorcy"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Wykonano przez"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Rzeczywista data"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Źródła"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Planowana data"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Referencja"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Lokalizacje"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Cena kosztów"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Ruchy"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Produkty wg lokalizacji"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Źródła"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Źródła"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Picking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Ruchy"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Cena kosztów"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "From Suppliers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "From Suppliers Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "To Customers"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr "Brak możliwości zmiany typu dla produktu wykazującego ruch."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"Brak możliwości zmiany domyślnej jednostki miary dla produktu wykazującego "
+"ruch."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr "Brak możliwości zmiany typu dla produktu wykazującego ruch."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Waluta"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Zamknij"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Packed"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Źródła"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Wysyłki"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventory & Stock"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Konfiguracja"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Magazyn"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Lokalizacja strony"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Produkt wg lokalizacji"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Cena kosztów"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Konfiguracja zapasów"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr ""
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Klient"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Input Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Output Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Storage Zone"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Dostawca"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Czas przesunięcia między magazynami"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Lokalizacja klienta"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr ""
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr ""
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Ilości produktów wg magazynu"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Ilości produktów wg magazynu"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Produkty wg lokalizacji"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Produkty wg lokalizacji"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Z lokalizacji"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Data planowana:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Referencja:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Numer wysyłki"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Dostawca:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Do lokalizacji"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Magazyn:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Z lokalizacji"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Z lokalizacji:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Data planowana:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Referencja:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Numer wysyłki"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Do lokalizacji"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Do lokalizacji:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Kod odbiorcy:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "List przewozowy"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Referencja"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Numer wysyłki:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Odbiorca:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Z lokalizacji"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Data planowana:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Referencja:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Numer wysyłki"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Do lokalizacji"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Magazyn:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Odbiorca"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Z lokalizacji"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Data planowana:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Referencja:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Wysyłka"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Do lokalizacji"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Magazyn:"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipment"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Odbiorca"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Zgubione i znalezione"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Produkcja"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Dostawca"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Widok"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Magazyn"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Przydzielono"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Zamknięto"
+
+#, fuzzy
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr "Wariant"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr "Wariant"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Odebrany"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Przydzielono"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Oczekujący"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Przydzielono"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Oczekujący"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Przydzielono"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Packed"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Oczekujący"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Anulowano"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Otrzymany"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Ilość przewidywana"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Sekwencja"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Wysyłki"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Sekwencja wysyłki od dostawcy"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Ruchy"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Inne informacje"
+
+#, fuzzy
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Wartość kosztu"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr ""
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Inne informacje"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Inne informacje"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Inne informacje"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Inne informacje"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Inne informacje"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "OK"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recompute Cost Price"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/pt.po b/modules/stock/locale/pt.po
new file mode 100644
index 0000000000..7cbcb8ecf3
--- /dev/null
+++ b/modules/stock/locale/pt.po
@@ -0,0 +1,3575 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Entrega"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Almoxarifado"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Entrega"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Localização do cliente"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Almoxarifado"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Locais"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Localização do fornecedor"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Localização"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Pessoa"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Localização do Cliente"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Pessoa"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Localização do Fornecedor"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Na Data"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na Data"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Empresa"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Preço de custo"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Preço de custo"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de Custo"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Previsão da quantidade"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de Custo"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantidade Prevista"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Sequência do Inventário"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Sequência de Remessa de Devolução ao Fornecedor"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Sequência de Remessa do Fornecedor"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Sequência de Remessa Interna"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Trânsito de Remessa Interna"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Sequência de Devolução do Cliente"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Sequência de Remessa ao Cliente"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Trânsito de Remessa Interna"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Sequência de Inventório"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Sequência de Remessa de Devolução ao Fornecedor"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Sequência de Remessa do Fornecedor"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Sequência de Remessa Interna"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Sequência de Devolução do Cliente"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Sequência de Remessa ao Cliente"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Linhas"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Localização"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Estado"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Linhas"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "UM"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Quantidade esperada"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventário"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Localização"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "Estado do Inventário"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Quantidade interna"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "UM"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Endereço"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Filhos"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de Custo"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Filhos planificados"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantidade Prevista"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Entrada"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Esquerda"
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Achados e Perdidos"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Saída"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Pai"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Retira"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Quantidade"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Dígitos da unidade"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Direita"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Armazenamento"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Tipo da localização"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Localização do Trânsito"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Almoxarifado"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Tempo de Espera"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Do Almoxarifado"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Para o Almoxarifado"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Localização do Trânsito"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Atribuição Obrigatória"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Preço de custo"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Preço Unitário Obrigatório"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Moeda"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Data efetiva"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Origem"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantidade interna"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Origem"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Data planejada"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoria da UDM do Produto"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Remessa"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Destino"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Preço unitário"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Preço unitário"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Preço Unitário Obrigatório"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Preço unitário"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "UDM"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Provisões"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantidade interna"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Localização"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Período"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Storage Zone"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Movimentações"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Origem"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Valor de Custo"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Previsão da quantidade"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "Na Data"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na data"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Filhos"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Nome"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Pai"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Empresa"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Origem"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Período"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantidade interna"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantidade interna"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Endereço de contato"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Feito Por"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Data efetiva"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Movimentações de Entrada"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Movimentações Internas"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Origens"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Data planejada"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Recebido Por"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Referência"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Fornecedor"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Localização do fornecedor"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Entrada do Almoxarifado"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Armazenamento do Almoxarifado"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Atribuído Por"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Endereço para Entrega"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Feito Por"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Data efetiva"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Origem"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Origens"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Data planejada"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Referência"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Fornecedor"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Destino"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Recebido Por"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Feito Por"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Data efetiva"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Data Efetiva de Início"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Origem"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Movimentações de Entrada"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Movimentações de Saída"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Data planejada"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Data Planejada de Início"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Referência"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Enviado Por"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Destino"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "Localização do Trânsito"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Localização do Cliente"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Endereço para entrega"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Feito Por"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Data efetiva"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Movimentações Internas"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Origens"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Movimentações de Saída"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Empacotado Por"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Empacotado Por"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Data planejada"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Referência"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Saída do Almoxarifado"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Armazenamento do Almoxarifado"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Empresa"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Endereço de contato"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Localização do Cliente"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Feito Por"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Data efetiva"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Movimentações de Entrada"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Movimentações Internas"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Origens"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Data planejada"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Recebido Por"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Referência"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Entrada do Almoxarifado"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Armazenamento do Almoxarifado"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "Destino padrão ao enviar ao cliente."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "Destino padrão ao enviar ao cliente."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Preço de custo"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Movimentação do estoque"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Produtos por Localizações"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Origens"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Origens"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Picking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Movimentação do estoque"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Preço de custo"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Reservar Devolução ao Fornecedor"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "From Suppliers"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "From Suppliers Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "To Customers"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr "Linha não encontrada para %(search)s."
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "A quantidade na movimentação interna deve ser um valor positivo"
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "A quantidade na movimentação interna deve ser um valor positivo"
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "A quantidade na movimentação deve ser um valor positivo"
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"Você não pode modificar o tipo de um produto que está associado a "
+"movimentações do estoque."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"Você não pode modificar a UDM padrão de um produto associado a movimentações"
+" no estoque"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+"Você não pode modificar o tipo de um produto que está associado a "
+"movimentações do estoque."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Moeda"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Close"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "Retira"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Origens"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Remessas"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventory & Stock"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Localização da Pessoa"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Produto por Local"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Preço de custo"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stock"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Configuração do estoque"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "Configuração de Estoque do Local"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr "Configuração de Estoque Sequência"
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Inventário do estoque"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Linha de inventário do estoque"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Linha de inventário do estoque"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Linha de inventário do estoque"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Localização do estoque"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Input Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Output Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Tempo de Espera da Localização"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Localização do Trânsito"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Movimentação do estoque"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Período do Estoque"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "Reserva de Período do Estoque"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Quantidade de Produto por Almoxarifado"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Quantidade de Produto por Almoxarifado"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Produtos por Localizações"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Produtos por Localizações"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Remessa do Fornecedor"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Devolução ao Fornecedor"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Remessa Interna"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Remessa ao Cliente"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Devolução do Cliente"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Origem"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Data Planejada:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Referências"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Relação para re-estocagem"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Número da Remessa"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Fornecedor:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Destino"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Almoxarifado:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Origem"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Origem:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Remessa Interna"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Data Planejada:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Referência:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Número da Remessa"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Destino"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Destino:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Código do Cliente:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Notificação de entrega"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Referência:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Número da Remessa:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Cliente:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Origem"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Relação para separação"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Data Planejada:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Referência:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Número da Remessa"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Destino"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Almoxarifado"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Origem"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Data Planejada:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Referência:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Relação para re-estocagem"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Remessa"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Destino"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Almoxarifado"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipments"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "Entrega direta"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Achados e Perdidos"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Produção"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Armazenamento"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Fornecedor"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Exibir"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Almoxarifado"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Reservado"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr "Em processamento"
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Fechado"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Recebido"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Reservado"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Em Espera"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Reservado"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Soliditado"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Enviado"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Em Espera"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Reservado"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Empacotado"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Empacotado"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Em Espera"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Recebido"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Estoque"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Sequência de Devolução do Cliente"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Sequência de Remessa ao Cliente"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Sequência de Remessa Interna"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Quantidade interna"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventário"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Sequência"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Remessas"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Sequência de Remessa de Devolução ao Fornecedor"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Sequência de Remessa do Fornecedor"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Movimentações"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Outras Informações"
+
+#, fuzzy
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Valor de Custo"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Não é possível reservar estes produtos:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Outras Informações"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Outras Informações"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Outras Informações"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Outras Informações"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Outras Informações"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Movimentações de Saída"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "OK"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recompute Cost Price"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/ro.po b/modules/stock/locale/ro.po
new file mode 100644
index 0000000000..1283ddb204
--- /dev/null
+++ b/modules/stock/locale/ro.po
@@ -0,0 +1,3387 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Livrare"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Depozit"
+
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Livrare"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Locaţia Client"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Depozit Curent"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Locaţii"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Locaţia Furnizor"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Locație"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Parte"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Locaţia Client"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Parte"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Locaţia Furnizor"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "La Data"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "La Data"
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Preţ de Cost Nou"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr "Varianta"
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Preţ de Cost Nou"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Valoare Cost"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognoza Cantitate"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "De la"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Valoare Cost"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognoza Cantitate"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Depozit Curent"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Secvenţa Inventar"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Secvența Retur Expediere Furnizor"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Secvența Expediere Furnizor"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Secvența Transport Intern"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Transport Intern Tranzit"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Secvența Retur Transport Client"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Secvența Transport Client"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Transport Intern Tranzit"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Secvenţa Inventar"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Secvența Retur Transport Furnizor"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Secvența Transport Furnizor"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Secvența Transport Intern"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Secvența Retur Transport Client"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Secvența Transport Client"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Cantitate Goală"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Rânduri"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Locație"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Număr"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Stare"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Rând"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "Cantitate Totală"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "UM"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "Căutare"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Cantitate Așteptată"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventar"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Locație"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "Stare Inventar"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Mișcari"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Cantitate Reala"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "UM"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Adresa"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Copii"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Cod"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Valoare Cost"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "Copii Plat"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognoza Cantitate"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Intrare"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Rămas"
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Pierdut şi Găsit"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Ieșire"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Părinte"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Picking"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Cantitate UM"
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Cantitate UM Zecimale"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Dreapta"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Depozitare"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Tip Locație"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Locații Deșeuri"
+
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Depozit Deșeuri"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Timp Execuție"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Din Depozit"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Către Depozit"
+
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Locație Deșeuri"
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Atribuire Obligatorie"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Cost"
+
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Cost Obligatoriu"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Valută"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Data Efectivă"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Din locație"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Cantitate Internă"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Origine"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Data Planificată"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categorie UM Produs"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Expediere"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Stare"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Spre Locație"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Preț unitar"
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Preț unitar"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Preț Unitar Obligatoriu"
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Preț Unitar Actualizat"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "Um"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Stare"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Cantitate Internă"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Locație"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Perioadă"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Zonă exclusiv pentru depozitare"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr "Diferență Cumulată Cantitativă"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr "Cantitate Cumulată Sfârșit"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr "Cantitate Cumulată Început"
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr "Document"
+
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Mișcare"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Origine"
+
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr "Consumabil"
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Valoare Cost"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "UM Implicită"
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Zecimale Implicite UM"
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognoza Cantitate"
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "La Data"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "La Data"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr "Seria de timp"
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Copii"
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Denumire"
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Părinte"
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Din data"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr "Include Pierdute"
+
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Perioadă"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Până la Data"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr "Seria de timp"
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Cantitate Internă"
+
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr "Seria de timp"
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr "Unitate"
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Cantitate Internă"
+
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr "Unitate"
+
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Mișcări"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Adresa de Contact"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Făcut De"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Data Efectivă"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Mișcări Intrare"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Mișcări Inventar"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Mișcari"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Număr"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Origine"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Data Planificată"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Primit De"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Referinţă"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Stare"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Furnizor"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Locaţia Furnizor"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Intrare Depozit"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Depozit Depozitare"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Atribuit De"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adresa de Livrare"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Făcut De"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Data Efectivă"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Din locație"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Mișcari"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Număr"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Origine"
+
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Parțial Atribuit"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Data Planificată"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Referinţă"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Stare"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Furnizor"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Spre Locație"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Primit De"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Făcut De"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Data Efectivă"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Data de Pornire Efectivă"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Din locație"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Mișcări Intrare"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Mișcari"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Număr"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Mișcări Ieșire"
+
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Parțial Atribuit"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Data Planificată"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Data de Pornire Planificată"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Referinţă"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Expediat De"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Stare"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Spre Locație"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "Locaţie Tranzit"
+
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Locaţia Client"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Adresa de Livrare"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Făcut De"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Data Efectivă"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Mișcări Inventar"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Mișcari"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Număr"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Origine"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Mișcări Ieșire"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Ambalat De"
+
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Parțial Atribuit"
+
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Colectat De"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Data Planificată"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Referinţă"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Stare"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Ieşire Depozit"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Depozit Depozitare"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Companie"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Adresa de Contact"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Locaţia Client"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Făcut De"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Data Efectivă"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Mișcări Intrare"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Mișcări Inventar"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Mișcari"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Număr"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Origine"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Data Planificată"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Primit De"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Referinţă"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Stare"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Intrare Depozit"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Depozit Depozitare"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr "Bifaţi pentru a trimite livrări către această adresă."
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr "Bifaţi pentru a utiliza pentru livrare."
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"Locaţie Implicită ca destinaţie pentru stoc care se trimite către parte."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "Locaţie Implicită ca sursă pentru stoc care se primeşte de la parte."
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"Locaţie Implicită ca destinaţie pentru stoc care se trimite către parte."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "Locaţie Implicită ca sursă pentru stoc care se primeşte de la parte."
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Data pentru care cantitatea stocului este calculată.\n"
+"* Nicio dată calculează cât se poate mai departe în viitor.\n"
+"* O dată în trecut arată valori istorice."
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"O expresie python care va fi evaluată cu:\n"
+"-cost_price: costul curent al produsului"
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"O expresie python care va fi evaluată cu:\n"
+"-cost_price: costul curent al produsului"
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "Valoarea stocului pentru locaţie."
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "Cantitatea de stoc aşteptată la locaţie."
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr "Cantitatea de stoc în locaţie."
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "Valoarea stocului pentru locaţie."
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "Cantitatea de stoc aşteptată la locaţie."
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr "Cantitatea de stoc în locaţie."
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr "Depozitul la care lucrează utilizatorul."
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr "Utilizat pentru a genera numărul dat la inventare."
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+"Utilizat pentru a genera numărul dat la expedieri de retur către furnizor."
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr "Utilizat pentru a genera numărul dat la expedieri de la furnizor."
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr "Utilizat pentru a genera numărul dat la expedieri interne."
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"Locaţia implicită utilizată pentru stoc care este în tranzit între depozite."
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+"Utilizat pentru a genera numărul dat la expedieri de retur de la client."
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr "Utilizat pentru a genera numărul dat la expedieri către client."
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+"Locaţia implicită utilizată pentru stoc care este în tranzit între depozite."
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr "Compania cu care este asociat inventarul."
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr "Data la care s-a numărat stocul."
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Cum se gestionează rânduri fără o cantitate."
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr "Locaţia a fost inventariată."
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr "Identificatorul principal al inventarului."
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr "Starea curentă al inventarului."
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr "Cantitatea de adăugat la numărătoarea existentă."
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr "Suma totală din rândurile numărate până acum."
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr "Unitatea în care este specificată cantitatea."
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr "Articolul care este numărat."
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr "Cantitatea calculată de sistem care ar trebui să fie în locaţie."
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr "Inventarul de care aparţine rândul."
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr "Cantitatea faptică găsită în locaţie."
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "Unitatea în care este exprimată cantitatea."
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr "Utilizat pentru a adăuga structura sub locaţie."
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr "Identificatorul intern utilizat pentru locaţie."
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "Valoarea stocului pentru locaţie."
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr "Bifaţi pentru a impune un sigur nivel de copii fără nepoţi."
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "Cantitatea de stoc aşteptată la locaţie."
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr "Unde se recepţionează stocuri primite."
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr "Utilizat când se corectează nivelul stocului în depozit."
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr "De unde se trimite stocul care iese."
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr "Utilizat pentru a adăuga structura deasupra locaţiei."
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+"De unde este colectat stocul.\n"
+"Lăsaţi gol pentru a utiliza locaţia de stocare."
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr "Cantitatea de stoc în locaţie."
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr "Locația de nivel superior în care este stocat stocul."
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr "Locaţiile utilizate pentru produse deşeu de la depozit."
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr "Depozitele care folosesc locaţia pentru deşeuri."
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr "Timpul necesar pentru a muta stoc între depozite."
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr "Compania cu care este asociată mişcarea de stoc."
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "Valuta în care este specificat preţul unitar."
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr "Când stocul a fost mutat faptic."
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr "De unde a fost mutat stocul."
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr "Sursa mişcării de stoc."
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr "Când se aşteaptă să se mute stocul."
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr "Produsul cu care este asociată mişcarea."
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr "Cantitatea de stoc mişcată."
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr "Utilizat pentru a grupa mişcări de stoc."
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr "Starea curentă a mişcării de stoc."
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Unde este mutat stocul."
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr "Preţul unitar în valuta companiei."
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "Unitatea în care este exprimată cantitatea."
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr "Compania cu care este asociată perioada de stoc."
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr "Când se termină perioada de stoc."
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr "Starea curentă a perioadei de stoc."
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr "Bifaţi pentru a folosi numai cantitatea zonei de stocare."
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr "Depozitul pentru care vor fi calculate cantităţile."
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Data pentru care cantitatea stocului este calculata.\n"
+"* Nicio dată calculează cât se poate mai departe în viitor.\n"
+"* O dată în trecut arată valori istorice."
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+"Dacă este bifat, costul produsului mutat la o locaţie pierdute şi găsite "
+"este inclus."
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr "Mişcările care nu au fost atribuite."
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr "Compania cu care este asociată expedierea."
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr "Adresa la care poate fi contactat furnizorul."
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr "Când stocul a fost recepţionat faptic."
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Mişcările care aduc stocul în depozit."
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "Mişcările care pun stocul în zonă de stocare."
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr "Identificatorul principal pentru expediere."
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr "Când se aşteaptă să sosească stocul."
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "Identificatorul furnizorului pentru expediere."
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr "Starea curentă a expedierii."
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Partea care a furnizat stocul."
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr "Unde se recepţionează stocul."
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "Compania cu care este asociată expedierea."
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Unde este trimis stocul."
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr "Când stocul a fost returnat faptic."
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr "De unde a fost mutat stocul."
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr "Mişcarea care returnează stocul la furnizor."
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "Identificatorul principal pentru expediere."
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Când se aşteaptă sa se returneze stocul."
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "Identificatorul furnizorului pentru expediere."
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr "Starea curentă a expedierii."
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr "Partea care a furnizat stocul."
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Unde este mutat stocul."
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr "Compania cu care este asociată expedierea."
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr "Când s-a completat expedierea faptic."
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr "Când stocul a fost trimis faptic."
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr "De unde a fost mutat stocul."
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr "Mişcările care recepţionez stocul."
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr "Mişcările care fac expedierea."
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr "Identificatorul principal pentru expediere."
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr "Mişcările care trimit stocul."
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr "Când se aşteaptă să se completeze expediere."
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Când se aşteaptă să se trimită stocul."
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr "Identificatori externi ai expedierii."
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr "Starea curentă a expedierii."
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr "Unde este mutat stocul."
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr "Unde este stocul când este în tranzit între depozite."
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "De unde este trimis stocul."
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr "Compania cu care este asociată expedierea."
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr "Partea care a achiziţionat stocul."
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "Unde este trimis stocul."
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "Când stocul a fost trimis faptic."
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr "Mişcările care iau stocul de la zona de stocare."
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr "Identificatorul principal pentru expediere."
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr "Mişcările care trimit stocul la client."
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr "Când se aşteaptă să se trimită stocul."
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "Identificatorul clientului pentru expediere."
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr "Starea curentă a expedierii."
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "De unde este trimis stocul."
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "Compania cu care este asociată expedierea."
+
+#, fuzzy
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr "Adresa la care poate fi contactat clientul."
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr "Partea care a achiziţionat stocul."
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr "Când a fost returnat stocul."
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "Mişcările care aduc stocul în depozit."
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "Mişcările care pun stocul în zona de stocare."
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "Identificatorul principal pentru expediere."
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "Când se aşteaptă sa se returneze stocul."
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "Identificatorul al clientului pentru expediere."
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr "Starea curentă a expedierii."
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr "Unde se returnează stocul."
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventare"
+
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Rânduri Inventar"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Locaţii"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Timp de Execuţie Locaţii"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locaţii Lista Cantităţi"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Arbore Cantitate Locaţii"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locaţii"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Mișcări"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Perioade"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Revizuire a Preţului de Cost"
+
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Mişcări Stoc"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Cantităţi de Produs după Depozit"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Mişcări de Stocuri După Depozit"
+
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Produse după Locație"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr "Marja după Categorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr "Marja după Categorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr "Marja după Categorie"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Marje"
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Marje"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr "Marja după Produs"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr "Marja după Produs"
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Expedieri Furnizor"
+
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Retururi Furnizor"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Expedieri Interne"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Expedieri Client"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Expedieri Client"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Expedieri Furnizor"
+
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Retururi Client"
+
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configurare"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Lista de reaprovizionare"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Expediere Interna"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Aviz de Însoţire a Mărfii"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Lista Picking"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Lista de reaprovizionare"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "Numărare"
+
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Cantităţi de Produs după Depozit"
+
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Mişcări Stoc"
+
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Modificare Cost"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recalculare Cost"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Atribuire Expediere Retur Furnizor"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Atribuire Expediere Internă"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "Atribuire Expediere Client"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "Totul"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "Totul"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "De la Furnizori"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "În Aşteptare de la Furnizori"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "La Clienţi"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "Totul"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Recepţionat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "Totul"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Atribuit"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Parțial Atribuit"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "În Aşteptare"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "Totul"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Atribuit"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Parțial Atribuit"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Cereri"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Expediat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "În Aşteptare"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "Totul"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Atribuit"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Parțial Atribuit"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Ambalat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Colectat"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "În Aşteptare"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "Totul"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Recepţionat"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+"Nu se poate şterge \"%(party)s\" când au expedieri în aşteptare cu compania "
+"\"%(company)s\"."
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+"Cost invalid \"%(cost_price)s\" pentru produs \"%(product)s\" cu excepţia "
+"\"%(exception)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr "Nu s-a găsit un rând existent pentru \"%(search)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr "Inventarele \"%(inventories)s\" au data în viitor."
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr "Pentru a şterge inventarul \"%(inventory)s\" trebuie anulat."
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+"Pentru a șterge rând inventar \"%(line)s\" trebuie anulat inventarul "
+"\"%(inventory)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "Cantitatea rând inventar trebuie să fie pozitivă."
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr "Rând inventar \"%(line)s\" nu este unic în inventar \"%(inventory)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr "Sursa şi destinaţia unei mişcări de stoc trebuie sa fie diferite."
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "Cantitatea unei mişcări interne trebuie să fie pozitivă."
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+"Pentru a modifica o mişcarea de stoc \"%(move)s, trebuie resetată în stare "
+"de draft."
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+"Nu se poate modifica mişcarea de stoc \"%(move)s\" pentru că este anulată."
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "Cantitatea de mișcare trebuie să fie pozitivă."
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr "Nu puteți închide perioadele cu mutări atribuite."
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+"Pentru a șterge rând inventar \"%(line)s\" trebuie anulat inventarul "
+"\"%(inventory)s\"."
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Valută"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr "Marja"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr "Tendința marjelor"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Număr"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr "Profit"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr "Venit"
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr "Sigur doriți să anulați inventarul?"
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr "Sigur doriți să confirmați inventarul?"
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr "Sigur doriți să anulați mutarea?"
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr "Sunteți sigur că doriți să finalizați mişcarea?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Sunteți sigur că doriți să primiți transportul?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Sunteți sigur că doriți să finalizați expedierea?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "Sunteți sigur că doriți să finalizați expedierea?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "Sunteți sigur că doriți să primiți transportul?"
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Adăugați un rând la inventar pentru fiecare produs lipsă"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "Lansați expertul pentru a număra produsele"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "Complet"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirmare"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "Numeratoare"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Executare"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Resetați la Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Închidere"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Terminat"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Resetare la Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Recepţionat"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Atribuit"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Terminat"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Așteptare"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Atribuire"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Terminare"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Expediere"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Așteptare"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Atribuire"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Terminare"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Ambalare"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "Pick"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Terminare"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Recepţionat"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Așteptare"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "Utilizator din companie"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "Utilizator în companii"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventar"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Expedierea furnizorului"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Retur al Expedierii Furnizorului"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Expediere Interna"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Expediere Client"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Retur Expediere Client"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventar"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Expedierea furnizorului"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Retur al Expedierii Furnizorului"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Expediere Interna"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Expediere Client"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Retur Expediere Client"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configurare"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventare"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locaţii"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locaţii"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Timp de Execuţie Locaţii"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locaţii"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Mișcari"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Perioade"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Raportare"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Marje"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Expedieri"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Expedieri Furnizor"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Retururi Furnizor"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Expedieri Interne"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Expedieri Client"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Retururi Client"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventar şi Stoc"
+
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configurare"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Depozit Curent"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Locație Parte"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Produs după locație"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr "Revizuirea prețului costului produsului"
+
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Modificare Cost"
+
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recalculare Cost"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stoc"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Administrarea Stocurilor"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr ""
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Configurare Stoc"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "Locația de configurare a stocului"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Inventar Stoc"
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Rând Inventar Stocuri"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Locația stocului"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Zona Intrare"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Pierdut şi Găsit"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Zona Ieşire"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Zona Depozitare"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Furnizor"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Tranzit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Timp de Execuţie Locaţii"
+
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Locația deșeurilor din depozit"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Mişcare Stoc"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Perioada Stoc"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Cantităţi de Produs după Depozit"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Cantităţi de Produs după Depozit"
+
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr ""
+
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Produse după Locație"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Produse după Locație"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Raportare Marja după Categorie de Stoc"
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Raportare Marja după Categorie de Stoc"
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr "Raportare Marja după Categorie de Stoc"
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr "Raport Marja Stocuri"
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr "Raport Marja Stocuri"
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Atribuire Expediere"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Expediere Furnizor"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Retur al Expedierii Furnizorului"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Expediere Interna"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Expediere Client"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Retur Expediere Client"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Din Locaţie"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Data planificată:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Referinţă:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Lista de reaprovizionare"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Număr Aviz"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Furnizor:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Spre Locație"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Depozit:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Din locație"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Din Locaţie:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Expediere Interna"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Data planificată:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Referinţă:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Număr Aviz"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Spre Locație"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Spre Locație:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Cod Client:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Data:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Aviz de Însoţire a Mărfii"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Referinţă:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Număr Aviz:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Client:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Din Locaţie"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Lista Picking"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Data planificată:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Referinţă:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Număr Aviz"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Spre Locație"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Depozit:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Din locație"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Număr"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Data planificată:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Cantitate"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Referinţă:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Lista de reaprovizionare"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Expediere"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Spre Locație"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Depozit:"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Atribuire Expedierile Client"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "Gol"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "Pastrare"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Anulat"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Terminat"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Pierdut şi Găsit"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Producţie"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Depozitare"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Furnizor"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Vedere"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Depozit"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Atribuit"
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Anulat"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Terminat"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Închis"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr "Varianta"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr "Varianta"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr "Zi"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr "Lună"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr "An"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Anulat"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Terminat"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Recepţionat"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Atribuit"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Anulat"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Terminat"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "În Aşteptare"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Atribuit"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Anulat"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Terminat"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Cere"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Expediat"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "În Aşteptare"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Atribuit"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Anulat"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Terminat"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Ambalat"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Colectat"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "În Aşteptare"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Anulat"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Terminat"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Recepţionat"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Stoc"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr "Depozitul la care lucrezi."
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Secvența Retur Transport Client"
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Secvența Client"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Secvența Interna"
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Tranzit Intern"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventar"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Secvenţă"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Expedieri"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Secvența Retur Expediere Furnizor"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Secvența Expediere Furnizor"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr "Cost"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Mișcare"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Alte Informaţii"
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Valoare Cost"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr "Venituri"
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr "Venituri"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr "%"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr "Cost"
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr "Venituri"
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Nu se pot atribui aceste produse:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Alte Informaţii"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Alte Informaţii"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Alte Informaţii"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Alte Informaţii"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Alte Informaţii"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Mișcări Ieșire"
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "OK"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recalculare"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "Adăugare"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "Sfârșit"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "Selectați"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Anulare"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Așteptare"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr "Ignora"
diff --git a/modules/stock/locale/ru.po b/modules/stock/locale/ru.po
new file mode 100644
index 0000000000..bc0a6e07be
--- /dev/null
+++ b/modules/stock/locale/ru.po
@@ -0,0 +1,3613 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Доставка"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Товарный склад"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Доставка"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Местоположение заказчика"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Товарный склад"
+
+#, fuzzy
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Местоположения"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Местоположение поставщика"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Местоположение заказчика"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Местоположение поставщика"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Организация"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Себестоимость"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Себестоимость"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Цена"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Прогноз количества"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Цена"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Прогноз количества"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Нумерация возвратов поставщику"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Нумерация приходов от поставщика"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Нумерация внутреннего перемещения"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Нумерация возвратов от заказчика"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Нумерация отгрузки заказчику"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Нумерация возвратов поставщику"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Нумерация приходов от поставщика"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Нумерация внутреннего перемещения"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Нумерация возвратов от заказчика"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Нумерация отгрузки заказчику"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Строки"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Местоположение"
+
+#, fuzzy
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Состояние"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Строки"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "Ед.изм."
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Ожидаемое количество"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Инвентаризация"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Дата"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Внутреннее количество"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "Ед.изм."
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Адрес"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Подчиненый"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Код локации"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Цена"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Прогноз количества"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Входящий"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Левая сторона"
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Утраченная и обретенная"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Исходящий"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Предок"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Кол-во цифр после запятой"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Правая сторона"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Хранилище"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Тип местоположения"
+
+#, fuzzy
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Местоположение заказчика"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Товарный склад"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Товарный склад"
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Товарный склад"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Местоположение заказчика"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Себестоимость"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Требуется цена за единицу"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Валюта"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Учетная дата"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Из местоположения"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Внутреннее количество"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Первоисточник"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Плановая дата"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Категория ед. измерения продукции"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Доставка"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Состояние"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "В местоположение"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Цена за единицу"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Цена за единицу"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Требуется цена за единицу"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Цена за единицу"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "Ед.изм."
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Запасы"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Состояние"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Внутреннее количество"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Период"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Дата"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Первоисточник"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Цена"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Прогноз количества"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Дата"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Подчиненый"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Наименование"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Предок"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Организация"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Из местоположения"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Период"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Дата"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Дата"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Внутреннее количество"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Дата"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Внутреннее количество"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Контактный адрес"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Учетная дата"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Входящая поставка"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Учет перемещений"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Первоисточник"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Плановая дата"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Ссылка"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Состояние"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Поставщик"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Местоположение поставщика"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Вход товарного склада"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Хранилище товарного склада"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Организация"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Адрес доставки"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Учетная дата"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Из местоположения"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Первоисточник"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Плановая дата"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Ссылка"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Состояние"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Поставщик"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "В местоположение"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Учетная дата"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Из местоположения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Входящий груз"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Внешнее перемещение"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Плановая дата"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Ссылка"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Состояние"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "В местоположение"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Заказчик"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Местоположение заказчика"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Адрес доставки"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Учетная дата"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Учет перемещений"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Первоисточник"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Внешнее перемещение"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Packed"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Плановая дата"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Ссылка"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Состояние"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Выход товарного склада"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Хранилище товарного склада"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Организация"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Контактный адрес"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Заказчик"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Местоположение заказчика"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Учетная дата"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Входящая поставка"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Учет перемещений"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Первоисточник"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Плановая дата"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Ссылка"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Состояние"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Вход товарного склада"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Хранилище товарного склада"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"Местоположение назначения по умолчанию при отправке продукции контрагенту."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+"Местоположение назначения по умолчанию при отправке продукции контрагенту."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Себестоимость"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Хранилище перемещение товара"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Продукция по местоположениям"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Первоисточник"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Первоисточник"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Picking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Хранилище перемещение товара"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Себестоимость"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Возврат груза поставщику"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "From Suppliers"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "From Suppliers Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "To Customers"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "Внутреннее перемещение должно быть положительным числом"
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "Внутреннее перемещение должно быть положительным числом"
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "Кол-во должно быть положительным"
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"Вы не можете изменить единицу измерения по умолчанию для продукта, который "
+"связан со складом перемещения."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"Вы не можете изменить единицу измерения по умолчанию для продукта, который "
+"связан со складом перемещения."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+"Вы не можете изменить единицу измерения по умолчанию для продукта, который "
+"связан со складом перемещения."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Валюта"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Close"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Packed"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Инвентаризация"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Инвентаризация"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Первоисточник"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Доставка"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventory & Stock"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Продукция по местоположениям"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Себестоимость"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stock"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Конфигурация склада"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Хранилище опись"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Хранилище строка описи"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Хранилище строка описи"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Хранилище строка описи"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Склад Местоположение"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Input Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Output Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Хранилище товарного склада"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Хранилище перемещение товара"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Периоды хранения"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "Складские запасы по периоду"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Кол-во продукции по складам"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Кол-во продукции по складам"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Продукция по местоположениям"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Продукция по местоположениям"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Приход от поставщика"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Возврат поставщику"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Внутреннее перемещение"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Отгрузка заказчику"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Возврат от заказчика"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Из местоположения"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Плановая дата:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Ссылка:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Список пополнения"
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Номер доставки:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Поставщик:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "В местоположение"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Товарный склад:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Из местоположения"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Из местоположения:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Внутреннее перемещение"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Плановая дата:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Ссылка:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Номер доставки:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "В местоположение"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "В местоположение:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Код заказчика:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Дата:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Накладная"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Ссылка:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Номер доставки:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Заказчик:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Из местоположения"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Список выбора"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Плановая дата:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Ссылка:"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Номер доставки:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "В местоположение"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Товарный склад:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Заказчик"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Из местоположения"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Плановая дата:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Ссылка:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Список пополнения"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Доставка"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "В местоположение"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Товарный склад:"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipments"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Отменено"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Заказчик"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Утраченная и обретенная"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Производство"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Хранилище"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Поставщик"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Просмотр"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Товарный склад"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Переданный"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Отменено"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Закрыто"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Отменено"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Поступило"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Переданный"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Отменено"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Ожидание"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Переданный"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Отменено"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Ожидание"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Переданный"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Отменено"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Упакованный"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Упакованный"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Ожидание"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Отменено"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Поступило"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Хранилище"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Нумерация возвратов от заказчика"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Нумерация отгрузки заказчику"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Нумерация внутреннего перемещения"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Внутреннее количество"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Инвентаризация"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Последовательность"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Доставка"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Нумерация возвратов поставщику"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Нумерация приходов от поставщика"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Перемещения"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Цена"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Не удалось назначить эти продукты:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Внешнее перемещение"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "Ок"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recompute Cost Price"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/sl.po b/modules/stock/locale/sl.po
new file mode 100644
index 0000000000..e70db69a9b
--- /dev/null
+++ b/modules/stock/locale/sl.po
@@ -0,0 +1,3570 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "Dostava"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Skladišče"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Dostava"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "Lokacija kupca"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Skladišče"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Lokacije"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lokacija dobavitelja"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Lokacija"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "Partner"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "Lokacija kupca"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "Partner"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lokacija dobavitelja"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Na dan"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na dan"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "Družba"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Nabavna cena"
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Nabavna cena"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "Nabavna vrednost"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Predvidena količina"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "Nabavna vrednost"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Predvidena količina"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Štetje inventur"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Štetje vrnjenih prevzemnic"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Štetje prevzemnic"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Štetje notranjih odpremnic"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Tranzit notranjih odpremnic"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Štetje vrnjenih odpremnic"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Štetje odpremnic"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "Tranzit notranjih odpremnic"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "Štetje inventur"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "Štetje vrnjenih prevzemnic"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "Štetje prevzemnic"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "Štetje notranjih odpremnic"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "Štetje vrnjenih odpremnic"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "Štetje odpremnic"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "Postavke"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Lokacija"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "Stanje"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "Postavke"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "ME"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "Predvidena količina"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Popis"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "Datum"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Lokacija"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "Stanje inventure"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Notranja količina"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "ME"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "Naslov"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "Podlokacije"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "Šifra"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "Nabavna vrednost"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Predvidena količina"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "Prevzem"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "Levo"
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Izgubljeno/najdeno"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "Naziv"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "Izdaja"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "Matična lokacija"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "Prevzem"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "Količina"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "Decimalke"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "Desno"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "Shramba"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "Tip lokacije"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Lokacija tranzita"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Skladišče"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "Dobavni rok"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Iz skladišča"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "V skladišče"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Lokacija tranzita"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "Obvezna dodelitev"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "Nabavna cena"
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Cena obvezna"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "Dejanski datum"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "Iz lokacije"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Notranja količina"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "Poreklo"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "Načrtovan datum"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Katerogija ME izdelka"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "Pošiljka"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "Na lokacijo"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "Cena"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "Cena"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "Cena obvezna"
+
+#, fuzzy
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "Cena"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "ME"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "Predpomnjenja"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Notranja količina"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Lokacija"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Obdobje"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "Datum"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Storage Zone"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Promet"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "Poreklo"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "Nabavna vrednost"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Predvidena količina"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "Na dan"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na dan"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "Datum"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "Podlokacije"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "Naziv"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "Matična lokacija"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "Družba"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "Iz lokacije"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Obdobje"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "Datum"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "Datum"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Notranja količina"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "Datum"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Notranja količina"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "Kontakt"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "Zaključil"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "Dejanski datum"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Vhodni promet"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Notranji promet"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "Porekla"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "Načrtovan datum"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "Prejel"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "Sklic"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Dobavitelj"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "Lokacija dobavitelja"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Prevzem v skladišče"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Shramba v skladišče"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "Dodelil"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "Prejemnik"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "Zaključil"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "Dejanski datum"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "Iz lokacije"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "Porekla"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "Načrtovan datum"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "Sklic"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Dobavitelj"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "Na lokacijo"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "Prejel"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "Zaključil"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "Dejanski datum"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "Dejanski začetek"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "Iz lokacije"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Vhodni promet"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Izhodni promet"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "Načrtovan datum"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "Načrtovan začetek"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "Sklic"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "Odpremil"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "Na lokacijo"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "Lokacija tranzita"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Kupec"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "Lokacija kupca"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "Prejemnik"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "Zaključil"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "Dejanski datum"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Notranji promet"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "Porekla"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "Izhodni promet"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "Pakiral"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Pakiral"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "Načrtovan datum"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "Sklic"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "Izdaja iz skladišča"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Shramba v skladišču"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "Družba"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "Kontakt"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Kupec"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "Lokacija kupca"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "Zaključil"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "Dejanski datum"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "Vhodni promet"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "Inventarni promet"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "Porekla"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "Načrtovan datum"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "Prejel"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "Sklic"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "Prevzem v skladišče"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "Shramba v skladišče"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "Privzeta ciljna lokacija pri odpremi izdelkov k partnerju."
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "Privzeta ciljna lokacija pri odpremi izdelkov k partnerju."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "Nabavna cena"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Promet zaloge"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Izdelki po lokacijah"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "Porekla"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "Porekla"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Picking List"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Promet zaloge"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Nabavna cena"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Dodelitev vrnjene prevzemnice"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "From Suppliers"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "From Suppliers Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "To Customers"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "Količina notranjega prometa mora biti večja od nič."
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "Količina notranjega prometa mora biti večja od nič."
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "Količina prometa mora biti večja od nič."
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr "Vrste izdelka, povezanega s prometom zaloge, ni možno popravljati."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+"Privzete ME za izdelek, ki je povezan s prometom zaloge, ni možno "
+"spreminjati."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr "Vrste izdelka, povezanega s prometom zaloge, ni možno popravljati."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "Valuta"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Close"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "Prevzem"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "Porekla"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Pošiljke"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventory & Stock"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Skladišče"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "Lokacija partnerja"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "Izdelek po lokacijah"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Nabavna cena"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stock"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Konfiguracija zaloge"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "Konfiguracija lokacije zalog"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr "Konfiguracija štetja zalog"
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "Popis"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "Postavka popisa"
+
+#, fuzzy
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "Postavka popisa"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "Postavka popisa"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "Lokacija"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Input Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Output Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+#, fuzzy
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Dobavni rok lokacije"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Lokacija tranzita"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "Promet zaloge"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "Obdobje zaloge"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "Predpomnjeno obdobje zaloge"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Količine izdelkov po skladiščih"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Količine izdelkov po skladiščih"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Izdelki po lokacijah"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "Izdelki po lokacijah"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Prevzemnica"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Vrnjena prevzemnica"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Notranja odpremnica"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Odpremnica"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Vrnjena odpremnica"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "Iz lokacije"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "Načrtovan datum:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "Sklic:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Obnova zaloge"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "Številka pošiljke"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Dobavitelj:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "Na lokacijo"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Skladišče:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "Iz lokacije"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "Iz lokacije:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Notranja odpremnica"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "Načrtovan datum:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "Sklic:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "Številka pošiljke"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "Na lokacijo"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "Na lokacijo:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "Šifra kupca:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "Datum:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Dobavnica"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "Sklic:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "Dobavnica št.:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Kupec:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "Iz lokacije"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Prevzemni list"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "Načrtovan datum:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "Sklic:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "Številka pošiljke"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "Na lokacijo"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Skladišče:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Kupec"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "Iz lokacije"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "Načrtovan datum:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "Sklic:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Obnova zaloge"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "Pošiljka"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "Na lokacijo"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Skladišče:"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipments"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Kupec"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "Dostava"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Izgubljeno/najdeno"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "Proizvodnja"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "Shramba"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Dobavitelj"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "Vpogled"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Skladišče"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Dodeljeno"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr "Zbiranje"
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Zaprto"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Prejeto"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Dodeljeno"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Čakajoče"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Dodeljeno"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Zahtevek"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Odpremljeno"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Čakajoče"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Dodeljeno"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Zapakirano"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Zapakirano"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Čakajoče"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Preklicano"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Prejeto"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Zaloga"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Štetje vrnjenih odpremnic"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Štetje odpremnic"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Štetje notranjih odpremnic"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Notranja količina"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Popis"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Zap.št."
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "Pošiljke"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Štetje vrnjenih prevzemnic"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Štetje prevzemnic"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Promet"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "Drugo"
+
+#, fuzzy
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "Nabavna vrednost"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "Dodelitev ni možna za naslednje izdelke:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "Drugo"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "Drugo"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "Drugo"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "Drugo"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "Drugo"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "Izhodni promet"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "V redu"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recompute Cost Price"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/tr.po b/modules/stock/locale/tr.po
new file mode 100644
index 0000000000..011d0e794f
--- /dev/null
+++ b/modules/stock/locale/tr.po
@@ -0,0 +1,3526 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "Delivery Note"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "Locations"
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "Locations"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "Locations"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr ""
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr ""
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "Warehouse"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "Recompute Cost Price"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "Locations"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "Periods"
+
+#, fuzzy
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "Storage Zone"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "Moves"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "Periods"
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "Packed"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "Inventories"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locations List Quantity"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Locations Tree Quantity"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "Moves"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "Warehouse"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "Moves"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "From Suppliers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "From Suppliers Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "To Customers"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "Requests"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "Shipped"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "Assigned"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "Assigned"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "Packed"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "Waiting"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "Received"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "Add an inventory line for each missing products"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Close"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "Reset to Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "Ship"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "Assign"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "Packed"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "Done"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "Receive"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "Inventories"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "Location Lead Times"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "Locations"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "Moves"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "Periods"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Reporting"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "Supplier Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "Supplier Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "Supplier Return Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "Internal Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "Customer Return Shipments"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "Inventory & Stock"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "Configuration"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "Warehouse"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr ""
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "Recompute Cost Price"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "Stock Administration"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "Stock Force Assignment"
+
+#, fuzzy
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "Stock Configuration"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr ""
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "Input Zone"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "Output Zone"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "Storage Zone"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "Transit"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "Location Lead Times"
+
+#, fuzzy
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "Warehouse"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr ""
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr ""
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "Product Quantities By Warehouse"
+
+#, fuzzy
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "Warehouse"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "Assign Shipment Internal"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "Supplier Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "Customer Return Shipment"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "Supplier"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "Internal Shipment"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "Delivery Note"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "Customer"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "Picking List"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "Restocking List"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "Recompute Cost Price"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "Customer Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "Internal Shipments"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "Supplier Return Shipments"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "Products"
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "Customer"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "Supplier"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "Warehouse"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "Close"
+
+#, fuzzy
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "Products"
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "Receive"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "Requests"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "Shipped"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "Assign"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "Packed"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "Waiting"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "Draft"
+
+#, fuzzy
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "Receive"
+
+#, fuzzy
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "Stock"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "Customer Return Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "Customer Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "Internal Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "Locations List Quantity"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "Inventory"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "Supplier Return Shipment"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "Supplier Shipment"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "Moves"
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr ""
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "Recompute Cost Price"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "Wait"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/uk.po b/modules/stock/locale/uk.po
new file mode 100644
index 0000000000..8bf9bc98ff
--- /dev/null
+++ b/modules/stock/locale/uk.po
@@ -0,0 +1,3341 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr ""
+
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr ""
+
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr ""
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr ""
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr ""
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr ""
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr ""
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr ""
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr ""
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr ""
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr ""
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr ""
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr ""
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr ""
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr ""
+
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr ""
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr ""
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr ""
+
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr ""
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr ""
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr ""
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr ""
+
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr ""
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr ""
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr ""
+
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr ""
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr ""
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr ""
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr ""
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr ""
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr ""
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr ""
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr ""
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr ""
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr ""
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr ""
+
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr ""
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr ""
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr ""
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr ""
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr ""
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr ""
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr ""
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr ""
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr ""
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr ""
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr ""
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr ""
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr ""
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr ""
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr ""
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr ""
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr ""
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr ""
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr ""
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr ""
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr ""
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr ""
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr ""
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr ""
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr ""
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr ""
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr ""
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr ""
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr ""
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr ""
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr ""
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr ""
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr ""
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr ""
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr ""
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr ""
+
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr ""
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr ""
+
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr ""
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "Закрити"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "Користувач у компаніях"
+
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "Користувач у компаніях"
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "Налаштування"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "Звітність"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr ""
+
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr ""
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr ""
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr ""
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr ""
+
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr ""
+
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr ""
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr ""
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr ""
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr ""
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr ""
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr ""
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr ""
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr ""
+
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr ""
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr ""
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr ""
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr ""
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr ""
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr ""
+
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr ""
+
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr ""
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr ""
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr ""
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr ""
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr ""
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr ""
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr ""
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr ""
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr ""
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr ""
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr ""
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr ""
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr ""
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr ""
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr ""
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr ""
diff --git a/modules/stock/locale/zh_CN.po b/modules/stock/locale/zh_CN.po
new file mode 100644
index 0000000000..ea6fdea6f6
--- /dev/null
+++ b/modules/stock/locale/zh_CN.po
@@ -0,0 +1,3447 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:party.address,delivery:"
+msgid "Delivery"
+msgstr "交付"
+
+#, fuzzy
+msgctxt "field:party.address,warehouses:"
+msgid "Warehouses"
+msgstr "仓库"
+
+#, fuzzy
+msgctxt "field:party.contact_mechanism,delivery:"
+msgid "Delivery"
+msgstr "交付"
+
+msgctxt "field:party.party,customer_location:"
+msgid "Customer Location"
+msgstr "客户库位"
+
+#, fuzzy
+msgctxt "field:party.party,delivered_to_warehouses:"
+msgid "Delivered to Warehouses"
+msgstr "当前仓库"
+
+msgctxt "field:party.party,locations:"
+msgid "Locations"
+msgstr "库位"
+
+msgctxt "field:party.party,supplier_location:"
+msgid "Supplier Location"
+msgstr "供应商库位"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,location:"
+msgid "Location"
+msgstr "库位"
+
+#, fuzzy
+msgctxt "field:party.party-delivered_to-stock.location,party:"
+msgid "Party"
+msgstr "参与者"
+
+msgctxt "field:party.party.location,customer_location:"
+msgid "Customer Location"
+msgstr "客户库位"
+
+msgctxt "field:party.party.location,party:"
+msgid "Party"
+msgstr "参与者"
+
+msgctxt "field:party.party.location,supplier_location:"
+msgid "Supplier Location"
+msgstr "供应商库位"
+
+msgctxt "field:product.by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "日期"
+
+msgctxt "field:product.by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "日期"
+
+msgctxt "field:product.cost_price.revision,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:product.cost_price.revision,cost_price:"
+msgid "New Cost Price"
+msgstr "新成本价"
+
+msgctxt "field:product.cost_price.revision,date:"
+msgid "Date"
+msgstr "日期"
+
+msgctxt "field:product.cost_price.revision,product:"
+msgid "Variant"
+msgstr "变体"
+
+msgctxt "field:product.cost_price.revision,template:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:product.modify_cost_price.start,cost_price:"
+msgid "New Cost Price"
+msgstr "新成本价"
+
+msgctxt "field:product.modify_cost_price.start,date:"
+msgid "Date"
+msgstr "日期"
+
+msgctxt "field:product.product,cost_value:"
+msgid "Cost Value"
+msgstr "成本取值"
+
+msgctxt "field:product.product,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "预测数量"
+
+msgctxt "field:product.product,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:product.recompute_cost_price.start,from_:"
+msgid "From"
+msgstr "从"
+
+msgctxt "field:product.template,cost_value:"
+msgid "Cost Value"
+msgstr "成本取值"
+
+msgctxt "field:product.template,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "预测数量"
+
+msgctxt "field:product.template,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:res.user,warehouse:"
+msgid "Current Warehouse"
+msgstr "当前仓库"
+
+msgctxt "field:stock.configuration,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "库存盘点序列"
+
+msgctxt "field:stock.configuration,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "向供应商退货序列"
+
+msgctxt "field:stock.configuration,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "从供应商收货序列"
+
+msgctxt "field:stock.configuration,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "内部发货序列"
+
+msgctxt "field:stock.configuration,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "内部发货中转"
+
+msgctxt "field:stock.configuration,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "接收客户退货序列"
+
+msgctxt "field:stock.configuration,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "向客户发货序列"
+
+msgctxt "field:stock.configuration.location,shipment_internal_transit:"
+msgid "Internal Shipment Transit"
+msgstr "内部发货中转"
+
+msgctxt "field:stock.configuration.sequence,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:stock.configuration.sequence,inventory_sequence:"
+msgid "Inventory Sequence"
+msgstr "库存盘点序列"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_return_sequence:"
+msgid "Supplier Return Shipment Sequence"
+msgstr "向供应商退货序列"
+
+msgctxt "field:stock.configuration.sequence,shipment_in_sequence:"
+msgid "Supplier Shipment Sequence"
+msgstr "从供应商收货序列"
+
+msgctxt "field:stock.configuration.sequence,shipment_internal_sequence:"
+msgid "Internal Shipment Sequence"
+msgstr "内部发货序列"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_return_sequence:"
+msgid "Customer Return Shipment Sequence"
+msgstr "接收客户退货序列"
+
+msgctxt "field:stock.configuration.sequence,shipment_out_sequence:"
+msgid "Customer Shipment Sequence"
+msgstr "向客户发货序列"
+
+msgctxt "field:stock.inventory,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:stock.inventory,date:"
+msgid "Date"
+msgstr "日期"
+
+msgctxt "field:stock.inventory,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "数量为空"
+
+msgctxt "field:stock.inventory,lines:"
+msgid "Lines"
+msgstr "明细"
+
+msgctxt "field:stock.inventory,location:"
+msgid "Location"
+msgstr "库位"
+
+msgctxt "field:stock.inventory,number:"
+msgid "Number"
+msgstr "编号"
+
+msgctxt "field:stock.inventory,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:stock.inventory.count.quantity,line:"
+msgid "Line"
+msgstr "明细"
+
+msgctxt "field:stock.inventory.count.quantity,product:"
+msgid "Product"
+msgstr "产品"
+
+#, fuzzy
+msgctxt "field:stock.inventory.count.quantity,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:stock.inventory.count.quantity,total_quantity:"
+msgid "Total Quantity"
+msgstr "总数量"
+
+msgctxt "field:stock.inventory.count.quantity,uom:"
+msgid "UOM"
+msgstr "计量单位"
+
+msgctxt "field:stock.inventory.count.search,search:"
+msgid "Search"
+msgstr "搜索"
+
+msgctxt "field:stock.inventory.line,expected_quantity:"
+msgid "Expected Quantity"
+msgstr "预计数量"
+
+msgctxt "field:stock.inventory.line,inventory:"
+msgid "Inventory"
+msgstr "库存盘点"
+
+msgctxt "field:stock.inventory.line,inventory_date:"
+msgid "Date"
+msgstr "日期"
+
+msgctxt "field:stock.inventory.line,inventory_location:"
+msgid "Location"
+msgstr "库位"
+
+msgctxt "field:stock.inventory.line,inventory_state:"
+msgid "Inventory State"
+msgstr "库存盘点状态"
+
+msgctxt "field:stock.inventory.line,moves:"
+msgid "Moves"
+msgstr "变动"
+
+msgctxt "field:stock.inventory.line,product:"
+msgid "Product"
+msgstr "产品"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,quantity:"
+msgid "Actual Quantity"
+msgstr "总数量"
+
+msgctxt "field:stock.inventory.line,uom:"
+msgid "UOM"
+msgstr "计量单位"
+
+msgctxt "field:stock.location,address:"
+msgid "Address"
+msgstr "地址"
+
+msgctxt "field:stock.location,allow_pickup:"
+msgid "Allow Pickup"
+msgstr ""
+
+msgctxt "field:stock.location,childs:"
+msgid "Children"
+msgstr "子库位"
+
+msgctxt "field:stock.location,code:"
+msgid "Code"
+msgstr "代码"
+
+msgctxt "field:stock.location,cost_value:"
+msgid "Cost Value"
+msgstr "成本取值"
+
+msgctxt "field:stock.location,flat_childs:"
+msgid "Flat Children"
+msgstr "扁平化"
+
+msgctxt "field:stock.location,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "预测数量"
+
+msgctxt "field:stock.location,input_location:"
+msgid "Input"
+msgstr "收货"
+
+msgctxt "field:stock.location,left:"
+msgid "Left"
+msgstr "左"
+
+msgctxt "field:stock.location,lost_found_location:"
+msgid "Lost and Found"
+msgstr "失物招领区"
+
+msgctxt "field:stock.location,name:"
+msgid "Name"
+msgstr "名称"
+
+msgctxt "field:stock.location,output_location:"
+msgid "Output"
+msgstr "出货"
+
+msgctxt "field:stock.location,parent:"
+msgid "Parent"
+msgstr "上级"
+
+msgctxt "field:stock.location,picking_location:"
+msgid "Picking"
+msgstr "拣货"
+
+msgctxt "field:stock.location,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom:"
+msgid "Quantity UOM"
+msgstr "数量"
+
+#, fuzzy
+msgctxt "field:stock.location,quantity_uom_digits:"
+msgid "Quantity UOM Digits"
+msgstr "默认计量单位有效数字"
+
+msgctxt "field:stock.location,right:"
+msgid "Right"
+msgstr "右"
+
+msgctxt "field:stock.location,storage_location:"
+msgid "Storage"
+msgstr "存储"
+
+msgctxt "field:stock.location,type:"
+msgid "Location type"
+msgstr "库位类型"
+
+msgctxt "field:stock.location,warehouse:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "field:stock.location,waste_locations:"
+msgid "Waste Locations"
+msgstr "废弃物库位"
+
+msgctxt "field:stock.location,waste_warehouses:"
+msgid "Waste Warehouses"
+msgstr "废弃物仓库"
+
+msgctxt "field:stock.location.lead_time,lead_time:"
+msgid "Lead Time"
+msgstr "交付时间"
+
+msgctxt "field:stock.location.lead_time,warehouse_from:"
+msgid "Warehouse From"
+msgstr "从仓库"
+
+msgctxt "field:stock.location.lead_time,warehouse_to:"
+msgid "Warehouse To"
+msgstr "到仓库"
+
+msgctxt "field:stock.location.waste,location:"
+msgid "Waste Location"
+msgstr "废弃物库位"
+
+msgctxt "field:stock.location.waste,warehouse:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "field:stock.move,assignation_required:"
+msgid "Assignation Required"
+msgstr "需要选货"
+
+msgctxt "field:stock.move,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:stock.move,cost_price:"
+msgid "Cost Price"
+msgstr "成本价"
+
+msgctxt "field:stock.move,cost_price_required:"
+msgid "Cost Price Required"
+msgstr "需要成本价"
+
+msgctxt "field:stock.move,currency:"
+msgid "Currency"
+msgstr "货币"
+
+msgctxt "field:stock.move,effective_date:"
+msgid "Effective Date"
+msgstr "生效日期"
+
+msgctxt "field:stock.move,from_location:"
+msgid "From Location"
+msgstr "从库位"
+
+msgctxt "field:stock.move,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "内部数量"
+
+msgctxt "field:stock.move,origin:"
+msgid "Origin"
+msgstr "依据"
+
+msgctxt "field:stock.move,planned_date:"
+msgid "Planned Date"
+msgstr "计划日期"
+
+msgctxt "field:stock.move,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:stock.move,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "产品计量单位类别"
+
+msgctxt "field:stock.move,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:stock.move,shipment:"
+msgid "Shipment"
+msgstr "收发货"
+
+msgctxt "field:stock.move,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:stock.move,to_location:"
+msgid "To Location"
+msgstr "到库位"
+
+msgctxt "field:stock.move,unit_price:"
+msgid "Unit Price"
+msgstr "单价"
+
+msgctxt "field:stock.move,unit_price_company:"
+msgid "Unit Price"
+msgstr "单价"
+
+msgctxt "field:stock.move,unit_price_required:"
+msgid "Unit Price Required"
+msgstr "需要单价"
+
+msgctxt "field:stock.move,unit_price_updated:"
+msgid "Unit Price Updated"
+msgstr "更新的单价"
+
+msgctxt "field:stock.move,uom:"
+msgid "Uom"
+msgstr "计量单位"
+
+msgctxt "field:stock.period,caches:"
+msgid "Caches"
+msgstr "缓存"
+
+msgctxt "field:stock.period,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:stock.period,date:"
+msgid "Date"
+msgstr "日期"
+
+msgctxt "field:stock.period,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:stock.period.cache,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "内部数量"
+
+msgctxt "field:stock.period.cache,location:"
+msgid "Location"
+msgstr "库位"
+
+msgctxt "field:stock.period.cache,period:"
+msgid "Period"
+msgstr "分期"
+
+msgctxt "field:stock.period.cache,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:stock.product_quantities_warehouse,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:stock.product_quantities_warehouse,date:"
+msgid "Date"
+msgstr "日期"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:stock.product_quantities_warehouse,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Only storage zone"
+msgstr "仅设存储区"
+
+msgctxt "field:stock.product_quantities_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "field:stock.product_quantities_warehouse.move,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_delta:"
+msgid "Cumulative Quantity Delta"
+msgstr "累计数量增量"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_end:"
+msgid "Cumulative Quantity End"
+msgstr "累计数量结束"
+
+msgctxt ""
+"field:stock.product_quantities_warehouse.move,cumulative_quantity_start:"
+msgid "Cumulative Quantity Start"
+msgstr "累计数量开始"
+
+msgctxt "field:stock.product_quantities_warehouse.move,date:"
+msgid "Date"
+msgstr "日期"
+
+msgctxt "field:stock.product_quantities_warehouse.move,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.product_quantities_warehouse.move,move:"
+msgid "Move"
+msgstr "变动"
+
+msgctxt "field:stock.product_quantities_warehouse.move,origin:"
+msgid "Origin"
+msgstr "依据"
+
+#, fuzzy
+msgctxt "field:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:stock.product_quantities_warehouse.move,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:stock.products_by_locations,consumable:"
+msgid "Consumable"
+msgstr "消耗品"
+
+msgctxt "field:stock.products_by_locations,cost_value:"
+msgid "Cost Value"
+msgstr "成本取值"
+
+msgctxt "field:stock.products_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "默认计量单位"
+
+msgctxt "field:stock.products_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "默认计量单位有效数字"
+
+msgctxt "field:stock.products_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "预测数量"
+
+msgctxt "field:stock.products_by_locations,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:stock.products_by_locations,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:stock.products_by_locations.context,forecast_date:"
+msgid "At Date"
+msgstr "日期"
+
+msgctxt "field:stock.products_by_locations.context,stock_date_end:"
+msgid "At Date"
+msgstr "日期"
+
+msgctxt "field:stock.reporting.margin.category,category:"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.category.time_series,category:"
+msgid "Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.time_series,date:"
+msgid "Date"
+msgstr "日期"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,children:"
+msgid "Children"
+msgstr "子库位"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,name:"
+msgid "Name"
+msgstr "名称"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.category.tree,parent:"
+msgid "Parent"
+msgstr "上级"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,company:"
+msgid "Company"
+msgstr "公司"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,from_date:"
+msgid "From Date"
+msgstr "从库位"
+
+msgctxt "field:stock.reporting.margin.context,include_lost:"
+msgid "Include Lost"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,period:"
+msgid "Period"
+msgstr "分期"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.context,to_date:"
+msgid "To Date"
+msgstr "日期"
+
+msgctxt "field:stock.reporting.margin.main,time_series:"
+msgid "Time Series"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.main.time_series,date:"
+msgid "Date"
+msgstr "日期"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "内部数量"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,product:"
+msgid "Product"
+msgstr "产品"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:stock.reporting.margin.product,time_series:"
+msgid "Time Series"
+msgstr ""
+
+msgctxt "field:stock.reporting.margin.product,unit:"
+msgid "Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,date:"
+msgid "Date"
+msgstr "日期"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "内部数量"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,product:"
+msgid "Product"
+msgstr "产品"
+
+#, fuzzy
+msgctxt "field:stock.reporting.margin.product.time_series,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:stock.reporting.margin.product.time_series,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.partial,moves:"
+msgid "Moves"
+msgstr "变动"
+
+msgctxt "field:stock.shipment.in,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:stock.shipment.in,contact_address:"
+msgid "Contact Address"
+msgstr "联系地址"
+
+msgctxt "field:stock.shipment.in,done_by:"
+msgid "Done By"
+msgstr "完成人"
+
+msgctxt "field:stock.shipment.in,effective_date:"
+msgid "Effective Date"
+msgstr "生效日期"
+
+msgctxt "field:stock.shipment.in,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "来货库存变动"
+
+msgctxt "field:stock.shipment.in,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "库间库存变动"
+
+msgctxt "field:stock.shipment.in,moves:"
+msgid "Moves"
+msgstr "变动"
+
+msgctxt "field:stock.shipment.in,number:"
+msgid "Number"
+msgstr "数量"
+
+msgctxt "field:stock.shipment.in,origins:"
+msgid "Origins"
+msgstr "依据"
+
+msgctxt "field:stock.shipment.in,planned_date:"
+msgid "Planned Date"
+msgstr "计划日期"
+
+msgctxt "field:stock.shipment.in,received_by:"
+msgid "Received By"
+msgstr "接收者"
+
+msgctxt "field:stock.shipment.in,reference:"
+msgid "Reference"
+msgstr "参考"
+
+msgctxt "field:stock.shipment.in,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:stock.shipment.in,supplier:"
+msgid "Supplier"
+msgstr "供应商"
+
+msgctxt "field:stock.shipment.in,supplier_location:"
+msgid "Supplier Location"
+msgstr "供应商库位"
+
+msgctxt "field:stock.shipment.in,warehouse:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "field:stock.shipment.in,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "仓库收货区"
+
+msgctxt "field:stock.shipment.in,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "仓库存储区"
+
+msgctxt "field:stock.shipment.in.return,assigned_by:"
+msgid "Assigned By"
+msgstr "选货人"
+
+msgctxt "field:stock.shipment.in.return,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:stock.shipment.in.return,delivery_address:"
+msgid "Delivery Address"
+msgstr "交货地址"
+
+msgctxt "field:stock.shipment.in.return,done_by:"
+msgid "Done By"
+msgstr "完成人"
+
+msgctxt "field:stock.shipment.in.return,effective_date:"
+msgid "Effective Date"
+msgstr "生效日期"
+
+msgctxt "field:stock.shipment.in.return,from_location:"
+msgid "From Location"
+msgstr "从库位"
+
+msgctxt "field:stock.shipment.in.return,moves:"
+msgid "Moves"
+msgstr "变动"
+
+msgctxt "field:stock.shipment.in.return,number:"
+msgid "Number"
+msgstr "数量"
+
+msgctxt "field:stock.shipment.in.return,origins:"
+msgid "Origins"
+msgstr "依据"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "已选货"
+
+msgctxt "field:stock.shipment.in.return,planned_date:"
+msgid "Planned Date"
+msgstr "计划日期"
+
+msgctxt "field:stock.shipment.in.return,reference:"
+msgid "Reference"
+msgstr "参考"
+
+msgctxt "field:stock.shipment.in.return,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:stock.shipment.in.return,supplier:"
+msgid "Supplier"
+msgstr "供应商"
+
+msgctxt "field:stock.shipment.in.return,to_location:"
+msgid "To Location"
+msgstr "到库位"
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,warehouse:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "field:stock.shipment.internal,assigned_by:"
+msgid "Received By"
+msgstr "接收人"
+
+msgctxt "field:stock.shipment.internal,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:stock.shipment.internal,done_by:"
+msgid "Done By"
+msgstr "完成人"
+
+msgctxt "field:stock.shipment.internal,effective_date:"
+msgid "Effective Date"
+msgstr "生效日期"
+
+msgctxt "field:stock.shipment.internal,effective_start_date:"
+msgid "Effective Start Date"
+msgstr "有效起始日期"
+
+msgctxt "field:stock.shipment.internal,from_location:"
+msgid "From Location"
+msgstr "从库位"
+
+msgctxt "field:stock.shipment.internal,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "来货库存变动"
+
+msgctxt "field:stock.shipment.internal,moves:"
+msgid "Moves"
+msgstr "变动"
+
+msgctxt "field:stock.shipment.internal,number:"
+msgid "Number"
+msgstr "数量"
+
+msgctxt "field:stock.shipment.internal,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "出货库存变动"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "已选货"
+
+msgctxt "field:stock.shipment.internal,planned_date:"
+msgid "Planned Date"
+msgstr "计划日期"
+
+msgctxt "field:stock.shipment.internal,planned_start_date:"
+msgid "Planned Start Date"
+msgstr "计划开始日期"
+
+msgctxt "field:stock.shipment.internal,reference:"
+msgid "Reference"
+msgstr "参考"
+
+msgctxt "field:stock.shipment.internal,shipped_by:"
+msgid "Shipped By"
+msgstr "发货人"
+
+msgctxt "field:stock.shipment.internal,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:stock.shipment.internal,to_location:"
+msgid "To Location"
+msgstr "到库位"
+
+msgctxt "field:stock.shipment.internal,transit_location:"
+msgid "Transit Location"
+msgstr "中转库位"
+
+#, fuzzy
+msgctxt "field:stock.shipment.internal,warehouse:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "field:stock.shipment.out,company:"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "field:stock.shipment.out,customer:"
+msgid "Customer"
+msgstr "客户"
+
+msgctxt "field:stock.shipment.out,customer_location:"
+msgid "Customer Location"
+msgstr "客户库位"
+
+msgctxt "field:stock.shipment.out,delivery_address:"
+msgid "Delivery Address"
+msgstr "交货地址"
+
+msgctxt "field:stock.shipment.out,done_by:"
+msgid "Done By"
+msgstr "完成人"
+
+msgctxt "field:stock.shipment.out,effective_date:"
+msgid "Effective Date"
+msgstr "生效日期"
+
+msgctxt "field:stock.shipment.out,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "库间库存变动"
+
+msgctxt "field:stock.shipment.out,moves:"
+msgid "Moves"
+msgstr "变动"
+
+msgctxt "field:stock.shipment.out,number:"
+msgid "Number"
+msgstr "数量"
+
+msgctxt "field:stock.shipment.out,origins:"
+msgid "Origins"
+msgstr "依据"
+
+msgctxt "field:stock.shipment.out,outgoing_moves:"
+msgid "Outgoing Moves"
+msgstr "出货库存变动"
+
+msgctxt "field:stock.shipment.out,packed_by:"
+msgid "Packed By"
+msgstr "包装人"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out,partially_assigned:"
+msgid "Partially Assigned"
+msgstr "已选货"
+
+msgctxt "field:stock.shipment.out,picked_by:"
+msgid "Picked By"
+msgstr "拣货人"
+
+msgctxt "field:stock.shipment.out,planned_date:"
+msgid "Planned Date"
+msgstr "计划日期"
+
+msgctxt "field:stock.shipment.out,reference:"
+msgid "Reference"
+msgstr "参考"
+
+msgctxt "field:stock.shipment.out,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:stock.shipment.out,warehouse:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "field:stock.shipment.out,warehouse_output:"
+msgid "Warehouse Output"
+msgstr "仓库发货区"
+
+msgctxt "field:stock.shipment.out,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "仓库存储区"
+
+msgctxt "field:stock.shipment.out.return,company:"
+msgid "Company"
+msgstr "公司"
+
+#, fuzzy
+msgctxt "field:stock.shipment.out.return,contact_address:"
+msgid "Contact Address"
+msgstr "联系地址"
+
+msgctxt "field:stock.shipment.out.return,customer:"
+msgid "Customer"
+msgstr "客户"
+
+msgctxt "field:stock.shipment.out.return,customer_location:"
+msgid "Customer Location"
+msgstr "客户库位"
+
+msgctxt "field:stock.shipment.out.return,done_by:"
+msgid "Done By"
+msgstr "完成人"
+
+msgctxt "field:stock.shipment.out.return,effective_date:"
+msgid "Effective Date"
+msgstr "生效日期"
+
+msgctxt "field:stock.shipment.out.return,incoming_moves:"
+msgid "Incoming Moves"
+msgstr "来货库存变动"
+
+msgctxt "field:stock.shipment.out.return,inventory_moves:"
+msgid "Inventory Moves"
+msgstr "库间库存变动"
+
+msgctxt "field:stock.shipment.out.return,moves:"
+msgid "Moves"
+msgstr "变动"
+
+msgctxt "field:stock.shipment.out.return,number:"
+msgid "Number"
+msgstr "数量"
+
+msgctxt "field:stock.shipment.out.return,origins:"
+msgid "Origins"
+msgstr "依据"
+
+msgctxt "field:stock.shipment.out.return,planned_date:"
+msgid "Planned Date"
+msgstr "计划日期"
+
+msgctxt "field:stock.shipment.out.return,received_by:"
+msgid "Received By"
+msgstr "接收人"
+
+msgctxt "field:stock.shipment.out.return,reference:"
+msgid "Reference"
+msgstr "参考"
+
+msgctxt "field:stock.shipment.out.return,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:stock.shipment.out.return,warehouse:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "field:stock.shipment.out.return,warehouse_input:"
+msgid "Warehouse Input"
+msgstr "仓库收货"
+
+msgctxt "field:stock.shipment.out.return,warehouse_storage:"
+msgid "Warehouse Storage"
+msgstr "仓库存储"
+
+msgctxt "help:party.address,delivery:"
+msgid "Check to send deliveries to the address."
+msgstr "选中后,货物将发送到此地址 ."
+
+#, fuzzy
+msgctxt "help:party.contact_mechanism,delivery:"
+msgid "Check to use for delivery."
+msgstr "选中后,货物将发送到此地址 ."
+
+msgctxt "help:party.party,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "发送到参与者的目标库位。"
+
+msgctxt "help:party.party,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "从参与方接收的库存的默认源位置."
+
+msgctxt "help:party.party.location,customer_location:"
+msgid "The default destination location for stock sent to the party."
+msgstr "发送给参与方的库存的默认目标位置."
+
+msgctxt "help:party.party.location,supplier_location:"
+msgid "The default source location for stock received from the party."
+msgstr "从参与方接收的库存的默认源位置."
+
+msgctxt "help:product.by_location.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"计算库存量的日期.\n"
+"* 空值将计算尽可能的提前.\n"
+"* 过去的日期将提供历史取值."
+
+msgctxt "help:product.cost_price.revision,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"一个 python 表达式,与这个表达式一同执行的有:\n"
+"- cost_price: 产品的当前成本价"
+
+msgctxt "help:product.modify_cost_price.start,cost_price:"
+msgid ""
+"Python expression that will be evaluated with:\n"
+"- cost_price: the current cost price of the product"
+msgstr ""
+"一个 python 表达式,与这个表达式一同执行的有:\n"
+"- cost_price: 产品的当前成本价"
+
+msgctxt "help:product.product,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "库位的库存价值."
+
+msgctxt "help:product.product,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "库位的预期库存量."
+
+msgctxt "help:product.product,quantity:"
+msgid "The amount of stock in the location."
+msgstr "库位的库存量."
+
+msgctxt "help:product.template,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "库位的库存价值."
+
+msgctxt "help:product.template,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "库位的预期库存量."
+
+msgctxt "help:product.template,quantity:"
+msgid "The amount of stock in the location."
+msgstr "库位的库存量."
+
+msgctxt "help:res.user,warehouse:"
+msgid "The warehouse that the user works at."
+msgstr "用户工作的仓库."
+
+msgctxt "help:stock.configuration,inventory_sequence:"
+msgid "Used to generate the number given to inventories."
+msgstr "用于生成库存盘点编号."
+
+msgctxt "help:stock.configuration,shipment_in_return_sequence:"
+msgid "Used to generate the number given to supplier return shipments."
+msgstr "用于生成向供应商退货用的编号."
+
+msgctxt "help:stock.configuration,shipment_in_sequence:"
+msgid "Used to generate the number given to supplier shipments."
+msgstr "用于生成从供应商收货用的编号."
+
+msgctxt "help:stock.configuration,shipment_internal_sequence:"
+msgid "Used to generate the number given to internal shipments."
+msgstr "用于生成内部发货的编号."
+
+msgctxt "help:stock.configuration,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr "仓库间中转库存的默认库位."
+
+msgctxt "help:stock.configuration,shipment_out_return_sequence:"
+msgid "Used to generate the number given to customer return shipments."
+msgstr "用于生成接收客户退货用编号."
+
+msgctxt "help:stock.configuration,shipment_out_sequence:"
+msgid "Used to generate the number given to customer shipments."
+msgstr "用于生成向客户发货编号."
+
+msgctxt "help:stock.configuration.location,shipment_internal_transit:"
+msgid ""
+"The default location used for stock that is in transit between warehouses."
+msgstr "仓库间中转库存的默认库位."
+
+msgctxt "help:stock.inventory,company:"
+msgid "The company the inventory is associated with."
+msgstr "库存盘点关联的公司."
+
+msgctxt "help:stock.inventory,date:"
+msgid "The date of the stock count."
+msgstr "库存盘点的日期."
+
+msgctxt "help:stock.inventory,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "如何处理没有数量的明细."
+
+msgctxt "help:stock.inventory,location:"
+msgid "The location inventoried."
+msgstr "已盘点库位."
+
+msgctxt "help:stock.inventory,number:"
+msgid "The main identifier for the inventory."
+msgstr "库存盘点的主标识符."
+
+msgctxt "help:stock.inventory,state:"
+msgid "The current state of the inventory."
+msgstr "库存盘点的当前状态."
+
+#, fuzzy
+msgctxt "help:stock.inventory.count.quantity,quantity:"
+msgid "The quantity to add to the existing count."
+msgstr "新增数量."
+
+msgctxt "help:stock.inventory.count.quantity,total_quantity:"
+msgid "The total amount of the line counted so far."
+msgstr "当前货物的已清点总数."
+
+msgctxt "help:stock.inventory.count.quantity,uom:"
+msgid "The unit in which the quantities are specified."
+msgstr "数量的计量单位."
+
+msgctxt "help:stock.inventory.count.search,search:"
+msgid "The item that's counted."
+msgstr "已清点项."
+
+msgctxt "help:stock.inventory.line,expected_quantity:"
+msgid "The quantity the system calculated should be in the location."
+msgstr "系统计算的库位盘点数."
+
+msgctxt "help:stock.inventory.line,inventory:"
+msgid "The inventory the line belongs to."
+msgstr "所属库存盘点明细."
+
+msgctxt "help:stock.inventory.line,quantity:"
+msgid "The actual quantity found in the location."
+msgstr "在库位实际找到的数量."
+
+msgctxt "help:stock.inventory.line,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "数量的计量单位."
+
+msgctxt "help:stock.location,childs:"
+msgid "Used to add structure below the location."
+msgstr "用于在当前库位下添加结构."
+
+msgctxt "help:stock.location,code:"
+msgid "The internal identifier used for the location."
+msgstr "用于库位的内部标识符."
+
+msgctxt "help:stock.location,cost_value:"
+msgid "The value of the stock in the location."
+msgstr "该库位的库存价值."
+
+msgctxt "help:stock.location,flat_childs:"
+msgid "Check to enforce a single level of children with no grandchildren."
+msgstr "选中此项后, 可强制为单级别子集,不允许孙级别."
+
+msgctxt "help:stock.location,forecast_quantity:"
+msgid "The amount of stock expected to be in the location."
+msgstr "在该库位的预期库存量."
+
+msgctxt "help:stock.location,input_location:"
+msgid "Where incoming stock is received."
+msgstr "收到进货的地方."
+
+msgctxt "help:stock.location,lost_found_location:"
+msgid "Used, by inventories, when correcting stock levels in the warehouse."
+msgstr "在修正库存水平时使用,用于库存盘点."
+
+msgctxt "help:stock.location,output_location:"
+msgid "Where outgoing stock is sent from."
+msgstr "发出库存的地方."
+
+msgctxt "help:stock.location,parent:"
+msgid "Used to add structure above the location."
+msgstr "用于在当前库位上方添加结构."
+
+msgctxt "help:stock.location,picking_location:"
+msgid ""
+"Where stock is picked from.\n"
+"Leave empty to use the storage location."
+msgstr ""
+"拣货区.\n"
+"留空的话,就使用存储库位."
+
+msgctxt "help:stock.location,quantity:"
+msgid "The amount of stock in the location."
+msgstr "该库位的库存量."
+
+msgctxt "help:stock.location,storage_location:"
+msgid "The top level location where stock is stored."
+msgstr "存储库存的顶层位置."
+
+msgctxt "help:stock.location,waste_locations:"
+msgid "The locations used for waste products from the warehouse."
+msgstr "用于存放仓库弃物的位置."
+
+msgctxt "help:stock.location,waste_warehouses:"
+msgid "The warehouses that use the location for waste products."
+msgstr "使用该位置存放弃品的仓库."
+
+msgctxt "help:stock.location.lead_time,lead_time:"
+msgid "The time it takes to move stock between the warehouses."
+msgstr "仓库之间库存变动需要花费的时间."
+
+msgctxt "help:stock.move,company:"
+msgid "The company the stock move is associated with."
+msgstr "与库存变动对应的公司."
+
+msgctxt "help:stock.move,currency:"
+msgid "The currency in which the unit price is specified."
+msgstr "指定单价的货币."
+
+msgctxt "help:stock.move,effective_date:"
+msgid "When the stock was actually moved."
+msgstr "库存变动实际时间."
+
+msgctxt "help:stock.move,from_location:"
+msgid "Where the stock is moved from."
+msgstr "库存变动目的地."
+
+msgctxt "help:stock.move,origin:"
+msgid "The source of the stock move."
+msgstr "库存变动的源位置."
+
+msgctxt "help:stock.move,planned_date:"
+msgid "When the stock is expected to be moved."
+msgstr "库存变动的预期时间."
+
+msgctxt "help:stock.move,product:"
+msgid "The product that the move is associated with."
+msgstr "与库存变动关联的产品."
+
+msgctxt "help:stock.move,quantity:"
+msgid "The amount of stock moved."
+msgstr "库存变动总数."
+
+msgctxt "help:stock.move,shipment:"
+msgid "Used to group several stock moves together."
+msgstr "用于将多个库存变动组合在一起."
+
+msgctxt "help:stock.move,state:"
+msgid "The current state of the stock move."
+msgstr "库存变动的当前状态."
+
+msgctxt "help:stock.move,to_location:"
+msgid "Where the stock is moved to."
+msgstr "库存变动目的位置."
+
+msgctxt "help:stock.move,unit_price_company:"
+msgid "Unit price in company currency."
+msgstr "以公司货币表示的单价."
+
+msgctxt "help:stock.move,uom:"
+msgid "The unit in which the quantity is specified."
+msgstr "用于指定数量的单位."
+
+msgctxt "help:stock.period,company:"
+msgid "The company the stock period is associated with."
+msgstr "与库存分期关联的公司."
+
+msgctxt "help:stock.period,date:"
+msgid "When the stock period ends."
+msgstr "当库存分期结束时."
+
+msgctxt "help:stock.period,state:"
+msgid "The current state of the stock period."
+msgstr "库存分期的当前状态."
+
+msgctxt ""
+"help:stock.product_quantities_warehouse.context,stock_skip_warehouse:"
+msgid "Check to use only the quantity of the storage zone."
+msgstr "选中后,仅使用存储区的数量."
+
+msgctxt "help:stock.product_quantities_warehouse.context,warehouse:"
+msgid "The warehouse for which the quantities will be calculated."
+msgstr "计算数量的仓库."
+
+msgctxt "help:stock.products_by_locations.context,forecast_date:"
+msgid ""
+"The date for which the stock quantity is calculated.\n"
+"* An empty value calculates as far ahead as possible.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"计算库存量的日期.\n"
+"* 空值表示尽可能提前计算.\n"
+"* 过去的日期将提供历史价值."
+
+msgctxt "help:stock.reporting.margin.context,include_lost:"
+msgid ""
+"If checked, the cost of product moved to a lost and found location is "
+"included."
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.partial,moves:"
+msgid "The moves that were not assigned."
+msgstr "库存变动没有选货."
+
+msgctxt "help:stock.shipment.in,company:"
+msgid "The company the shipment is associated with."
+msgstr "收货关联的公司."
+
+msgctxt "help:stock.shipment.in,contact_address:"
+msgid "The address at which the supplier can be contacted."
+msgstr "联系供应商的地址."
+
+msgctxt "help:stock.shipment.in,effective_date:"
+msgid "When the stock was actually received."
+msgstr "当库存实际接收时."
+
+msgctxt "help:stock.shipment.in,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "库存进入仓库的变动操作."
+
+msgctxt "help:stock.shipment.in,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "将库存从存储区移走的操作."
+
+msgctxt "help:stock.shipment.in,number:"
+msgid "The main identifier for the shipment."
+msgstr "收货的主标识符."
+
+msgctxt "help:stock.shipment.in,planned_date:"
+msgid "When the stock is expected to be received."
+msgstr "收货的预期时间."
+
+msgctxt "help:stock.shipment.in,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "收货对应的供应商标识符."
+
+msgctxt "help:stock.shipment.in,state:"
+msgid "The current state of the shipment."
+msgstr "收货的当前状态."
+
+msgctxt "help:stock.shipment.in,supplier:"
+msgid "The party that supplied the stock."
+msgstr "供货方."
+
+msgctxt "help:stock.shipment.in,warehouse:"
+msgid "Where the stock is received."
+msgstr "收货的地方."
+
+msgctxt "help:stock.shipment.in.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "收货关联的公司."
+
+msgctxt "help:stock.shipment.in.return,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "货物送到的地方."
+
+msgctxt "help:stock.shipment.in.return,effective_date:"
+msgid "When the stock was actually returned."
+msgstr "实际退货时间."
+
+msgctxt "help:stock.shipment.in.return,from_location:"
+msgid "Where the stock is moved from."
+msgstr "库存变动的目的地."
+
+msgctxt "help:stock.shipment.in.return,moves:"
+msgid "The moves that return the stock to the supplier."
+msgstr "给供应商退货对应的库存变动."
+
+msgctxt "help:stock.shipment.in.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "退货主标识符."
+
+msgctxt "help:stock.shipment.in.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "预期退货的时间."
+
+msgctxt "help:stock.shipment.in.return,reference:"
+msgid "The supplier's identifier for the shipment."
+msgstr "退货对应的供应商标识符."
+
+msgctxt "help:stock.shipment.in.return,state:"
+msgid "The current state of the shipment."
+msgstr "退货的当前状态."
+
+msgctxt "help:stock.shipment.in.return,supplier:"
+msgid "The party that supplied the stock."
+msgstr "供货方."
+
+msgctxt "help:stock.shipment.in.return,to_location:"
+msgid "Where the stock is moved to."
+msgstr "库存变动目的地."
+
+msgctxt "help:stock.shipment.internal,company:"
+msgid "The company the shipment is associated with."
+msgstr "发货关联的公司."
+
+msgctxt "help:stock.shipment.internal,effective_date:"
+msgid "When the shipment was actually completed."
+msgstr "当发货实际完成时."
+
+msgctxt "help:stock.shipment.internal,effective_start_date:"
+msgid "When the stock was actually sent."
+msgstr "当货物实际发出的时候."
+
+msgctxt "help:stock.shipment.internal,from_location:"
+msgid "Where the stock is moved from."
+msgstr "库存变动源地址."
+
+msgctxt "help:stock.shipment.internal,incoming_moves:"
+msgid "The moves that receive the stock in."
+msgstr "收货对应的库存变动."
+
+msgctxt "help:stock.shipment.internal,moves:"
+msgid "The moves that perform the shipment."
+msgstr "发货对应的变动."
+
+msgctxt "help:stock.shipment.internal,number:"
+msgid "The main identifier for the shipment."
+msgstr "发货的主标识符."
+
+msgctxt "help:stock.shipment.internal,outgoing_moves:"
+msgid "The moves that send the stock out."
+msgstr "仓库向外发货."
+
+msgctxt "help:stock.shipment.internal,planned_date:"
+msgid "When the shipment is expected to be completed."
+msgstr "发货预期完成时间."
+
+msgctxt "help:stock.shipment.internal,planned_start_date:"
+msgid "When the stock is expected to be sent."
+msgstr "货物预计发出时间."
+
+msgctxt "help:stock.shipment.internal,reference:"
+msgid "The external identifiers for the shipment."
+msgstr "发货的外部标识符."
+
+msgctxt "help:stock.shipment.internal,state:"
+msgid "The current state of the shipment."
+msgstr "发货的当前状态."
+
+msgctxt "help:stock.shipment.internal,to_location:"
+msgid "Where the stock is moved to."
+msgstr "库存变动目的地."
+
+msgctxt "help:stock.shipment.internal,transit_location:"
+msgid ""
+"Where the stock is located while it is in transit between the warehouses."
+msgstr "库存中转时的位置."
+
+#, fuzzy
+msgctxt "help:stock.shipment.internal,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "货物发送地."
+
+msgctxt "help:stock.shipment.out,company:"
+msgid "The company the shipment is associated with."
+msgstr "发货关联的公司."
+
+msgctxt "help:stock.shipment.out,customer:"
+msgid "The party that purchased the stock."
+msgstr "采购的一方."
+
+msgctxt "help:stock.shipment.out,delivery_address:"
+msgid "Where the stock is sent to."
+msgstr "发货的目的地."
+
+msgctxt "help:stock.shipment.out,effective_date:"
+msgid "When the stock was actually sent."
+msgstr "发货确切时间."
+
+msgctxt "help:stock.shipment.out,inventory_moves:"
+msgid "The moves that pick the stock from the storage area."
+msgstr "从储存区拣货的变动."
+
+msgctxt "help:stock.shipment.out,number:"
+msgid "The main identifier for the shipment."
+msgstr "发货的主标识符."
+
+msgctxt "help:stock.shipment.out,outgoing_moves:"
+msgid "The moves that send the stock to the customer."
+msgstr "将库存发送给客户的动作."
+
+msgctxt "help:stock.shipment.out,planned_date:"
+msgid "When the stock is expected to be sent."
+msgstr "预期发货时间."
+
+msgctxt "help:stock.shipment.out,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "发货的客户标识符."
+
+msgctxt "help:stock.shipment.out,state:"
+msgid "The current state of the shipment."
+msgstr "发货的当前状态."
+
+msgctxt "help:stock.shipment.out,warehouse:"
+msgid "Where the stock is sent from."
+msgstr "货物发送地."
+
+msgctxt "help:stock.shipment.out.return,company:"
+msgid "The company the shipment is associated with."
+msgstr "退货关联的公司."
+
+#, fuzzy
+msgctxt "help:stock.shipment.out.return,contact_address:"
+msgid "The address the customer can be contacted at."
+msgstr "客户联系地址."
+
+msgctxt "help:stock.shipment.out.return,customer:"
+msgid "The party that purchased the stock."
+msgstr "购买库存的参与方."
+
+msgctxt "help:stock.shipment.out.return,effective_date:"
+msgid "When the stock was returned."
+msgstr "退货时间."
+
+msgctxt "help:stock.shipment.out.return,incoming_moves:"
+msgid "The moves that bring the stock into the warehouse."
+msgstr "把货物进仓库的动作."
+
+msgctxt "help:stock.shipment.out.return,inventory_moves:"
+msgid "The moves that put the stock away into the storage area."
+msgstr "把存货放进储藏区的动作."
+
+msgctxt "help:stock.shipment.out.return,number:"
+msgid "The main identifier for the shipment."
+msgstr "退货的主标识符."
+
+msgctxt "help:stock.shipment.out.return,planned_date:"
+msgid "When the stock is expected to be returned."
+msgstr "退货预期时间."
+
+msgctxt "help:stock.shipment.out.return,reference:"
+msgid "The customer's identifier for the shipment."
+msgstr "退货的客户标识符."
+
+msgctxt "help:stock.shipment.out.return,state:"
+msgid "The current state of the shipment."
+msgstr "退货的当前状态."
+
+msgctxt "help:stock.shipment.out.return,warehouse:"
+msgid "Where the stock is returned."
+msgstr "退货地."
+
+msgctxt "model:ir.action,name:act_inventory_form"
+msgid "Inventories"
+msgstr "库存盘点"
+
+msgctxt "model:ir.action,name:act_inventory_line_relate"
+msgid "Inventory Lines"
+msgstr "库存盘点明细"
+
+msgctxt "model:ir.action,name:act_location_form"
+msgid "Locations"
+msgstr "库位"
+
+msgctxt "model:ir.action,name:act_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "库位交付周期"
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "库位明细数量"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "库位树数量"
+
+msgctxt "model:ir.action,name:act_location_tree"
+msgid "Locations"
+msgstr "库位"
+
+msgctxt "model:ir.action,name:act_move_form"
+msgid "Moves"
+msgstr "变动"
+
+msgctxt "model:ir.action,name:act_period_list"
+msgid "Periods"
+msgstr "分期"
+
+msgctxt "model:ir.action,name:act_product_cost_price_revision"
+msgid "Cost Price Revision"
+msgstr "成本价修正"
+
+msgctxt "model:ir.action,name:act_product_moves"
+msgid "Stock Moves"
+msgstr "库存变动"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse"
+msgid "Product Quantities By Warehouse"
+msgstr "按仓库列出的产品数量"
+
+msgctxt "model:ir.action,name:act_product_quantities_warehouse_move"
+msgid "Stock Moves By Warehouse"
+msgstr "仓库库存变动"
+
+msgctxt "model:ir.action,name:act_products_by_locations_relate"
+msgid "Products by Locations"
+msgstr "按库位划分的产品"
+
+msgctxt "model:ir.action,name:act_reporting_margin_category"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_time_series"
+msgid "Margins per Category"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_category_tree"
+msgid "Margins per Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main"
+msgid "Margins"
+msgstr "依据"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_reporting_margin_main_time_series"
+msgid "Margins"
+msgstr "依据"
+
+msgctxt "model:ir.action,name:act_reporting_margin_product"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_reporting_margin_product_time_series"
+msgid "Margins per Product"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "从供应商收货"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "向供应商退货"
+
+msgctxt "model:ir.action,name:act_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "内部发货"
+
+msgctxt "model:ir.action,name:act_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "向客户发货"
+
+msgctxt "model:ir.action,name:act_shipment_out_form2"
+msgid "Customer Shipments"
+msgstr "向客户发货"
+
+msgctxt "model:ir.action,name:act_shipment_out_form3"
+msgid "Supplier Shipments"
+msgstr "从供应商收货"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "接收客户退货"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_stock_configuration_form"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.action,name:report_shipment_in_restocking_list"
+msgid "Restocking List"
+msgstr "补货清单"
+
+msgctxt "model:ir.action,name:report_shipment_internal"
+msgid "Internal Shipment"
+msgstr "内部发货"
+
+msgctxt "model:ir.action,name:report_shipment_out_delivery_note"
+msgid "Delivery Note"
+msgstr "送货清单"
+
+msgctxt "model:ir.action,name:report_shipment_out_picking_list"
+msgid "Picking List"
+msgstr "拣货清单"
+
+msgctxt "model:ir.action,name:report_shipment_out_return_restocking_list"
+msgid "Restocking List"
+msgstr "补货清单"
+
+msgctxt "model:ir.action,name:wizard_inventory_count"
+msgid "Count"
+msgstr "盘点"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_open_product_quantities_by_warehouse"
+msgid "Products Quantities By Warehouse"
+msgstr "按仓库列出的产品数量"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action,name:wizard_open_product_quantities_by_warehouse_move"
+msgid "Stock Moves"
+msgstr "库存变动"
+
+msgctxt "model:ir.action,name:wizard_product_modify_cost_price"
+msgid "Modify Cost Price"
+msgstr "修改成本价"
+
+msgctxt "model:ir.action,name:wizard_recompute_cost_price"
+msgid "Recompute Cost Price"
+msgstr "重新计算成本价"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign"
+msgid "Assign Supplier Return Shipment"
+msgstr "选定向供应商要退的货物"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign"
+msgid "Assign Internal Shipment"
+msgstr "选定内部发送的货物"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign"
+msgid "Assign Customer Shipment"
+msgstr "选定给客户发送的货物"
+
+msgctxt "model:ir.action.act_window.domain,name:act_inventory_form_domain_all"
+msgid "All"
+msgstr "全部"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_inventory_form_domain_draft"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "model:ir.action.act_window.domain,name:act_move_form_domain_all"
+msgid "All"
+msgstr "全部"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier"
+msgid "From Suppliers"
+msgstr "从供应商收货"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_from_supplier_waiting"
+msgid "From Suppliers Waiting"
+msgstr "从供应商等待收货"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_move_form_domain_to_customer"
+msgid "To Customers"
+msgstr "向客户发货"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_all"
+msgid "All"
+msgstr "全部"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_draft"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_form_domain_received"
+msgid "Received"
+msgstr "已接收"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_all"
+msgid "All"
+msgstr "全部"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_assigned"
+msgid "Assigned"
+msgstr "已选货"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_available"
+msgid "Partially Assigned"
+msgstr "已选货"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_draft"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_in_return_form_domain_waiting"
+msgid "Waiting"
+msgstr "正在等待"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_all"
+msgid "All"
+msgstr "全部"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_assigned"
+msgid "Assigned"
+msgstr "已选货"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_available"
+msgid "Partially Assigned"
+msgstr "已选货"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_draft"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_requests"
+msgid "Requests"
+msgstr "申请"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_shipped"
+msgid "Shipped"
+msgstr "发货"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_internal_form_domain_waiting"
+msgid "Waiting"
+msgstr "等待"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_all"
+msgid "All"
+msgstr "全部"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_assigned"
+msgid "Assigned"
+msgstr "已选货"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_available"
+msgid "Partially Assigned"
+msgstr "已选货"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_draft"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_packed"
+msgid "Packed"
+msgstr "已包装"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_picked"
+msgid "Picked"
+msgstr "已拣货"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_form_domain_waiting"
+msgid "Waiting"
+msgstr "正在等待"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_all"
+msgid "All"
+msgstr "全部"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_draft"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_shipment_out_return_form_domain_received"
+msgid "Received"
+msgstr "已接收"
+
+msgctxt "model:ir.message,text:msg_erase_party_shipment"
+msgid ""
+"You cannot erase party \"%(party)s\" while they have pending shipments with "
+"company \"%(company)s\"."
+msgstr "当参与方 \"%(party)s\" 与公司 \"%(company)s\" 有待处理的收发货时,您不能删除它们."
+
+msgctxt "model:ir.message,text:msg_invalid_cost_price"
+msgid ""
+"Invalid cost price \"%(cost_price)s\" for product \"%(product)s\" with "
+"exception \"%(exception)s\"."
+msgstr "产品 \"%(product)s\" 的成本价 \"%(cost_price)s\" 无效,异常为\"%(exception)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_count_create_line"
+msgid "No existing line found for \"%(search)s\"."
+msgstr "\"%(search)s\" 找不到存在的明细."
+
+msgctxt "model:ir.message,text:msg_inventory_date_in_the_future"
+msgid "The inventories \"%(inventories)s\" have dates in the future."
+msgstr "库存盘点 \"%(inventories)s\" 日期超前."
+
+msgctxt "model:ir.message,text:msg_inventory_delete_cancel"
+msgid "To delete inventory \"%(inventory)s\" you must cancel it."
+msgstr "删除库存盘点 \"%(inventory)s\" 之前, 必须取消它."
+
+msgctxt "model:ir.message,text:msg_inventory_line_delete_cancel"
+msgid ""
+"To delete inventory line \"%(line)s\" you must cancel inventory "
+"\"%(inventory)s\"."
+msgstr "要删除库存盘点明细 \"%(line)s\",必须取消库存盘点 \"%(inventory)s\"."
+
+msgctxt "model:ir.message,text:msg_inventory_line_quantity_positive"
+msgid "Inventory line quantity must be positive."
+msgstr "库存盘点明细数量必须为正."
+
+msgctxt "model:ir.message,text:msg_inventory_line_unique"
+msgid "Inventory line \"%(line)s\" is not unique on inventory \"%(inventory)s\"."
+msgstr "库存盘点明细 \"%(line)s\"在库存盘点 \"%(inventory)s\" 中有重复."
+
+msgctxt "model:ir.message,text:msg_inventory_location_missing_lost_found"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must set a lost and found on "
+"a parent of location \"%(location)s\"."
+msgstr "要确认库存盘点 \"%(inventory)s\",您必须在库位 \"%(location)s\" 的上级设置失物招领区."
+
+msgctxt "model:ir.message,text:msg_inventory_missing_empty_quantity"
+msgid ""
+"To confirm the inventory \"%(inventory)s\" you must select an option for "
+"empty quantity."
+msgstr "要确认库存\"%(inventory)s\",必须为空数量选择一个选项."
+
+msgctxt "model:ir.message,text:msg_location_child_of_warehouse"
+msgid ""
+"To set location \"%(location)s\" as storage/input/output of warehouse "
+"\"%(warehouse)s\", it must be in the warehouse."
+msgstr "如果要将库位 \"%(location)s\" 设置为仓库 \"%(warehouse)s\" 的存储/输入/输出,则必须在仓库中."
+
+msgctxt "model:ir.message,text:msg_location_inactive_not_empty"
+msgid "To inactivate location \"%(location)s\", you must empty it."
+msgstr "要停用库位\"%(location)s\", 必须将其清空."
+
+msgctxt "model:ir.message,text:msg_location_invalid_type_for_moves"
+msgid ""
+"You cannot change the type of location \"%(location)s\" to \"%(type)s\"\n"
+"because the type does not support moves and location has existing moves."
+msgstr ""
+"不能将库位 \"%(location)s\" 的类型更改为 \"%(type)s\".\n"
+"因为这种类型不支持变动,并且库位已经有库存变动了."
+
+msgctxt "model:ir.message,text:msg_move_delete_draft_cancel"
+msgid ""
+"To delete stock move \"%(move)s\" you must cancel it or reset its state to "
+"draft."
+msgstr "若要删除库存变动 \"%(move)s\",必须将其取消或将其状态重置为草稿."
+
+msgctxt "model:ir.message,text:msg_move_effective_date_in_the_future"
+msgid "The moves \"%(moves)s\" have effective dates in the future."
+msgstr "库存变动 \"%(moves)s\" 的生效时间在未来."
+
+msgctxt "model:ir.message,text:msg_move_from_to_location"
+msgid "The source and destination of stock move must be different."
+msgstr "库存变动的来源和目的地不能相同."
+
+msgctxt "model:ir.message,text:msg_move_internal_quantity_positive"
+msgid "Internal move quantity must be positive."
+msgstr "内部变动数量必须为正."
+
+msgctxt "model:ir.message,text:msg_move_modify_assigned"
+msgid "To modify stock move \"%(move)s\" you must reset its state to draft."
+msgstr "要修改库存变动 \"%(move)s\",必须将其状态重置为草稿."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_move_modify_cancelled"
+msgid "You cannot modify stock move \"%(move)s\" because it is cancelled."
+msgstr "无法更改库存变动 \"%(move)s\", 因为它已经取消了."
+
+msgctxt "model:ir.message,text:msg_move_modify_done"
+msgid "You cannot modify stock move \"%(move)s\" because it is done."
+msgstr "无法更改库存变动 \"%(move)s\", 因为它已经完成了."
+
+msgctxt "model:ir.message,text:msg_move_modify_period_close"
+msgid "To modify stock move \"%(move)s\" you must reopen period \"%(period)s\"."
+msgstr "要修改库存变动 \"%(move)s\" 你必须重新开启分期 \"%(period)s\"."
+
+msgctxt "model:ir.message,text:msg_move_no_origin"
+msgid "Stock moves \"%(moves)s\" have no origin."
+msgstr "库存变动 \"%(moves)s\" 没有依据."
+
+msgctxt "model:ir.message,text:msg_move_quantity_positive"
+msgid "Move quantity must be positive."
+msgstr "库存变动数量必须为正."
+
+msgctxt "model:ir.message,text:msg_period_close_assigned_move"
+msgid "You cannot close periods with assigned moves in it."
+msgstr "不能关闭包含已选货的库存变动的分期."
+
+msgctxt "model:ir.message,text:msg_period_close_date"
+msgid "You cannot close periods with a date in the future or today."
+msgstr "不能关闭包含将来或今天日期的分期."
+
+msgctxt "model:ir.message,text:msg_product_change_cost_price"
+msgid ""
+"You cannot change the cost price of a product which is associated with stock moves.\n"
+"You must use the \"Modify Cost Price\" wizard."
+msgstr ""
+"不能更改与库存变动相关联的产品的成本价.\n"
+"必须使用“修改成本价”向导."
+
+msgctxt "model:ir.message,text:msg_product_change_default_uom"
+msgid ""
+"You cannot change the default UOM of a product which is associated with "
+"stock moves."
+msgstr "不能更改与库存变动关联的产品的默认计量单位."
+
+msgctxt "model:ir.message,text:msg_product_change_type"
+msgid ""
+"You cannot change the type of a product which is associated with stock "
+"moves."
+msgstr "不能更改与库存变动关联的产品类型."
+
+msgctxt "model:ir.message,text:msg_product_location_quantity"
+msgid ""
+"The product \"%(product)s\" has still some quantities in locations "
+"\"%(locations)s\" for company \"%(company)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_product_location_quantity_description"
+msgid ""
+"It is recommended to clear the stock from the storage locations before "
+"deactivating the product."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_delete_cancel"
+msgid "To delete shipment \"%(shipment)s\" you must cancel it."
+msgstr "删除收发货 \"%(shipment)s\" 之前,必须取消它."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_shipment_pack_inventory_done"
+msgid "To pack shipment \"%(shipment)s\" you must do the inventory moves."
+msgstr "删除收发货 \"%(shipment)s\" 之前,必须取消它."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_company"
+msgid "Company"
+msgstr "公司"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_cost"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_currency"
+msgid "Currency"
+msgstr "货币"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin"
+msgid "Margin"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_margin_trend"
+msgid "Margin Trend"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_stock_reporting_number"
+msgid "Number"
+msgstr "编号"
+
+msgctxt "model:ir.message,text:msg_stock_reporting_profit"
+msgid "Profit"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_stock_reporting_revenue"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "model:ir.model.button,confirm:inventory_cancel_button"
+msgid "Are you sure you want to cancel the inventory?"
+msgstr "确定要取消库存盘点吗?"
+
+msgctxt "model:ir.model.button,confirm:inventory_confirm_button"
+msgid "Are you sure you want to confirm the inventory?"
+msgstr "确定要确认库存盘点吗?"
+
+msgctxt "model:ir.model.button,confirm:move_cancel_button"
+msgid "Are you sure you want to cancel the move?"
+msgstr "确定要取消库存变动吗?"
+
+msgctxt "model:ir.model.button,confirm:move_do_button"
+msgid "Are you sure you want to complete the move?"
+msgstr "确定要完成库存变动吗?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "确定要收货吗?"
+
+msgctxt "model:ir.model.button,confirm:shipment_in_return_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "确定要完成收货吗?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_done_button"
+msgid "Are you sure you want to complete the shipment?"
+msgstr "确定要完成发货吗?"
+
+msgctxt "model:ir.model.button,confirm:shipment_out_return_receive_button"
+msgid "Are you sure you want to receive the shipment?"
+msgstr "你确定要接收客户退货吗?"
+
+msgctxt "model:ir.model.button,help:inventory_complete_lines_button"
+msgid "Add an inventory line for each missing products"
+msgstr "为每个缺少的产品添加一条库存盘点明细"
+
+msgctxt "model:ir.model.button,help:inventory_count_button"
+msgid "Launch the wizard to count products"
+msgstr "启动产品数量盘点向导"
+
+msgctxt "model:ir.model.button,string:inventory_cancel_button"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "model:ir.model.button,string:inventory_complete_lines_button"
+msgid "Complete"
+msgstr "补全"
+
+msgctxt "model:ir.model.button,string:inventory_confirm_button"
+msgid "Confirm"
+msgstr "确认"
+
+msgctxt "model:ir.model.button,string:inventory_count_button"
+msgid "Count"
+msgstr "盘点"
+
+msgctxt "model:ir.model.button,string:move_cancel_button"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "model:ir.model.button,string:move_do_button"
+msgid "Do"
+msgstr "Do"
+
+msgctxt "model:ir.model.button,string:move_draft_button"
+msgid "Reset to Draft"
+msgstr "重置为草案"
+
+msgctxt "model:ir.model.button,string:period_close_button"
+msgid "Close"
+msgstr "结账"
+
+msgctxt "model:ir.model.button,string:period_draft_button"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "model:ir.model.button,string:shipment_in_cancel_button"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "model:ir.model.button,string:shipment_in_done_button"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "model:ir.model.button,string:shipment_in_draft_button"
+msgid "Reset to Draft"
+msgstr "重置为草案"
+
+msgctxt "model:ir.model.button,string:shipment_in_receive_button"
+msgid "Receive"
+msgstr "接收"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_assign_wizard_button"
+msgid "Assign"
+msgstr "选货"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_cancel_button"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_done_button"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_draft_button"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "model:ir.model.button,string:shipment_in_return_wait_button"
+msgid "Wait"
+msgstr "等待"
+
+msgctxt "model:ir.model.button,string:shipment_internal_assign_wizard_button"
+msgid "Assign"
+msgstr "选货"
+
+msgctxt "model:ir.model.button,string:shipment_internal_cancel_button"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "model:ir.model.button,string:shipment_internal_done_button"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "model:ir.model.button,string:shipment_internal_draft_button"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "model:ir.model.button,string:shipment_internal_ship_button"
+msgid "Ship"
+msgstr "发货"
+
+msgctxt "model:ir.model.button,string:shipment_internal_wait_button"
+msgid "Wait"
+msgstr "等待"
+
+msgctxt "model:ir.model.button,string:shipment_out_assign_wizard_button"
+msgid "Assign"
+msgstr "选货"
+
+msgctxt "model:ir.model.button,string:shipment_out_cancel_button"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "model:ir.model.button,string:shipment_out_done_button"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "model:ir.model.button,string:shipment_out_draft_button"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "model:ir.model.button,string:shipment_out_pack_button"
+msgid "Pack"
+msgstr "包装"
+
+msgctxt "model:ir.model.button,string:shipment_out_pick_button"
+msgid "Pick"
+msgstr "拣货"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_cancel_button"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_done_button"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_draft_button"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "model:ir.model.button,string:shipment_out_return_receive_button"
+msgid "Receive"
+msgstr "接收"
+
+msgctxt "model:ir.model.button,string:shipment_out_wait_button"
+msgid "Wait"
+msgstr "等待"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_inventory_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_move_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_period_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_cost_price_revision_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_product_quantities_warehouse_move_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_category_time_series_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_reporting_margin_main_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_main_time_series_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt ""
+"model:ir.rule.group,name:rule_group_reporting_margin_product_time_series_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_in_return_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_internal_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+#, fuzzy
+msgctxt "model:ir.rule.group,name:rule_group_shipment_out_return_companies"
+msgid "User in companies"
+msgstr "公司中的用户"
+
+msgctxt "model:ir.sequence,name:sequence_inventory"
+msgid "Inventory"
+msgstr "库存盘点"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in"
+msgid "Supplier Shipment"
+msgstr "从供应商收货"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "向供应商退货"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_internal"
+msgid "Internal Shipment"
+msgstr "内部发货"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out"
+msgid "Customer Shipment"
+msgstr "向客户发货"
+
+msgctxt "model:ir.sequence,name:sequence_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "接收客户退货"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_inventory"
+msgid "Inventory"
+msgstr "库存盘点"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in"
+msgid "Supplier Shipment"
+msgstr "从供应商收货"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_in_return"
+msgid "Supplier Return Shipment"
+msgstr "向供应商退货"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_internal"
+msgid "Internal Shipment"
+msgstr "内部发货"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out"
+msgid "Customer Shipment"
+msgstr "向客户发货"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_shipment_out_return"
+msgid "Customer Return Shipment"
+msgstr "接收客户退货"
+
+msgctxt "model:ir.ui.menu,name:menu_configuration"
+msgid "Configuration"
+msgstr "设置"
+
+msgctxt "model:ir.ui.menu,name:menu_inventory_form"
+msgid "Inventories"
+msgstr "库存盘点"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form"
+msgid "Locations"
+msgstr "库位"
+
+msgctxt "model:ir.ui.menu,name:menu_location_form2"
+msgid "Locations"
+msgstr "库位"
+
+msgctxt "model:ir.ui.menu,name:menu_location_lead_time_form"
+msgid "Location Lead Times"
+msgstr "库位交付周期"
+
+msgctxt "model:ir.ui.menu,name:menu_location_tree"
+msgid "Locations"
+msgstr "库位"
+
+msgctxt "model:ir.ui.menu,name:menu_move_form"
+msgid "Moves"
+msgstr "变动"
+
+msgctxt "model:ir.ui.menu,name:menu_period_list"
+msgid "Periods"
+msgstr "分期"
+
+msgctxt "model:ir.ui.menu,name:menu_reporting"
+msgid "Reporting"
+msgstr "报表"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_reporting_margin"
+msgid "Margins"
+msgstr "依据"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment"
+msgid "Shipments"
+msgstr "收发货"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_form"
+msgid "Supplier Shipments"
+msgstr "从供应商收货"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_in_return_form"
+msgid "Supplier Returns"
+msgstr "向供应商退货"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_internal_form"
+msgid "Internal Shipments"
+msgstr "内部发货"
+
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_form"
+msgid "Customer Shipments"
+msgstr "向客户发货"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_shipment_out_return_form"
+msgid "Customer Returns"
+msgstr "接收客户退货"
+
+msgctxt "model:ir.ui.menu,name:menu_stock"
+msgid "Inventory & Stock"
+msgstr "库存 & 盘点"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_stock_configuration"
+msgid "Configuration"
+msgstr "设置"
+
+#, fuzzy
+msgctxt "model:party.party-delivered_to-stock.location,name:"
+msgid "Party Delivered to Warehouse"
+msgstr "当前仓库"
+
+msgctxt "model:party.party.location,name:"
+msgid "Party Location"
+msgstr "参与者库位"
+
+msgctxt "model:product.by_location.context,name:"
+msgid "Product by Location"
+msgstr "按库位划分的产品"
+
+msgctxt "model:product.cost_price.revision,name:"
+msgid "Product Cost Price Revision"
+msgstr "产品成本价修正"
+
+msgctxt "model:product.modify_cost_price.start,name:"
+msgid "Modify Cost Price"
+msgstr "修改成本价"
+
+msgctxt "model:product.recompute_cost_price.start,name:"
+msgid "Recompute Cost Price"
+msgstr "重新计算成本价"
+
+msgctxt "model:res.group,name:group_stock"
+msgid "Stock"
+msgstr "库存"
+
+msgctxt "model:res.group,name:group_stock_admin"
+msgid "Stock Administration"
+msgstr "库存管理"
+
+msgctxt "model:res.group,name:group_stock_force_assignment"
+msgid "Stock Force Assignment"
+msgstr "仓库强制选货"
+
+msgctxt "model:stock.configuration,name:"
+msgid "Stock Configuration"
+msgstr "库存配置"
+
+msgctxt "model:stock.configuration.location,name:"
+msgid "Stock Configuration Location"
+msgstr "库存配置-库位"
+
+msgctxt "model:stock.configuration.sequence,name:"
+msgid "Stock Configuration Sequence"
+msgstr "库存配置序列"
+
+msgctxt "model:stock.inventory,name:"
+msgid "Stock Inventory"
+msgstr "库存盘点"
+
+msgctxt "model:stock.inventory.count.quantity,name:"
+msgid "Stock Inventory Count"
+msgstr "库存盘点"
+
+msgctxt "model:stock.inventory.count.search,name:"
+msgid "Stock Inventory Count"
+msgstr "库存盘点"
+
+msgctxt "model:stock.inventory.line,name:"
+msgid "Stock Inventory Line"
+msgstr "库存盘点明细"
+
+msgctxt "model:stock.location,name:"
+msgid "Stock Location"
+msgstr "库位"
+
+msgctxt "model:stock.location,name:location_customer"
+msgid "Customer"
+msgstr "客户"
+
+msgctxt "model:stock.location,name:location_input"
+msgid "Input Zone"
+msgstr "收货区"
+
+msgctxt "model:stock.location,name:location_lost_found"
+msgid "Lost and Found"
+msgstr "失物招领区"
+
+msgctxt "model:stock.location,name:location_output"
+msgid "Output Zone"
+msgstr "出货区"
+
+msgctxt "model:stock.location,name:location_storage"
+msgid "Storage Zone"
+msgstr "存储区"
+
+msgctxt "model:stock.location,name:location_supplier"
+msgid "Supplier"
+msgstr "供应商"
+
+msgctxt "model:stock.location,name:location_transit"
+msgid "Transit"
+msgstr "中转"
+
+msgctxt "model:stock.location,name:location_warehouse"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "model:stock.location.lead_time,name:"
+msgid "Location Lead Time"
+msgstr "库位交货期"
+
+msgctxt "model:stock.location.waste,name:"
+msgid "Warehouse Waste Location"
+msgstr "仓库弃物库位"
+
+msgctxt "model:stock.move,name:"
+msgid "Stock Move"
+msgstr "库存变动"
+
+msgctxt "model:stock.period,name:"
+msgid "Stock Period"
+msgstr "库存分期"
+
+msgctxt "model:stock.period.cache,name:"
+msgid "Stock Period Cache"
+msgstr "库存分期缓存"
+
+msgctxt "model:stock.product_quantities_warehouse,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "按仓库列出的产品数量"
+
+msgctxt "model:stock.product_quantities_warehouse.context,name:"
+msgid "Product Quantities By Warehouse"
+msgstr "按仓库列出的产品数量"
+
+msgctxt "model:stock.product_quantities_warehouse.move,name:"
+msgid "Product Quantities By Warehouse Moves"
+msgstr "按库存变动列出的产品数量"
+
+msgctxt "model:stock.products_by_locations,name:"
+msgid "Products by Locations"
+msgstr "按库位划分的产品"
+
+msgctxt "model:stock.products_by_locations.context,name:"
+msgid "Products by Locations"
+msgstr "按库位划分的产品"
+
+msgctxt "model:stock.reporting.margin.category,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.time_series,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.category.tree,name:"
+msgid "Stock Reporting Margin per Category"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.context,name:"
+msgid "Stock Reporting Margin Context"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.main.time_series,name:"
+msgid "Stock Reporting Margin"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.reporting.margin.product.time_series,name:"
+msgid "Stock Reporting Margin per Product"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.partial,name:"
+msgid "Assign Shipment"
+msgstr "选货"
+
+msgctxt "model:stock.shipment.in,name:"
+msgid "Supplier Shipment"
+msgstr "从供应商收货"
+
+msgctxt "model:stock.shipment.in.return,name:"
+msgid "Supplier Return Shipment"
+msgstr "向供应商退货"
+
+msgctxt "model:stock.shipment.internal,name:"
+msgid "Internal Shipment"
+msgstr "内部发货"
+
+msgctxt "model:stock.shipment.out,name:"
+msgid "Customer Shipment"
+msgstr "向客户发货"
+
+msgctxt "model:stock.shipment.out.return,name:"
+msgid "Customer Return Shipment"
+msgstr "接收客户退货"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "From Location"
+msgstr "从库位"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Planned Date:"
+msgstr "计划日期:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Reference:"
+msgstr "参考:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Restocking List"
+msgstr "补货单"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Shipment Number"
+msgstr "收货编号"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Supplier:"
+msgstr "供应商:"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "To Location"
+msgstr "到库位"
+
+msgctxt "report:stock.shipment.in.restocking_list:"
+msgid "Warehouse:"
+msgstr "仓库:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location"
+msgstr "从库位"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "From Location:"
+msgstr "从库位:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Internal Shipment"
+msgstr "内部发货"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Planned Date:"
+msgstr "计划日期:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Reference:"
+msgstr "参考:"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "Shipment Number"
+msgstr "发货号"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location"
+msgstr "到库位"
+
+msgctxt "report:stock.shipment.internal.report:"
+msgid "To Location:"
+msgstr "到库位:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Customer Code:"
+msgstr "客户代码:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Date:"
+msgstr "日期:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Delivery Note"
+msgstr "提货单"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Reference:"
+msgstr "参考:"
+
+msgctxt "report:stock.shipment.out.delivery_note:"
+msgid "Shipment Number:"
+msgstr "发货号:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Customer:"
+msgstr "客户:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "From Location"
+msgstr "从库位"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Picking List"
+msgstr "拣货单"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Planned Date:"
+msgstr "计划日期:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Reference:"
+msgstr "参考:"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Shipment Number"
+msgstr "发货号"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "To Location"
+msgstr "到库位"
+
+msgctxt "report:stock.shipment.out.picking_list:"
+msgid "Warehouse:"
+msgstr "仓库:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "/"
+msgstr "/"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid ":"
+msgstr ":"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Customer"
+msgstr "客户"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "From Location"
+msgstr "从库位"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Number"
+msgstr "数量"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Planned Date:"
+msgstr "计划日期:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Reference:"
+msgstr "参考:"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Restocking List"
+msgstr "补货单"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Shipment"
+msgstr "退货"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "To Location"
+msgstr "到库位"
+
+msgctxt "report:stock.shipment.out.return.restocking_list:"
+msgid "Warehouse:"
+msgstr "仓库:"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Customer Shipments"
+msgstr "选定给客户发送的货物"
+
+#, fuzzy
+msgctxt "selection:ir.cron,method:"
+msgid "Assign Internal Shipments"
+msgstr "选定内部发送的货物"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Recompute Cost Price from Moves"
+msgstr "根据变动重新计算成本价"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Customer Shipments"
+msgstr "重新安排向客户发货"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Internal Shipments"
+msgstr "重新安排内部发货"
+
+msgctxt "selection:ir.cron,method:"
+msgid "Reschedule Supplier Return Shipments"
+msgstr "重新安排向供应商退货"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Empty"
+msgstr "空"
+
+msgctxt "selection:stock.inventory,empty_quantity:"
+msgid "Keep"
+msgstr "保持"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Cancelled"
+msgstr "取消"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "selection:stock.inventory,state:"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "selection:stock.location,type:"
+msgid "Customer"
+msgstr "客户"
+
+msgctxt "selection:stock.location,type:"
+msgid "Drop"
+msgstr "直接代发货"
+
+msgctxt "selection:stock.location,type:"
+msgid "Lost and Found"
+msgstr "失物招领区"
+
+msgctxt "selection:stock.location,type:"
+msgid "Production"
+msgstr "产品"
+
+msgctxt "selection:stock.location,type:"
+msgid "Storage"
+msgstr "存储"
+
+msgctxt "selection:stock.location,type:"
+msgid "Supplier"
+msgstr "供应商"
+
+msgctxt "selection:stock.location,type:"
+msgid "View"
+msgstr "视图"
+
+msgctxt "selection:stock.location,type:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "selection:stock.move,state:"
+msgid "Assigned"
+msgstr "已选货"
+
+msgctxt "selection:stock.move,state:"
+msgid "Cancelled"
+msgstr "已取消"
+
+msgctxt "selection:stock.move,state:"
+msgid "Done"
+msgstr "已完成"
+
+msgctxt "selection:stock.move,state:"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "selection:stock.move,state:"
+msgid "Staging"
+msgstr "正在进行"
+
+msgctxt "selection:stock.period,state:"
+msgid "Closed"
+msgstr "关闭"
+
+msgctxt "selection:stock.period,state:"
+msgid "Draft"
+msgstr "草稿"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Product"
+msgstr "产品"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse,product:"
+msgid "Variant"
+msgstr "变体"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Product"
+msgstr "产品"
+
+#, fuzzy
+msgctxt "selection:stock.product_quantities_warehouse.move,product:"
+msgid "Variant"
+msgstr "变体"
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Day"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Month"
+msgstr ""
+
+msgctxt "selection:stock.reporting.margin.context,period:"
+msgid "Year"
+msgstr ""
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Cancelled"
+msgstr "已取消"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Draft"
+msgstr "草稿"
+
+msgctxt "selection:stock.shipment.in,state:"
+msgid "Received"
+msgstr "已接收"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Assigned"
+msgstr "已选货"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Cancelled"
+msgstr "已取消"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Done"
+msgstr "已完成"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Draft"
+msgstr "草稿"
+
+msgctxt "selection:stock.shipment.in.return,state:"
+msgid "Waiting"
+msgstr "正在等待"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Assigned"
+msgstr "已选货"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Cancelled"
+msgstr "已取消"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Draft"
+msgstr "草案"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Request"
+msgstr "申请"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Shipped"
+msgstr "已发货"
+
+msgctxt "selection:stock.shipment.internal,state:"
+msgid "Waiting"
+msgstr "正在等待"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Assigned"
+msgstr "已选货"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Cancelled"
+msgstr "已取消"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Draft"
+msgstr "草稿"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Packed"
+msgstr "已包装"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Picked"
+msgstr "已拣货"
+
+msgctxt "selection:stock.shipment.out,state:"
+msgid "Waiting"
+msgstr "正在等待"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Cancelled"
+msgstr "已取消"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Done"
+msgstr "完成"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Draft"
+msgstr "草稿"
+
+msgctxt "selection:stock.shipment.out.return,state:"
+msgid "Received"
+msgstr "已收货"
+
+msgctxt "view:party.party:"
+msgid "Stock"
+msgstr "库存"
+
+msgctxt "view:res.user:"
+msgid "The warehouse that you work at."
+msgstr "你工作的仓库."
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Return Sequence"
+msgstr "接收客户退货序列"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Customer Sequence"
+msgstr "向客户发货序列"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Sequence"
+msgstr "内部发货序列"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Internal Transit"
+msgstr "内部数量"
+
+msgctxt "view:stock.configuration:"
+msgid "Inventory"
+msgstr "库存盘点"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "序列"
+
+msgctxt "view:stock.configuration:"
+msgid "Shipments"
+msgstr "收发货"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Return Sequence"
+msgstr "向供应商退货序列"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Supplier Sequence"
+msgstr "从供应商收货序列"
+
+msgctxt "view:stock.move:"
+msgid "Cost"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Move"
+msgstr "变动"
+
+#, fuzzy
+msgctxt "view:stock.move:"
+msgid "Other Info"
+msgstr "其它信息"
+
+msgctxt "view:stock.products_by_locations:"
+msgid "Cost Value"
+msgstr "成本取值"
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.category.tree:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main.time_series:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "%"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Cost"
+msgstr ""
+
+msgctxt "view:stock.reporting.margin.main:"
+msgid "Revenue"
+msgstr ""
+
+msgctxt "view:stock.shipment.assign.partial:"
+msgid "Unable to assign these products:"
+msgstr "无法选定这些产品:"
+
+msgctxt "view:stock.shipment.in.return:"
+msgid "Other Info"
+msgstr "其它信息"
+
+msgctxt "view:stock.shipment.in:"
+msgid "Other Info"
+msgstr "其它信息"
+
+msgctxt "view:stock.shipment.internal:"
+msgid "Other Info"
+msgstr "其它信息"
+
+msgctxt "view:stock.shipment.out.return:"
+msgid "Other Info"
+msgstr "其它信息"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Other Info"
+msgstr "其它信息"
+
+msgctxt "view:stock.shipment.out:"
+msgid "Outgoing Moves"
+msgstr "出货库存变动"
+
+msgctxt "wizard_button:product.modify_cost_price,start,end:"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "wizard_button:product.modify_cost_price,start,modify:"
+msgid "OK"
+msgstr "确定"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,end:"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "wizard_button:product.recompute_cost_price,start,recompute:"
+msgid "Recompute"
+msgstr "重新计算"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,add:"
+msgid "Add"
+msgstr "添加"
+
+msgctxt "wizard_button:stock.inventory.count,quantity,search:"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "wizard_button:stock.inventory.count,search,end:"
+msgid "End"
+msgstr "结束"
+
+msgctxt "wizard_button:stock.inventory.count,search,quantity:"
+msgid "Select"
+msgstr "选择"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,cancel:"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,end:"
+msgid "Wait"
+msgstr "等待"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,force:"
+msgid "Force"
+msgstr "强制"
+
+msgctxt "wizard_button:stock.shipment.assign,partial,ignore:"
+msgid "Ignore"
+msgstr "忽略"
diff --git a/modules/stock/location.py b/modules/stock/location.py
new file mode 100644
index 0000000000..2439190722
--- /dev/null
+++ b/modules/stock/location.py
@@ -0,0 +1,762 @@
+# 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 operator
+from decimal import Decimal
+
+from sql import Column
+
+from trytond.cache import Cache
+from trytond.i18n import gettext
+from trytond.model import (
+ DeactivableMixin, Index, MatchMixin, Model, ModelSQL, ModelView, fields,
+ sequence_ordered, tree)
+from trytond.modules.product import price_digits, round_price
+from trytond.pool import Pool
+from trytond.pyson import Eval, If, TimeDelta
+from trytond.tools import grouped_slice
+from trytond.transaction import Transaction
+
+from .exceptions import LocationValidationError
+
+
+class WarehouseWasteLocation(ModelSQL):
+ "Warehouse Waste Location"
+ __name__ = 'stock.location.waste'
+
+ warehouse = fields.Many2One(
+ 'stock.location', "Warehouse", required=True, ondelete='CASCADE',
+ domain=[('type', '=', 'warehouse')])
+ location = fields.Many2One(
+ 'stock.location', "Waste Location", required=True, ondelete='CASCADE',
+ domain=[('type', '=', 'lost_found')])
+
+
+class Location(DeactivableMixin, tree(), ModelSQL, ModelView):
+ "Stock Location"
+ __name__ = 'stock.location'
+ _default_warehouse_cache = Cache('stock.location.default_warehouse',
+ context=False)
+
+ name = fields.Char("Name", size=None, required=True, translate=True)
+ code = fields.Char(
+ "Code",
+ help="The internal identifier used for the location.")
+ address = fields.Many2One(
+ 'party.address', "Address",
+ states={
+ 'invisible': Eval('type') != 'warehouse',
+ })
+ type = fields.Selection([
+ ('supplier', 'Supplier'),
+ ('customer', 'Customer'),
+ ('lost_found', 'Lost and Found'),
+ ('warehouse', 'Warehouse'),
+ ('storage', 'Storage'),
+ ('production', 'Production'),
+ ('drop', 'Drop'),
+ ('view', 'View'),
+ ], "Location type")
+ type_string = type.translated('type')
+ parent = fields.Many2One(
+ "stock.location", "Parent",
+ left="left", right="right",
+ help="Used to add structure above the location.")
+ left = fields.Integer('Left', required=True)
+ right = fields.Integer('Right', required=True)
+ childs = fields.One2Many("stock.location", "parent", "Children",
+ help="Used to add structure below the location.")
+ flat_childs = fields.Boolean(
+ "Flat Children",
+ help="Check to enforce a single level of children with no "
+ "grandchildren.")
+ warehouse = fields.Function(fields.Many2One('stock.location', 'Warehouse'),
+ 'get_warehouse')
+ input_location = fields.Many2One(
+ "stock.location", "Input", states={
+ 'invisible': Eval('type') != 'warehouse',
+ 'required': Eval('type') == 'warehouse',
+ },
+ domain=[
+ ('type', '=', 'storage'),
+ ['OR',
+ ('parent', 'child_of', [Eval('id', -1)]),
+ ('parent', '=', None),
+ ],
+ ],
+ help="Where incoming stock is received.")
+ output_location = fields.Many2One(
+ "stock.location", "Output", states={
+ 'invisible': Eval('type') != 'warehouse',
+ 'required': Eval('type') == 'warehouse',
+ },
+ domain=[
+ ('type', '=', 'storage'),
+ ['OR',
+ ('parent', 'child_of', [Eval('id', -1)]),
+ ('parent', '=', None)]],
+ help="Where outgoing stock is sent from.")
+ storage_location = fields.Many2One(
+ "stock.location", "Storage", states={
+ 'invisible': Eval('type') != 'warehouse',
+ 'required': Eval('type') == 'warehouse',
+ },
+ domain=[
+ ('type', 'in', ['storage', 'view']),
+ ['OR',
+ ('parent', 'child_of', [Eval('id', -1)]),
+ ('parent', '=', None)]],
+ help="The top level location where stock is stored.")
+ picking_location = fields.Many2One(
+ 'stock.location', 'Picking', states={
+ 'invisible': Eval('type') != 'warehouse',
+ },
+ domain=[
+ ('type', '=', 'storage'),
+ ('parent', 'child_of', [Eval('storage_location', -1)]),
+ ],
+ help="Where stock is picked from.\n"
+ "Leave empty to use the storage location.")
+ lost_found_location = fields.Many2One(
+ 'stock.location', "Lost and Found",
+ states={
+ 'invisible': Eval('type') != 'warehouse',
+ },
+ domain=[
+ ('type', '=', 'lost_found'),
+ ],
+ help="Used, by inventories, when correcting stock levels "
+ "in the warehouse.")
+ waste_locations = fields.Many2Many(
+ 'stock.location.waste', 'warehouse', 'location', "Waste Locations",
+ states={
+ 'invisible': Eval('type') != 'warehouse',
+ },
+ domain=[
+ ('type', '=', 'lost_found'),
+ ],
+ help="The locations used for waste products from the warehouse.")
+ waste_warehouses = fields.Many2Many(
+ 'stock.location.waste', 'location', 'warehouse', "Waste Warehouses",
+ states={
+ 'invisible': Eval('type') != 'lost_found',
+ },
+ domain=[
+ ('type', '=', 'warehouse'),
+ ],
+ help="The warehouses that use the location for waste products.")
+
+ allow_pickup = fields.Boolean(
+ "Allow Pickup",
+ states={
+ 'invisible': (
+ (Eval('type') != 'warehouse')
+ & ~Eval('address')),
+ })
+
+ quantity = fields.Function(
+ fields.Float(
+ "Quantity", digits=(16, Eval('quantity_uom_digits', 2)),
+ help="The amount of stock in the location."),
+ 'get_quantity', searcher='search_quantity')
+ forecast_quantity = fields.Function(
+ fields.Float(
+ "Forecast Quantity", digits=(16, Eval('quantity_uom_digits', 2)),
+ help="The amount of stock expected to be in the location."),
+ 'get_quantity', searcher='search_quantity')
+ quantity_uom = fields.Function(fields.Many2One(
+ 'product.uom', "Quantity UOM"),
+ 'get_quantity_uom')
+ quantity_uom_digits = fields.Function(fields.Integer(
+ "Quantity UOM Digits"),
+ 'get_quantity_uom')
+ cost_value = fields.Function(fields.Numeric(
+ "Cost Value", digits=price_digits,
+ help="The value of the stock in the location."),
+ 'get_cost_value')
+
+ @classmethod
+ def __setup__(cls):
+ cls.code.search_unaccented = False
+ super(Location, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.update({
+ Index(t, (t.code, Index.Similarity())),
+ Index(
+ t,
+ (t.left, Index.Range()),
+ (t.right, Index.Range())),
+ })
+ cls._order.insert(0, ('name', 'ASC'))
+
+ parent_domain = [
+ ['OR',
+ ('parent.flat_childs', '=', False),
+ ('parent', '=', None),
+ ]
+ ]
+ childs_domain = [
+ If(Eval('flat_childs', False),
+ ('childs', '=', None),
+ ()),
+ ]
+ childs_mapping = cls._childs_domain()
+ for type_, allowed_parents in cls._parent_domain().items():
+ parent_domain.append(If(Eval('type') == type_,
+ ('type', 'in', allowed_parents), ()))
+ childs_domain.append(If(Eval('type') == type_,
+ ('type', 'in', childs_mapping[type_]), ()))
+ cls.parent.domain = parent_domain
+ cls.childs.domain = childs_domain
+
+ @classmethod
+ def _parent_domain(cls):
+ '''Returns a dict with location types as keys and a list of allowed
+ parent location types as values'''
+ return {
+ 'customer': ['customer'],
+ 'supplier': ['supplier'],
+ 'production': ['production'],
+ 'lost_found': ['lost_found'],
+ 'view': ['warehouse', 'view', 'storage'],
+ 'storage': ['warehouse', 'view', 'storage'],
+ 'warehouse': ['view'],
+ }
+
+ @classmethod
+ def _childs_domain(cls):
+ childs_domain = {}
+ for type_, allowed_parents in cls._parent_domain().items():
+ for parent in allowed_parents:
+ childs_domain.setdefault(parent, [])
+ childs_domain[parent].append(type_)
+ return childs_domain
+
+ @classmethod
+ def validate_fields(cls, locations, field_names):
+ super().validate_fields(locations, field_names)
+ inactives = []
+ for location in locations:
+ location.check_type_for_moves(field_names)
+ if 'active' in field_names and not location.active:
+ inactives.append(location)
+ cls.check_inactive(inactives)
+
+ def check_type_for_moves(self, field_names=None):
+ """ Check locations with moves have types compatible with moves. """
+ pool = Pool()
+ Move = pool.get('stock.move')
+ if field_names and 'type' not in field_names:
+ return
+ invalid_move_types = ['warehouse', 'view']
+ if self.type in invalid_move_types:
+ # Use root to compute for all companies
+ with Transaction().set_user(0):
+ moves = Move.search([
+ ['OR',
+ ('to_location', '=', self.id),
+ ('from_location', '=', self.id),
+ ],
+ ('state', 'not in', ['staging', 'draft']),
+ ],
+ order=[], limit=1)
+ if moves:
+ raise LocationValidationError(
+ gettext('stock.msg_location_invalid_type_for_moves',
+ location=self.rec_name,
+ type=self.type_string))
+
+ @classmethod
+ def check_inactive(cls, locations):
+ "Check inactive location are empty"
+ assert all(not l.active for l in locations)
+ empty = cls.get_empty_locations(locations)
+ non_empty = set(locations) - set(empty)
+ if non_empty:
+ raise LocationValidationError(
+ gettext('stock.msg_location_inactive_not_empty',
+ location=next(iter(non_empty)).rec_name))
+
+ @classmethod
+ def get_empty_locations(cls, locations=None):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Product = pool.get('product.product')
+ if locations is None:
+ locations = cls.search([])
+ if not locations:
+ return []
+ location_ids = list(map(int, locations))
+ # Use root to compute for all companies
+ # and ensures inactive locations are in the query
+ with Transaction().set_user(0), \
+ Transaction().set_context(active_test=False):
+ query = Move.compute_quantities_query(
+ location_ids, with_childs=True)
+ quantities = Move.compute_quantities(
+ query, location_ids, with_childs=True)
+ empty = set(location_ids)
+ product_ids = [q[1] for q in quantities.keys()]
+ consumables = {
+ p.id for p in Product.browse(product_ids) if p.consumable}
+ for (location_id, product), quantity in quantities.items():
+ if quantity and product not in consumables:
+ empty.discard(location_id)
+ for sub_ids in grouped_slice(list(empty)):
+ sub_ids = list(sub_ids)
+ moves = Move.search([
+ ('state', 'not in', ['done', 'cancelled']),
+ ['OR',
+ ('from_location', 'in', sub_ids),
+ ('to_location', 'in', sub_ids),
+ ],
+ ])
+ for move in moves:
+ for location in [move.from_location, move.to_location]:
+ empty.discard(location.id)
+ return cls.browse(empty)
+
+ @staticmethod
+ def default_left():
+ return 0
+
+ @staticmethod
+ def default_right():
+ return 0
+
+ @classmethod
+ def default_flat_childs(cls):
+ return False
+
+ @staticmethod
+ def default_type():
+ return 'storage'
+
+ @classmethod
+ def check_xml_record(cls, records, values):
+ return True
+
+ def get_warehouse(self, name):
+ # Order by descending left to get the first one in the tree
+ with Transaction().set_context(active_test=False):
+ locations = self.search([
+ ('parent', 'parent_of', [self.id]),
+ ('type', '=', 'warehouse'),
+ ], order=[('left', 'DESC')])
+ if locations:
+ return locations[0].id
+
+ @classmethod
+ def get_default_warehouse(cls):
+ warehouse = Transaction().context.get('warehouse')
+ if warehouse:
+ return warehouse
+
+ warehouse = cls._default_warehouse_cache.get(None, -1)
+ if warehouse == -1:
+ warehouses = cls.search([
+ ('type', '=', 'warehouse'),
+ ], limit=2)
+ if len(warehouses) == 1:
+ warehouse = warehouses[0].id
+ else:
+ warehouse = None
+ cls._default_warehouse_cache.set(None, warehouse)
+ return warehouse
+
+ @property
+ def lost_found_used(self):
+ if self.warehouse:
+ return self.warehouse.lost_found_location
+
+ @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:]),
+ ('code',) + tuple(clause[1:]),
+ ]
+
+ @classmethod
+ def _get_quantity_grouping(cls):
+ context = Transaction().context
+ grouping, grouping_filter, key = (), (), []
+ if context.get('product') is not None:
+ grouping = ('product',)
+ grouping_filter = ([context['product']],)
+ key = (context['product'],)
+ elif context.get('product_template') is not None:
+ grouping = ('product.template',)
+ grouping_filter = ([context['product_template']],)
+ key = (context['product_template'],)
+ return grouping, grouping_filter, key
+
+ @classmethod
+ def get_quantity(cls, locations, name):
+ pool = Pool()
+ Product = pool.get('product.product')
+ Date_ = pool.get('ir.date')
+ trans_context = Transaction().context
+
+ def valid_context(name):
+ return (trans_context.get(name) is not None
+ and isinstance(trans_context[name], int))
+
+ context = {}
+ if (name == 'quantity'
+ and (trans_context.get('stock_date_end', datetime.date.max)
+ > Date_.today())):
+ context['stock_date_end'] = Date_.today()
+
+ if name == 'forecast_quantity':
+ context['forecast'] = True
+ if not trans_context.get('stock_date_end'):
+ context['stock_date_end'] = datetime.date.max
+
+ grouping, grouping_filter, key = cls._get_quantity_grouping()
+ if not grouping:
+ return {loc.id: None for loc in locations}
+
+ pbl = {}
+ for sub_locations in grouped_slice(locations):
+ location_ids = [l.id for l in sub_locations]
+ with Transaction().set_context(context):
+ pbl.update(Product.products_by_location(
+ location_ids,
+ grouping=grouping,
+ grouping_filter=grouping_filter,
+ with_childs=trans_context.get('with_childs', True)))
+
+ return dict((loc.id, pbl.get((loc.id,) + key, 0)) for loc in locations)
+
+ @classmethod
+ def search_quantity(cls, name, domain):
+ _, operator_, operand = domain
+ operator_ = {
+ '=': operator.eq,
+ '>=': operator.ge,
+ '>': operator.gt,
+ '<=': operator.le,
+ '<': operator.lt,
+ '!=': operator.ne,
+ 'in': lambda v, l: v in l,
+ 'not in': lambda v, l: v not in l,
+ }.get(operator_, lambda v, l: False)
+
+ ids = []
+ for location in cls.search([]):
+ if operator_(getattr(location, name), operand):
+ ids.append(location.id)
+ return [('id', 'in', ids)]
+
+ @classmethod
+ def get_quantity_uom(cls, locations, name):
+ pool = Pool()
+ Product = pool.get('product.product')
+ Template = pool.get('product.template')
+ context = Transaction().context
+ value = None
+ uom = None
+ if context.get('product') is not None:
+ product = Product(context['product'])
+ uom = product.default_uom
+ elif context.get('product_template') is not None:
+ template = Template(context['product_template'])
+ uom = template.default_uom
+ if uom:
+ if name == 'quantity_uom':
+ value = uom.id
+ elif name == 'quantity_uom_digits':
+ value = uom.digits
+ return {l.id: value for l in locations}
+
+ @classmethod
+ def get_cost_value(cls, locations, name):
+ pool = Pool()
+ Product = pool.get('product.product')
+ Template = pool.get('product.template')
+ trans_context = Transaction().context
+ cost_values = {l.id: None for l in locations}
+
+ def valid_context(name):
+ return (trans_context.get(name) is not None
+ and isinstance(trans_context[name], int))
+
+ if not any(map(valid_context, ['product', 'product_template'])):
+ return cost_values
+
+ def get_record():
+ if trans_context.get('product') is not None:
+ return Product(trans_context['product'])
+ else:
+ return Template(trans_context['product_template'])
+
+ context = {}
+ if 'stock_date_end' in trans_context:
+ # Use the last cost_price of the day
+ context['_datetime'] = datetime.datetime.combine(
+ trans_context['stock_date_end'], datetime.time.max)
+ # The date could be before the product creation
+ record = get_record()
+ if record.create_date > context['_datetime']:
+ return cost_values
+ with Transaction().set_context(context):
+ cost_price = get_record().cost_price
+ # The template may have more than one product
+ if cost_price is not None:
+ for location in locations:
+ cost_values[location.id] = round_price(
+ Decimal(str(location.quantity)) * cost_price)
+ return cost_values
+
+ @classmethod
+ def _set_warehouse_parent(cls, locations):
+ '''
+ Set the parent of child location of warehouse if not set
+ '''
+ to_update = set()
+ to_save = []
+ for location in locations:
+ if location.type == 'warehouse':
+ if not location.input_location.parent:
+ to_update.add(location.input_location)
+ if not location.output_location.parent:
+ to_update.add(location.output_location)
+ if not location.storage_location.parent:
+ to_update.add(location.storage_location)
+ if to_update:
+ for child_location in to_update:
+ child_location.parent = location
+ to_save.append(child_location)
+ to_update.clear()
+ cls.save(to_save)
+
+ @classmethod
+ def create(cls, vlist):
+ locations = super(Location, cls).create(vlist)
+ cls._set_warehouse_parent(locations)
+ cls._default_warehouse_cache.clear()
+ return locations
+
+ @classmethod
+ def write(cls, *args):
+ super(Location, cls).write(*args)
+ locations = sum(args[::2], [])
+ cls._set_warehouse_parent(locations)
+ cls._default_warehouse_cache.clear()
+
+ ids = [l.id for l in locations]
+ warehouses = cls.search([
+ ('type', '=', 'warehouse'),
+ ['OR',
+ ('storage_location', 'in', ids),
+ ('input_location', 'in', ids),
+ ('output_location', 'in', ids),
+ ]])
+
+ fields = ('storage_location', 'input_location', 'output_location')
+ wh2childs = {}
+ for warehouse in warehouses:
+ in_out_sto = (getattr(warehouse, f).id for f in fields)
+ for location in locations:
+ if location.id not in in_out_sto:
+ continue
+ childs = wh2childs.setdefault(warehouse.id, cls.search([
+ ('parent', 'child_of', warehouse.id),
+ ]))
+ if location not in childs:
+ raise LocationValidationError(
+ gettext('stock.msg_location_child_of_warehouse',
+ location=location.rec_name,
+ warehouse=warehouse.rec_name))
+
+ @classmethod
+ def delete(cls, *args):
+ super().delete(*args)
+ cls._default_warehouse_cache.clear()
+
+ @classmethod
+ def copy(cls, locations, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+
+ res = []
+ for location in locations:
+ if location.type == 'warehouse':
+
+ wh_default = default.copy()
+ wh_default['type'] = 'view'
+ wh_default['input_location'] = None
+ wh_default['output_location'] = None
+ wh_default['storage_location'] = None
+ wh_default['childs'] = None
+
+ new_location, = super(Location, cls).copy([location],
+ default=wh_default)
+
+ with Transaction().set_context(
+ cp_warehouse_locations={
+ 'input_location': location.input_location.id,
+ 'output_location': location.output_location.id,
+ 'storage_location': location.storage_location.id,
+ },
+ cp_warehouse_id=new_location.id):
+ cls.copy(location.childs,
+ default={'parent': new_location.id})
+ cls.write([new_location], {
+ 'type': 'warehouse',
+ })
+ else:
+ new_location, = super(Location, cls).copy([location],
+ default=default)
+ warehouse_locations = Transaction().context.get(
+ 'cp_warehouse_locations') or {}
+ if location.id in warehouse_locations.values():
+ cp_warehouse = cls(
+ Transaction().context['cp_warehouse_id'])
+ for field, loc_id in warehouse_locations.items():
+ if loc_id == location.id:
+ cls.write([cp_warehouse], {
+ field: new_location.id,
+ })
+
+ res.append(new_location)
+ return res
+
+ @classmethod
+ def view_attributes(cls):
+ storage_types = Eval('type').in_(['storage', 'warehouse', 'view'])
+ return super().view_attributes() + [
+ ('/tree/field[@name="quantity"]',
+ 'visual', If(
+ storage_types & (Eval('quantity', 0) < 0), 'danger', ''),
+ ['type']),
+ ('/tree/field[@name="forecast_quantity"]',
+ 'visual', If(
+ storage_types & (Eval('forecast_quantity', 0) < 0),
+ 'warning', ''),
+ ['type']),
+ ]
+
+
+class ProductsByLocationsContext(ModelView):
+ 'Products by Locations'
+ __name__ = 'stock.products_by_locations.context'
+ forecast_date = fields.Date(
+ 'At Date',
+ help="The date for which the stock quantity is calculated.\n"
+ "* An empty value calculates as far ahead as possible.\n"
+ "* A date in the past will provide historical values.")
+ stock_date_end = fields.Function(fields.Date('At Date'),
+ 'on_change_with_stock_date_end')
+
+ @staticmethod
+ def default_forecast_date():
+ Date_ = Pool().get('ir.date')
+ return Date_.today()
+
+ @fields.depends('forecast_date')
+ def on_change_with_stock_date_end(self, name=None):
+ if self.forecast_date is None:
+ return datetime.date.max
+ return self.forecast_date
+
+
+class ProductsByLocations(DeactivableMixin, ModelSQL, ModelView):
+ "Products by Locations"
+ __name__ = 'stock.products_by_locations'
+
+ product = fields.Many2One('product.product', "Product")
+ quantity = fields.Function(
+ fields.Float(
+ "Quantity", digits=(16, Eval('default_uom_digits', 2))),
+ 'get_product', searcher='search_product')
+ forecast_quantity = fields.Function(
+ fields.Float(
+ "Forecast Quantity", digits=(16, Eval('default_uom_digits', 2))),
+ 'get_product', searcher='search_product')
+ default_uom = fields.Function(
+ fields.Many2One('product.uom', "Default UOM"),
+ 'get_product', searcher='search_product')
+ default_uom_digits = fields.Function(
+ fields.Integer("Default UOM Digits"), 'get_product')
+ cost_value = fields.Function(
+ fields.Numeric("Cost Value"), 'get_product')
+ consumable = fields.Function(
+ fields.Boolean("Consumable"), 'get_product',
+ searcher='search_product')
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._order.insert(0, ('product', 'ASC'))
+
+ @classmethod
+ def table_query(cls):
+ pool = Pool()
+ Product = pool.get('product.product')
+ product = Product.__table__()
+ columns = []
+ for fname, field in cls._fields.items():
+ if not hasattr(field, 'set'):
+ if (isinstance(field, fields.Many2One)
+ and field.get_target() == Product):
+ column = Column(product, 'id')
+ else:
+ column = Column(product, fname)
+ columns.append(column.as_(fname))
+ return product.select(*columns)
+
+ 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:])]
+
+ def get_product(self, name):
+ value = getattr(self.product, name)
+ if isinstance(value, Model):
+ value = value.id
+ return value
+
+ @classmethod
+ def search_product(cls, name, clause):
+ nested = clause[0][len(name):]
+ return [('product.' + name + nested, *clause[1:])]
+
+
+class LocationLeadTime(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
+ 'Location Lead Time'
+ __name__ = 'stock.location.lead_time'
+
+ warehouse_from = fields.Many2One('stock.location', 'Warehouse From',
+ ondelete='CASCADE',
+ domain=[
+ ('type', '=', 'warehouse'),
+ ('id', '!=', Eval('warehouse_to', -1)),
+ ])
+ warehouse_to = fields.Many2One('stock.location', 'Warehouse To',
+ ondelete='CASCADE',
+ domain=[
+ ('type', '=', 'warehouse'),
+ ('id', '!=', Eval('warehouse_from', -1)),
+ ])
+ lead_time = fields.TimeDelta(
+ "Lead Time",
+ domain=['OR',
+ ('lead_time', '=', None),
+ ('lead_time', '>=', TimeDelta()),
+ ],
+ help="The time it takes to move stock between the warehouses.")
+
+ @classmethod
+ def get_lead_time(cls, pattern):
+ for record in cls.search([]):
+ if record.match(pattern):
+ return record.lead_time
diff --git a/modules/stock/location.xml b/modules/stock/location.xml
new file mode 100644
index 0000000000..92b8272ed6
--- /dev/null
+++ b/modules/stock/location.xml
@@ -0,0 +1,227 @@
+
+
+
+
+
+ stock.location
+ form
+ location_form
+
+
+ stock.location
+ tree
+
+ childs
+ location_tree
+
+
+ stock.location
+ tree
+
+ location_list
+
+
+
+ Locations
+ stock.location
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Locations
+ stock.location
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.products_by_locations.context
+ form
+ products_by_locations_context_form
+
+
+
+ stock.products_by_locations
+ tree
+ products_by_locations_list
+
+
+
+ Products by Locations
+ stock.products_by_locations
+
+
+
+ stock.products_by_locations.context
+
+
+
+
+
+
+
+ tree_open
+ stock.location,-1
+
+
+
+ form_relate
+ stock.location,-1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.location.lead_time
+ tree
+ location_lead_time_list
+
+
+
+ stock.location.lead_time
+ form
+ location_lead_time_form
+
+
+
+ Location Lead Times
+ stock.location.lead_time
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Input Zone
+ IN
+ storage
+
+
+ Output Zone
+ OUT
+ storage
+
+
+ Storage Zone
+ STO
+ storage
+
+
+ Lost and Found
+ lost_found
+
+
+ Warehouse
+ WH
+ warehouse
+
+
+
+
+
+
+ Supplier
+ SUP
+ supplier
+
+
+ Customer
+ CUS
+ customer
+
+
+ Transit
+ storage
+
+
+
diff --git a/modules/stock/message.xml b/modules/stock/message.xml
new file mode 100644
index 0000000000..ac05419240
--- /dev/null
+++ b/modules/stock/message.xml
@@ -0,0 +1,129 @@
+
+
+
+
+
+ You cannot change the default UOM of a product which is associated with stock moves.
+
+
+ You cannot change the type of a product which is associated with stock moves.
+
+
+ You cannot change the cost price of a product which is associated with stock moves.
+You must use the "Modify Cost Price" wizard.
+
+
+ Invalid cost price "%(cost_price)s" for product "%(product)s" with exception "%(exception)s".
+
+
+ You cannot change the type of location "%(location)s" to "%(type)s"
+because the type does not support moves and location has existing moves.
+
+
+ To set location "%(location)s" as storage/input/output of warehouse "%(warehouse)s", it must be in the warehouse.
+
+
+ To inactivate location "%(location)s", you must empty it.
+
+
+ You cannot close periods with a date in the future or today.
+
+
+ You cannot close periods with assigned moves in it.
+
+
+ To pack shipment "%(shipment)s" you must do the inventory moves.
+
+
+ To delete shipment "%(shipment)s" you must cancel it.
+
+
+ To delete inventory "%(inventory)s" you must cancel it.
+
+
+ To confirm the inventory "%(inventory)s" you must select an option for empty quantity.
+
+
+ To confirm the inventory "%(inventory)s" you must set a lost and found on a parent of location "%(location)s".
+
+
+ Inventory line "%(line)s" is not unique on inventory "%(inventory)s".
+
+
+ Inventory line quantity must be positive.
+
+
+ To delete inventory line "%(line)s" you must cancel inventory "%(inventory)s".
+
+
+ No existing line found for "%(search)s".
+
+
+ You cannot erase party "%(party)s" while they have pending shipments with company "%(company)s".
+
+
+ To delete stock move "%(move)s" you must cancel it or reset its state to draft.
+
+
+ To modify stock move "%(move)s" you must reopen period "%(period)s".
+
+
+ To modify stock move "%(move)s" you must reset its state to draft.
+
+
+ You cannot modify stock move "%(move)s" because it is done.
+
+
+ You cannot modify stock move "%(move)s" because it is cancelled.
+
+
+ Stock moves "%(moves)s" have no origin.
+
+
+ Move quantity must be positive.
+
+
+ Internal move quantity must be positive.
+
+
+ The source and destination of stock move must be different.
+
+
+ The moves "%(moves)s" have effective dates in the future.
+
+
+ The inventories "%(inventories)s" have dates in the future.
+
+
+ Company
+
+
+ Number
+
+
+ Cost
+
+
+ Revenue
+
+
+ Profit
+
+
+ Margin
+
+
+ Margin Trend
+
+
+ Currency
+
+
+ The product "%(product)s" has still some quantities in locations "%(locations)s" for company "%(company)s".
+
+
+ It is recommended to clear the stock from the storage locations before deactivating the product.
+
+
+
diff --git a/modules/stock/move.py b/modules/stock/move.py
new file mode 100644
index 0000000000..c5df81eca7
--- /dev/null
+++ b/modules/stock/move.py
@@ -0,0 +1,1652 @@
+# 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 datetime
+import operator
+from collections import OrderedDict, defaultdict
+from decimal import Decimal
+from itertools import groupby
+
+from sql import Column, For, Literal, Null, Union
+from sql.aggregate import Max, Sum
+from sql.conditionals import Case, Coalesce
+from sql.functions import Round
+
+from trytond.i18n import gettext
+from trytond.model import (
+ Check, Index, Model, ModelSQL, ModelView, Workflow, fields)
+from trytond.model.exceptions import AccessError
+from trytond.modules.product import price_digits, round_price
+from trytond.pool import Pool
+from trytond.pyson import Bool, Eval, If
+from trytond.tools import grouped_slice, reduce_ids
+from trytond.transaction import Transaction
+
+from .exceptions import MoveFutureWarning, MoveOriginWarning
+
+STATES = {
+ 'readonly': Eval('state').in_(['cancelled', 'assigned', 'done']),
+}
+LOCATION_DOMAIN = [
+ If(Eval('state').in_(['staging', 'draft', 'cancelled']),
+ ('type', 'not in', ['warehouse']),
+ ('type', 'not in', ['warehouse', 'view'])),
+ If(~Eval('state').in_(['done', 'cancelled']),
+ ('active', '=', True),
+ ()),
+ ]
+
+
+class StockMixin(object):
+ '''Mixin class with helper to setup stock quantity field.'''
+ __slots__ = ()
+
+ @classmethod
+ def _quantity_context(cls, name):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ today = Date.today()
+ context = Transaction().context
+ new_context = {}
+ stock_date_end = context.get('stock_date_end')
+ if name == 'quantity':
+ new_context['forecast'] = False
+ if (stock_date_end or datetime.date.max) > today:
+ new_context['stock_date_end'] = today
+ elif name == 'forecast_quantity':
+ new_context['forecast'] = True
+ if not stock_date_end:
+ new_context['stock_date_end'] = datetime.date.max
+ return new_context
+
+ @classmethod
+ def _get_quantity(cls, records, name, location_ids,
+ grouping=('product',), grouping_filter=None, position=-1):
+ """
+ Compute for each record the stock quantity in the default uom of the
+ product.
+
+ location_ids is the list of IDs of locations to take account to compute
+ the stock.
+ grouping defines how stock moves are grouped.
+ grouping_filter is a tuple of values, for the Move's field at the same
+ position in grouping tuple, used to filter which moves are used to
+ compute quantities. If it is None all the products are used.
+ position defines which field of grouping corresponds to the record
+ whose quantity is computed.
+
+ Return a dictionary with records id as key and quantity as value.
+ """
+ pool = Pool()
+ Product = pool.get('product.product')
+
+ record_ids = [r.id for r in records]
+ quantities = dict.fromkeys(record_ids, 0.0)
+ if not location_ids:
+ return quantities
+
+ with_childs = Transaction().context.get(
+ 'with_childs', len(location_ids) == 1)
+
+ with Transaction().set_context(cls._quantity_context(name)):
+ pbl = Product.products_by_location(
+ location_ids,
+ with_childs=with_childs,
+ grouping=grouping,
+ grouping_filter=grouping_filter)
+
+ for key, quantity in pbl.items():
+ # pbl could return None in some keys
+ if (key[position] is not None
+ and key[position] in quantities):
+ quantities[key[position]] += quantity
+ return quantities
+
+ @classmethod
+ def _search_quantity(cls, name, location_ids, domain=None,
+ grouping=('product',), position=-1):
+ """
+ Compute the domain to filter records which validates the domain over
+ quantity field.
+
+ location_ids is the list of IDs of locations to take account to compute
+ the stock.
+ grouping defines how stock moves are grouped.
+ position defines which field of grouping corresponds to the record
+ whose quantity is computed.
+ """
+ pool = Pool()
+ Product = pool.get('product.product')
+ Move = pool.get('stock.move')
+ Uom = pool.get('product.uom')
+ uom = Uom.__table__()
+
+ if not location_ids or not domain:
+ return []
+ with_childs = Transaction().context.get(
+ 'with_childs', len(location_ids) == 1)
+ _, operator_, operand = domain
+
+ with Transaction().set_context(cls._quantity_context(name)):
+ if (len(location_ids) == 1
+ and not Transaction().context.get('stock_skip_warehouse')):
+ # We can use the compute quantities query if the request is for
+ # a single location because all the locations are children and
+ # so we can do a SUM.
+ Operator = fields.SQL_OPERATORS[operator_]
+ query = Move.compute_quantities_query(
+ location_ids, with_childs, grouping=grouping)
+ col_id = Column(query, grouping[position])
+ # We need to round the result to have same result as
+ # products_by_location but as we do not have the unit, we use
+ # the biggest digits of all unit as best approximation.
+ quantity = Round(
+ fields.Numeric('quantity').sql_cast(Sum(query.quantity)),
+ uom.select(Max(uom.digits)))
+ group_by = [Column(query, key).as_(key) for key in grouping]
+ return [('id', 'in', query.select(
+ col_id,
+ group_by=group_by,
+ having=Operator(quantity, operand)))]
+
+ pbl = Product.products_by_location(
+ location_ids, with_childs=with_childs, grouping=grouping)
+
+ operator_ = {
+ '=': operator.eq,
+ '>=': operator.ge,
+ '>': operator.gt,
+ '<=': operator.le,
+ '<': operator.lt,
+ '!=': operator.ne,
+ 'in': lambda v, l: v in l,
+ 'not in': lambda v, l: v not in l,
+ }.get(operator_, lambda v, l: False)
+ record_ids = []
+ for key, quantity in pbl.items():
+ if (quantity is not None and operand is not None
+ and operator_(quantity, operand)):
+ # pbl could return None in some keys
+ if key[position] is not None:
+ record_ids.append(key[position])
+
+ return [('id', 'in', record_ids)]
+
+
+class Move(Workflow, ModelSQL, ModelView):
+ "Stock Move"
+ __name__ = 'stock.move'
+ _order_name = 'product'
+ product = fields.Many2One(
+ 'product.product', "Product", required=True, states=STATES,
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'},
+ help="The product that the move is associated with.")
+ product_uom_category = fields.Function(
+ fields.Many2One('product.uom.category', 'Product Uom Category'),
+ 'on_change_with_product_uom_category')
+ uom = fields.Many2One("product.uom", "Uom", required=True,
+ states={
+ 'readonly': (Eval('state').in_(['cancelled', 'assigned', 'done'])
+ | Eval('unit_price')),
+ },
+ domain=[
+ If(~Eval('state').in_(['done', 'cancelled']),
+ ('category', '=', Eval('product_uom_category')),
+ ()),
+ ],
+ help="The unit in which the quantity is specified.")
+ quantity = fields.Float(
+ "Quantity", digits='uom', required=True,
+ states=STATES,
+ help="The amount of stock moved.")
+ internal_quantity = fields.Float('Internal Quantity', readonly=True,
+ required=True)
+ from_location = fields.Many2One(
+ 'stock.location', "From Location",
+ required=True, states=STATES,
+ domain=LOCATION_DOMAIN,
+ help="Where the stock is moved from.")
+ to_location = fields.Many2One(
+ 'stock.location', "To Location",
+ required=True, states=STATES,
+ domain=LOCATION_DOMAIN,
+ help="Where the stock is moved to.")
+ shipment = fields.Reference(
+ "Shipment", selection='get_shipment', readonly=True,
+ states={
+ 'invisible': ~Eval('shipment'),
+ },
+ help="Used to group several stock moves together.")
+ origin = fields.Reference(
+ "Origin", selection='get_origin',
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The source of the stock move.")
+ planned_date = fields.Date(
+ "Planned Date",
+ states={
+ 'readonly': (Eval('state').in_(['cancelled', 'assigned', 'done'])
+ | Eval('shipment'))
+ },
+ help="When the stock is expected to be moved.")
+ effective_date = fields.Date(
+ "Effective Date",
+ states={
+ 'required': Eval('state') == 'done',
+ 'readonly': (Eval('state').in_(['cancelled', 'done'])
+ | Eval('shipment')),
+ },
+ help="When the stock was actually moved.")
+ state = fields.Selection([
+ ('staging', 'Staging'),
+ ('draft', 'Draft'),
+ ('assigned', 'Assigned'),
+ ('done', 'Done'),
+ ('cancelled', 'Cancelled'),
+ ], "State", readonly=True, sort=False,
+ help="The current state of the stock move.")
+ company = fields.Many2One(
+ 'company.company', "Company", required=True,
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The company the stock move is associated with.")
+ unit_price = fields.Numeric('Unit Price', digits=price_digits,
+ states={
+ 'invisible': ~Eval('unit_price_required'),
+ 'required': Bool(Eval('unit_price_required')),
+ 'readonly': Eval('state') != 'draft',
+ })
+ unit_price_company = fields.Function(
+ fields.Numeric("Unit Price", digits=price_digits,
+ states={
+ 'invisible': ~Eval('unit_price_required'),
+ },
+ help="Unit price in company currency."),
+ 'get_unit_price_company')
+ unit_price_updated = fields.Boolean(
+ "Unit Price Updated", readonly=True,
+ states={
+ 'invisible': Eval('state') != 'done',
+ })
+ cost_price = fields.Numeric(
+ "Cost Price", digits=price_digits, readonly=True,
+ states={
+ 'invisible': ~Eval('cost_price_required'),
+ 'required': (
+ (Eval('state') == 'done')
+ & Eval('cost_price_required', False)),
+ })
+ currency = fields.Many2One('currency.currency', 'Currency',
+ states={
+ 'invisible': ~Eval('unit_price_required'),
+ 'required': Bool(Eval('unit_price_required')),
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The currency in which the unit price is specified.")
+ unit_price_required = fields.Function(
+ fields.Boolean('Unit Price Required'),
+ 'on_change_with_unit_price_required')
+ cost_price_required = fields.Function(
+ fields.Boolean("Cost Price Required"),
+ 'on_change_with_cost_price_required')
+ assignation_required = fields.Function(
+ fields.Boolean('Assignation Required'),
+ 'on_change_with_assignation_required',
+ searcher='search_assignation_required')
+
+ @classmethod
+ def __setup__(cls):
+ super(Move, cls).__setup__()
+ cls.product.domain = [
+ If(Bool(Eval('product_uom_category'))
+ & ~Eval('state').in_(['done', 'cancelled']),
+ ('default_uom_category', '=', Eval('product_uom_category')),
+ ()),
+ ('type', 'in', cls.get_product_types()),
+ ]
+ cls._deny_modify_assigned = set(['product', 'uom', 'quantity',
+ 'from_location', 'to_location', 'company'])
+ cls._deny_modify_done_cancel = (cls._deny_modify_assigned
+ | set(['planned_date', 'effective_date']))
+ cls._allow_modify_closed_period = {
+ 'cost_price', 'unit_price', 'unit_price_updated', 'currency'}
+
+ t = cls.__table__()
+ cls._sql_constraints += [
+ ('check_move_qty_pos', Check(t, t.quantity >= 0),
+ 'stock.msg_move_quantity_positive'),
+ ('check_move_internal_qty_pos',
+ Check(t, t.internal_quantity >= 0),
+ 'stock.msg_move_internal_quantity_positive'),
+ ('check_from_to_locations',
+ Check(t, t.from_location != t.to_location),
+ 'stock.msg_move_from_to_location'),
+ ]
+ cls._sql_indexes.update({
+ Index(
+ t,
+ (t.from_location, Index.Range()),
+ (t.product, Index.Range()),
+ (Coalesce(
+ t.effective_date,
+ t.planned_date,
+ datetime.date.max),
+ Index.Range())),
+ Index(
+ t,
+ (t.to_location, Index.Range()),
+ (t.product, Index.Range()),
+ (Coalesce(
+ t.effective_date,
+ t.planned_date,
+ datetime.date.max),
+ Index.Range())),
+ Index(
+ t,
+ (t.state, Index.Equality()),
+ where=t.state.in_(['staging', 'draft', 'assigned'])),
+ })
+ cls._order[0] = ('id', 'DESC')
+ cls._transitions |= set((
+ ('staging', 'draft'),
+ ('staging', 'cancelled'),
+ ('draft', 'assigned'),
+ ('draft', 'done'),
+ ('draft', 'cancelled'),
+ ('assigned', 'draft'),
+ ('assigned', 'done'),
+ ('assigned', 'cancelled'),
+ ('done', 'cancelled'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': ~Eval('state').in_(['draft', 'assigned']),
+ 'readonly': Eval('shipment'),
+ 'depends': ['state', 'shipment'],
+ },
+ 'draft': {
+ 'invisible': ~Eval('state').in_(['assigned']),
+ 'readonly': Eval('shipment'),
+ 'depends': ['state', 'shipment'],
+ },
+ 'do': {
+ 'invisible': ~Eval('state').in_(['draft', 'assigned']),
+ 'readonly': (Eval('shipment')
+ | (Eval('assignation_required', True)
+ & (Eval('state') == 'draft'))),
+ 'depends': ['state', 'assignation_required', 'shipment'],
+ },
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
+ cursor = Transaction().connection.cursor()
+ sql_table = cls.__table__()
+
+ super(Move, cls).__register__(module_name)
+
+ # Migration from 5.6: rename state cancel to cancelled
+ cursor.execute(*sql_table.update(
+ [sql_table.state], ['cancelled'],
+ where=sql_table.state == 'cancel'))
+
+ @classmethod
+ def get_product_types(cls):
+ return ['goods', 'assets']
+
+ @staticmethod
+ def default_planned_date():
+ return Transaction().context.get('planned_date')
+
+ @staticmethod
+ def default_state():
+ return 'draft'
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @classmethod
+ def default_unit_price_updated(cls):
+ return True
+
+ @fields.depends('product', 'uom')
+ def on_change_product(self):
+ if self.product:
+ if (not self.uom
+ or self.uom.category != self.product.default_uom.category):
+ self.uom = self.product.default_uom
+
+ @fields.depends('product')
+ def on_change_with_product_uom_category(self, name=None):
+ if self.product:
+ return self.product.default_uom_category.id
+
+ @classmethod
+ def get_unit_price_company(cls, moves, name):
+ pool = Pool()
+ Currency = pool.get('currency.currency')
+ Uom = pool.get('product.uom')
+ Date = pool.get('ir.date')
+ prices = {}
+ for company, c_moves in groupby(moves, key=lambda m: m.company):
+ with Transaction().set_context(company=company.id):
+ today = Date.today()
+ for move in c_moves:
+ if move.unit_price is not None:
+ date = move.effective_date or move.planned_date or today
+ with Transaction().set_context(date=date):
+ unit_price = Currency.compute(
+ move.currency, move.unit_price,
+ move.company.currency, round=False)
+ unit_price = Uom.compute_price(
+ move.uom, unit_price, move.product.default_uom)
+ prices[move.id] = round_price(unit_price)
+ else:
+ prices[move.id] = None
+ return prices
+
+ @fields.depends('from_location', 'to_location')
+ def on_change_with_unit_price_required(self, name=None):
+ from_type = self.from_location.type if self.from_location else None
+ to_type = self.to_location.type if self.to_location else None
+
+ if from_type == 'supplier' and to_type in {'storage', 'drop', 'view'}:
+ return True
+ if from_type == 'production' and to_type != 'lost_found':
+ return True
+ if from_type in {'storage', 'drop', 'view'} and to_type == 'customer':
+ return True
+ if from_type in {'storage', 'drop', 'view'} and to_type == 'supplier':
+ return True
+ if from_type == 'customer' and to_type in {'storage', 'drop', 'view'}:
+ return True
+ return False
+
+ @fields.depends('from_location', 'to_location')
+ def on_change_with_cost_price_required(self, name=None):
+ from_type = self.from_location.type if self.from_location else None
+ to_type = self.to_location.type if self.to_location else None
+ return ((from_type != 'storage' and to_type == 'storage')
+ or (from_type == 'storage' and to_type != 'storage')
+ or (from_type != 'drop' and to_type == 'drop')
+ or (from_type == 'drop' and to_type != 'drop'))
+
+ @fields.depends('from_location', 'quantity')
+ def on_change_with_assignation_required(self, name=None):
+ if self.from_location:
+ return (
+ self.quantity
+ and self.from_location.type in {'storage', 'view'})
+
+ @classmethod
+ def search_assignation_required(cls, name, clause):
+ operators = {
+ '=': 'in',
+ '!=': 'not in',
+ }
+ reverse = {
+ '=': '!=',
+ '!=': '=',
+ }
+ if clause[1] in operators:
+ if not clause[2]:
+ operator = reverse[clause[1]]
+ else:
+ operator = clause[1]
+ return [
+ ('quantity', '!=', 0),
+ ('from_location.type', operators[operator], [
+ 'storage', 'view']),
+ ]
+ else:
+ return []
+
+ @staticmethod
+ def _get_shipment():
+ 'Return list of Model names for shipment Reference'
+ return [
+ 'stock.shipment.in',
+ 'stock.shipment.out',
+ 'stock.shipment.out.return',
+ 'stock.shipment.in.return',
+ 'stock.shipment.internal',
+ ]
+
+ @classmethod
+ def get_shipment(cls):
+ IrModel = Pool().get('ir.model')
+ get_name = IrModel.get_name
+ models = cls._get_shipment()
+ return [(None, '')] + [(m, get_name(m)) for m in models]
+
+ @classmethod
+ def _get_origin(cls):
+ 'Return list of Model names for origin Reference'
+ return [cls.__name__, 'stock.inventory.line']
+
+ @classmethod
+ def get_origin(cls):
+ IrModel = Pool().get('ir.model')
+ get_name = IrModel.get_name
+ models = cls._get_origin()
+ return [(None, '')] + [(m, get_name(m)) for m in models]
+
+ @property
+ def origin_name(self):
+ return self.origin.rec_name if self.origin else None
+
+ @classmethod
+ def check_period_closed(cls, moves):
+ Period = Pool().get('stock.period')
+ with Transaction().set_context(_check_access=False):
+ for company, moves in groupby(moves, lambda m: m.company):
+ periods = Period.search([
+ ('state', '=', 'closed'),
+ ('company', '=', company.id),
+ ], order=[('date', 'DESC')], limit=1)
+ if periods:
+ period, = periods
+ for move in moves:
+ date = (move.effective_date if move.effective_date
+ else move.planned_date)
+ if date and date <= period.date:
+ raise AccessError(
+ gettext('stock.msg_move_modify_period_close',
+ move=move.rec_name,
+ period=period.rec_name))
+
+ def get_rec_name(self, name):
+ pool = Pool()
+ Lang = pool.get('ir.lang')
+ lang = Lang.get()
+ return (lang.format_number_symbol(
+ self.quantity, self.uom, digits=self.uom.digits)
+ + ' %s' % self.product.rec_name)
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return [('product.rec_name',) + tuple(clause[1:])]
+
+ def _compute_product_cost_price(self, direction, product_cost_price=None):
+ """
+ Update the cost price on the given product.
+ The direction must be "in" if incoming and "out" if outgoing.
+ """
+ pool = Pool()
+ Uom = pool.get('product.uom')
+
+ if direction == 'in':
+ quantity = self.quantity
+ elif direction == 'out':
+ quantity = -self.quantity
+ qty = Uom.compute_qty(self.uom, quantity, self.product.default_uom)
+
+ qty = Decimal(str(qty))
+ product_qty = Decimal(str(self.product.quantity))
+ unit_price = self.get_cost_price(product_cost_price=product_cost_price)
+ cost_price = self.product.get_multivalue(
+ 'cost_price', **self._cost_price_pattern)
+ if product_qty + qty > 0 and product_qty >= 0:
+ new_cost_price = (
+ (cost_price * product_qty) + (unit_price * qty)
+ ) / (product_qty + qty)
+ elif direction == 'in':
+ new_cost_price = unit_price
+ elif direction == 'out':
+ new_cost_price = cost_price
+ return round_price(new_cost_price)
+
+ @staticmethod
+ def _get_internal_quantity(quantity, uom, product):
+ Uom = Pool().get('product.uom')
+ internal_quantity = Uom.compute_qty(uom, quantity,
+ product.default_uom, round=True)
+ return internal_quantity
+
+ def set_effective_date(self):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ ShipmentInternal = pool.get('stock.shipment.internal')
+
+ if (not self.effective_date
+ and isinstance(self.shipment, ShipmentInternal)
+ and self.to_location == self.shipment.transit_location):
+ self.effective_date = self.shipment.effective_start_date
+ elif not self.effective_date and self.shipment:
+ self.effective_date = self.shipment.effective_date
+ if not self.effective_date:
+ with Transaction().set_context(company=self.company.id):
+ self.effective_date = Date.today()
+
+ @classmethod
+ def view_attributes(cls):
+ return super().view_attributes() + [
+ ('/tree', 'visual', If(Eval('state') == 'cancelled', 'muted', '')),
+ ]
+
+ @property
+ def from_warehouse(self):
+ return self.from_location.warehouse
+
+ @property
+ def to_warehouse(self):
+ return self.to_location.warehouse
+
+ @property
+ def warehouse(self):
+ return self.from_warehouse or self.to_warehouse
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, moves):
+ cls.write(moves, {
+ 'effective_date': None,
+ })
+
+ @classmethod
+ @Workflow.transition('assigned')
+ def assign(cls, moves):
+ cls.check_origin(moves)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def do(cls, moves):
+ pool = Pool()
+ Product = pool.get('product.product')
+ Date = pool.get('ir.date')
+ Warning = pool.get('res.user.warning')
+ today_cache = {}
+
+ def in_future(move):
+ if move.company not in today_cache:
+ with Transaction().set_context(company=move.company.id):
+ today_cache[move.company] = Date.today()
+ today = today_cache[move.company]
+ if move.effective_date and move.effective_date > today:
+ return move
+
+ def set_cost_values(cost_values):
+ Value = Product.multivalue_model('cost_price')
+ values = []
+ for product, cost_price, pattern in cost_values:
+ values.extend(product.set_multivalue(
+ 'cost_price', cost_price, save=False, **pattern))
+ Value.save(values)
+
+ cls.check_origin(moves)
+ for key, grouped_moves in groupby(moves, key=cls._cost_price_key):
+ to_save = []
+ cost_values = []
+ products = set()
+ grouped_moves = list(grouped_moves)
+ context = dict(key)
+ context.update(cls._cost_price_context(grouped_moves))
+ with Transaction().set_context(context):
+ grouped_moves = cls.browse(grouped_moves)
+ for move in grouped_moves:
+ move.set_effective_date()
+ previous_values = copy.copy(move._values)
+ cost_price, extra_to_save = move._do()
+ if cost_price is not None:
+ if move.product in products:
+ # The average computation of product cost price
+ # requires each previous move of the same product
+ # to be saved
+ cls.save(to_save)
+ set_cost_values(cost_values)
+ del to_save[:]
+ del cost_values[:]
+ products.clear()
+ # Recompute with unmodified move but including new
+ # saved moves
+ move._values = previous_values
+ cost_price, extra_to_save = move._do()
+ cost_values.append(
+ (move.product, cost_price,
+ move._cost_price_pattern))
+ to_save.extend(extra_to_save)
+ if move.cost_price_required and move.cost_price is None:
+ if cost_price is None:
+ cost_price = move.product.get_multivalue(
+ 'cost_price', **move._cost_price_pattern)
+ move.cost_price = cost_price
+ move.state = 'done'
+
+ to_save.append(move)
+ products.add(move.product)
+
+ if to_save:
+ cls.save(to_save)
+ if cost_values:
+ set_cost_values(cost_values)
+
+ future_moves = sorted(filter(in_future, moves))
+ if future_moves:
+ names = ', '.join(m.rec_name for m in future_moves[:5])
+ if len(future_moves) > 5:
+ names += '...'
+ warning_name = Warning.format(
+ 'effective_date_future', future_moves)
+ if Warning.check(warning_name):
+ raise MoveFutureWarning(warning_name,
+ gettext('stock.msg_move_effective_date_in_the_future',
+ moves=names))
+
+ @property
+ def _cost_price_pattern(self):
+ return {
+ 'company': self.company.id,
+ }
+
+ def _cost_price_key(self):
+ return (
+ ('company', self.company.id),
+ )
+
+ def get_cost_price(self, product_cost_price=None):
+ "Return the cost price of the move for computation"
+ with Transaction().set_context(date=self.effective_date):
+ if (self.from_location.type in {'supplier', 'production'}
+ or self.to_location.type == 'supplier'):
+ return self.unit_price_company
+ elif product_cost_price is not None:
+ return product_cost_price
+ elif self.cost_price is not None:
+ return self.cost_price
+ else:
+ return self.product.get_multivalue(
+ 'cost_price', **self._cost_price_pattern)
+
+ @classmethod
+ def _cost_price_context(cls, moves):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ Date = pool.get('ir.date')
+ context = {}
+ locations = Location.search([
+ ('type', '=', 'storage'),
+ ])
+ context['with_childs'] = False
+ context['locations'] = [l.id for l in locations]
+ with Transaction().set_context(company=moves[0].company.id):
+ context['stock_date_end'] = Date.today()
+ context['company'] = moves[0].company.id
+ return context
+
+ def _do(self):
+ "Return cost_price and a list of moves to save"
+ if (self.from_location.type in ('supplier', 'production')
+ and self.to_location.type == 'storage'
+ and self.product.cost_price_method == 'average'):
+ return self._compute_product_cost_price('in'), []
+ elif (self.to_location.type == 'supplier'
+ and self.from_location.type == 'storage'
+ and self.product.cost_price_method == 'average'):
+ return self._compute_product_cost_price('out'), []
+ return None, []
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, moves):
+ pass
+
+ @classmethod
+ def create(cls, vlist):
+ pool = Pool()
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+
+ vlist = [x.copy() for x in vlist]
+ # Use ordered dict to optimize cache alignment
+ products, uoms = OrderedDict(), OrderedDict()
+ for vals in vlist:
+ products[vals['product']] = None
+ uoms[vals['uom']] = None
+ id2product = {p.id: p for p in Product.browse(products.keys())}
+ id2uom = {u.id: u for u in Uom.browse(uoms.keys())}
+ for vals in vlist:
+ assert vals.get('state', cls.default_state()
+ ) in ['draft', 'staging']
+ product = id2product[int(vals['product'])]
+ uom = id2uom[int(vals['uom'])]
+ internal_quantity = cls._get_internal_quantity(
+ vals['quantity'], uom, product)
+ vals['internal_quantity'] = internal_quantity
+ moves = super(Move, cls).create(vlist)
+ cls.check_period_closed(moves)
+ return moves
+
+ @classmethod
+ def write(cls, *args):
+ actions = iter(args)
+ for moves, values in zip(actions, actions):
+ vals_set = set(values)
+ if cls._deny_modify_assigned & vals_set:
+ for move in moves:
+ if move.state == 'assigned':
+ raise AccessError(
+ gettext('stock.msg_move_modify_assigned',
+ move=move.rec_name))
+ if cls._deny_modify_done_cancel & vals_set:
+ for move in moves:
+ if move.state in ('done', 'cancelled'):
+ raise AccessError(
+ gettext('stock.msg_move_modify_%s' % move.state,
+ move=move.rec_name))
+
+ super(Move, cls).write(*args)
+
+ to_write = []
+ unit_price_update = []
+ actions = iter(args)
+ for moves, values in zip(actions, actions):
+ if any(f not in cls._allow_modify_closed_period for f in values):
+ cls.check_period_closed(moves)
+ for move in moves:
+ internal_quantity = cls._get_internal_quantity(move.quantity,
+ move.uom, move.product)
+ if (internal_quantity != move.internal_quantity
+ and internal_quantity
+ != values.get('internal_quantity')):
+ to_write.extend(([move], {
+ 'internal_quantity': internal_quantity,
+ }))
+ if (move.state == 'done'
+ and ('unit_price' in values
+ or 'currency' in values)):
+ unit_price_update.append(move)
+
+ if to_write:
+ cls.write(*to_write)
+ if unit_price_update:
+ cls.write(unit_price_update, {'unit_price_updated': True})
+
+ @classmethod
+ def delete(cls, moves):
+ for move in moves:
+ if move.state not in {'staging', 'draft', 'cancelled'}:
+ raise AccessError(
+ gettext('stock.msg_move_delete_draft_cancel',
+ move=move.rec_name))
+ super(Move, cls).delete(moves)
+
+ @staticmethod
+ def check_origin_types():
+ "Location types to check for origin"
+ return set()
+
+ @classmethod
+ def check_origin(cls, moves, types=None):
+ pool = Pool()
+ Warning = pool.get('res.user.warning')
+ if types is None:
+ types = cls.check_origin_types()
+ if not types:
+ return
+
+ def no_origin(move):
+ return ((move.from_location.type in types)
+ ^ (move.to_location.type in types)
+ and not move.origin)
+ moves = sorted(filter(no_origin, moves))
+ if moves:
+ names = ', '.join(m.rec_name for m in moves[:5])
+ if len(moves) > 5:
+ names += '...'
+ warning_name = Warning.format('done', moves)
+ if Warning.check(warning_name):
+ raise MoveOriginWarning(warning_name,
+ gettext('stock.msg_move_no_origin',
+ moves=names))
+
+ def sort_quantities(self, quantities, locations, grouping):
+ """
+ Return the quantities ordered by pick preference which is the locations
+ order by default.
+ """
+ locations = {l.id: i for i, l in enumerate(locations)}
+ quantities = filter(lambda x: x[0][0] in locations, quantities)
+ return sorted(quantities, key=lambda x: locations[x[0][0]])
+
+ def pick_product(self, quantities):
+ """
+ Pick the product across the keys. Naive (fast) implementation.
+ Return a list of tuple (key, quantity) for quantities that can be
+ picked.
+ """
+ to_pick = []
+ needed_qty = self.quantity
+ for key, available_qty in quantities:
+ # Ignore available_qty when too small
+ if available_qty < self.uom.rounding:
+ continue
+ if needed_qty <= available_qty:
+ to_pick.append((key, needed_qty))
+ return to_pick
+ else:
+ to_pick.append((key, available_qty))
+ needed_qty -= available_qty
+ # Force assignation for consumables:
+ if self.product.consumable and self.from_location.type != 'view':
+ to_pick.append(((self.from_location,), needed_qty))
+ return to_pick
+ return to_pick
+
+ @classmethod
+ def assign_try(cls, moves, with_childs=True, grouping=('product',)):
+ '''
+ Try to assign moves.
+ It will split the moves to assign as much possible.
+ Return True if succeed or False if not.
+ '''
+ pool = Pool()
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ Date = pool.get('ir.date')
+ Location = pool.get('stock.location')
+
+ moves = [m for m in moves if m.state in {'draft', 'staging'}]
+ if not moves:
+ return True
+
+ if with_childs:
+ locations = Location.search([
+ ('parent', 'child_of',
+ [x.from_location.id for x in moves]),
+ ])
+ else:
+ locations = list(set((m.from_location for m in moves)))
+ location_ids = [l.id for l in locations]
+ product_ids = list(set((m.product.id for m in moves)))
+ companies = {m.company for m in moves}
+ stock_date_end = Date.today()
+
+ pblc = {}
+ for company in companies:
+ with Transaction().set_context(company=company.id):
+ stock_date_end = Date.today()
+
+ cls._assign_try_lock(
+ product_ids, location_ids, [company.id],
+ stock_date_end, grouping)
+
+ with Transaction().set_context(
+ stock_date_end=stock_date_end,
+ stock_assign=True,
+ company=company.id):
+ pblc[company.id] = Product.products_by_location(
+ location_ids,
+ grouping=grouping,
+ grouping_filter=(product_ids,))
+
+ def get_key(move, location_id):
+ key = (location_id,)
+ for field in grouping:
+ value = getattr(move, field)
+ if isinstance(value, Model):
+ value = value.id
+ key += (value,)
+ return key
+
+ def get_values(key, location_name):
+ yield location_name, key[0]
+ for field, value in zip(grouping, key[1:]):
+ if value is not None and '.' not in field:
+ yield field, value
+
+ def match(key, pattern):
+ for k, p in zip(key, pattern):
+ if p is None or k == p:
+ continue
+ else:
+ return False
+ else:
+ return True
+
+ child_locations = {}
+ to_write = []
+ to_assign = []
+ success = True
+ for move in moves:
+ if move.state != 'draft':
+ if move.state == 'staging':
+ success = False
+ continue
+ pbl = pblc[move.company.id]
+ # Keep location order for pick_product
+ if with_childs:
+ childs = child_locations.get(move.from_location)
+ if childs is None:
+ childs = Location.search([
+ ('parent', 'child_of', [move.from_location.id]),
+ ('type', '!=', 'view'),
+ ])
+ child_locations[move.from_location] = childs
+ else:
+ childs = [move.from_location]
+ # Prevent picking from the destination location
+ try:
+ childs.remove(move.to_location)
+ except ValueError:
+ pass
+ # Try first to pick from source location
+ try:
+ childs.remove(move.from_location)
+ childs.insert(0, move.from_location)
+ except ValueError:
+ # from_location may be a view
+ pass
+ location_qties = []
+ for key, qty in pbl.items():
+ move_key = get_key(move, key[0])
+ if match(key, move_key):
+ qty = Uom.compute_qty(
+ move.product.default_uom, qty, move.uom,
+ round=False)
+ location_qties.append((key, qty))
+
+ location_qties = move.sort_quantities(
+ location_qties, childs, grouping)
+ to_pick = move.pick_product(location_qties)
+
+ picked_qties = 0.0
+ for _, qty in to_pick:
+ picked_qties += qty
+
+ if move.quantity - picked_qties >= move.uom.rounding:
+ success = False
+ first = False
+ values = {
+ 'quantity': move.uom.round(
+ move.quantity - picked_qties),
+ }
+ to_write.extend([[move], values])
+ else:
+ first = True
+ for key, qty in to_pick:
+ values = dict(get_values(key, 'from_location'))
+ values['quantity'] = move.uom.round(qty)
+ if first:
+ to_write.extend([[move], values])
+ to_assign.append(move)
+ first = False
+ else:
+ with Transaction().set_context(_stock_move_split=True):
+ to_assign.extend(cls.copy([move], default=values))
+
+ qty_default_uom = Uom.compute_qty(move.uom, qty,
+ move.product.default_uom, round=False)
+
+ pbl[key] = pbl.get(key, 0.0) - qty_default_uom
+ if to_write:
+ cls.write(*to_write)
+ if to_assign:
+ cls.assign(to_assign)
+ return success
+
+ @classmethod
+ def _assign_try_lock(
+ cls, product_ids, location_ids, company_ids, date, grouping):
+ """Lock the database to prevent concurrent assignation"""
+ pool = Pool()
+ Period = pool.get('stock.period')
+ transaction = Transaction()
+ database = transaction.database
+ connection = transaction.connection
+
+ if database.has_select_for():
+ count = database.IN_MAX // 2
+ PeriodCache = Period.get_cache(grouping)
+ with connection.cursor() as cursor:
+ for company_id in company_ids:
+ period = None
+ if PeriodCache:
+ periods = Period.search([
+ ('date', '<', date),
+ ('company', '=', company_id),
+ ('state', '=', 'closed'),
+ ], order=[('date', 'DESC')], limit=1)
+ if periods:
+ period, = periods
+ for sub_location_ids in grouped_slice(location_ids, count):
+ sub_location_ids = list(sub_location_ids)
+ table = cls.__table__()
+ query = table.select(Literal(1),
+ where=(reduce_ids(
+ table.to_location, sub_location_ids)
+ | reduce_ids(
+ table.from_location, sub_location_ids))
+ & table.product.in_(product_ids)
+ & (table.company == company_id),
+ for_=For('UPDATE', nowait=True))
+
+ if period:
+ query.where &= Coalesce(
+ table.effective_date,
+ table.planned_date,
+ datetime.date.max) > period.date
+ cursor.execute(*query)
+ else:
+ cls.lock()
+
+ @classmethod
+ def compute_quantities_query(cls, location_ids, with_childs=False,
+ grouping=('product',), grouping_filter=None):
+ """
+ Prepare a query object to compute for each location and product the
+ stock quantity in the default uom of the product.
+
+ The context with keys:
+ stock_date_end: if set the date of the stock computation.
+ stock_date_start: if set return the delta of the stock between the
+ two dates, (ignored if stock_date_end is missing).
+ stock_assign: if set compute also the assigned outgoing moves as
+ done at the stock_date_end except for delta which is at the
+ planned date.
+ forecast: if set compute the forecast quantity.
+ stock_destinations: A list of location ids. If set, restrict the
+ computation to moves from and to those locations.
+ If with_childs, it computes also for child locations.
+ grouping is a tuple of Move (or Product if prefixed by 'product.' or
+ 'date') field names and defines how stock moves are grouped.
+ grouping_filter is a tuple of values, for the Move's field at the same
+ position in grouping tuple, used to filter which moves are used to
+ compute quantities. It must be None or have the same number of
+ elements than grouping. If no grouping_filter is provided it
+ returns quantities for all products.
+
+ The query return the location as first column, after the fields in
+ grouping, and the last column is the quantity.
+ """
+ pool = Pool()
+ User = pool.get('res.user')
+ Location = pool.get('stock.location')
+ Date = pool.get('ir.date')
+ Period = pool.get('stock.period')
+ Move = pool.get('stock.move')
+ Product = pool.get('product.product')
+
+ move = Move.__table__()
+ today = Date.today()
+
+ if not location_ids:
+ return None
+ context = Transaction().context.copy()
+
+ use_product = False
+ for field in grouping:
+ if field.startswith('product.'):
+ Model = Product
+ field = field[len('product.'):]
+ use_product = True
+ else:
+ Model = Move
+ if field not in Model._fields and field != 'date':
+ raise ValueError('"%s" has no field "%s"' % (Model, field))
+ assert grouping_filter is None or len(grouping_filter) <= len(grouping)
+ assert len(set(grouping)) == len(grouping)
+ assert ('stock_date_start' in context) if 'date' in grouping else True
+
+ company = User(Transaction().user).company
+
+ def get_column(name, table):
+ if name == 'date':
+ return cls.effective_date.sql_cast(
+ Coalesce(table.effective_date, table.planned_date))
+ else:
+ return Column(table, name)
+
+ def get_column_product(name, table, product):
+ if name.startswith('product.'):
+ column = Column(product, name[len('product.'):])
+ else:
+ column = Column(table, name)
+ return column.as_(name)
+
+ if use_product:
+ product = Product.__table__()
+ columns = ['id', 'state', 'effective_date', 'planned_date',
+ 'internal_quantity', 'from_location', 'to_location', 'company']
+ columns += [
+ c for c in grouping if c not in columns and c != 'date']
+ columns = [get_column_product(c, move, product) for c in columns]
+ move = (move
+ .join(product, condition=move.product == product.id)
+ .select(*columns))
+
+ PeriodCache = Period.get_cache(grouping)
+ period = None
+ if PeriodCache:
+ period_cache = PeriodCache.__table__()
+ period_table = Period.__table__()
+ if use_product:
+ product_cache = Product.__table__()
+ columns = ['internal_quantity', 'period', 'location']
+ columns += [c for c in grouping if c not in columns]
+ columns = [
+ get_column_product(c, period_cache, product_cache)
+ for c in columns]
+ period_cache = (period_cache
+ .join(product_cache,
+ condition=(period_cache.product == product_cache.id))
+ .join(period_table,
+ condition=(period_cache.period == period_table.id)
+ & ((period_table.company == company.id)
+ if company else Literal(True)))
+ .select(*columns))
+
+ if with_childs:
+ # Replace tables with union which replaces flat children locations
+ # by their parent location.
+ from_location = Location.__table__()
+ from_parent_location = Location.__table__()
+ to_location = Location.__table__()
+ to_parent_location = Location.__table__()
+ columns = ['id', 'state', 'effective_date', 'planned_date',
+ 'internal_quantity', 'company']
+ columns += [c for c in grouping if c not in columns]
+ columns = [get_column(c, move).as_(c) for c in columns]
+
+ move_with_parent = (move
+ .join(from_location,
+ condition=move.from_location == from_location.id)
+ .join(from_parent_location, type_='LEFT',
+ condition=from_location.parent == from_parent_location.id)
+ .join(to_location,
+ condition=move.to_location == to_location.id)
+ .join(to_parent_location, type_='LEFT',
+ condition=to_location.parent == to_parent_location.id))
+
+ move = Union(
+ # Moves not linked to any flat location
+ move_with_parent.select(
+ move.from_location.as_('from_location'),
+ move.to_location.as_('to_location'),
+ *columns,
+ where=(Coalesce(from_parent_location.flat_childs, False)
+ != Literal(True))
+ & (Coalesce(to_parent_location.flat_childs, False)
+ != Literal(True))),
+ # Append moves linked from/to flat locations to their parents
+ move_with_parent.select(
+ Case(
+ (from_parent_location.flat_childs,
+ from_parent_location.id),
+ else_=move.from_location).as_('from_location'),
+ Case(
+ (to_parent_location.flat_childs,
+ to_parent_location.id),
+ else_=move.to_location).as_('to_location'),
+ *columns,
+ where=(from_parent_location.flat_childs == Literal(True))
+ | (to_parent_location.flat_childs == Literal(True))),
+ # Append moves linked to from/to flat locations only
+ move_with_parent.select(
+ Case(
+ (from_parent_location.flat_childs,
+ from_location.id),
+ else_=Null).as_('from_location'),
+ Case(
+ (to_parent_location.flat_childs,
+ to_location.id),
+ else_=Null).as_('to_location'),
+ *columns,
+ where=(from_parent_location.flat_childs == Literal(True))
+ | (to_parent_location.flat_childs == Literal(True))),
+ all_=True)
+
+ if PeriodCache:
+ location = Location.__table__()
+ parent_location = Location.__table__()
+ columns = ['internal_quantity', 'period'] + list(grouping)
+ columns = [Column(period_cache, c).as_(c) for c in columns]
+ period_cache = Union(
+ period_cache.select(
+ period_cache.location.as_('location'),
+ *columns),
+ period_cache.join(location,
+ condition=period_cache.location == location.id
+ ).join(parent_location, type_='LEFT',
+ condition=location.parent == parent_location.id
+ ).select(
+ parent_location.id.as_('location'),
+ *columns,
+ where=parent_location.flat_childs == Literal(True)),
+ all_=True)
+
+ if not context.get('stock_date_end'):
+ context['stock_date_end'] = datetime.date.max
+
+ # date end in the past or today: filter on state done
+ if (context['stock_date_end'] < today
+ or (context['stock_date_end'] == today
+ and not context.get('forecast'))):
+
+ def state_date_clause(stock_assign):
+ return (move.state.in_(['done',
+ 'assigned' if stock_assign else 'done'])
+ & (
+ (Coalesce(move.effective_date, move.planned_date)
+ <= context['stock_date_end'])
+ | (move.state == (
+ 'assigned'
+ if not context.get('stock_date_start')
+ else ''))
+ ))
+ state_date_clause_in = state_date_clause(False)
+ state_date_clause_out = state_date_clause(
+ context.get('stock_assign'))
+ # future date end: filter move on state done and date
+ # before today, or on all state and date between today and
+ # date_end.
+ else:
+ def state_date_clause(stock_assign):
+ return ((move.state.in_(['done',
+ 'assigned' if stock_assign else 'done'])
+ & (
+ (Coalesce(
+ move.effective_date,
+ move.planned_date,
+ datetime.date.max)
+ <= today)
+ | (move.state == (
+ 'assigned'
+ if not context.get('stock_date_start')
+ else ''))
+ )
+ )
+ | (move.state.in_(['done', 'assigned', 'draft'])
+ & (
+ (
+ (Coalesce(
+ move.effective_date,
+ move.planned_date,
+ datetime.date.max)
+ <= context['stock_date_end'])
+ & (Coalesce(
+ move.effective_date,
+ move.planned_date,
+ datetime.date.max)
+ >= today)
+ )
+ | (move.state == (
+ 'assigned'
+ if not context.get('stock_date_start')
+ else ''))
+ )
+ )
+ )
+ state_date_clause_in = state_date_clause(False)
+ state_date_clause_out = state_date_clause(
+ context.get('stock_assign'))
+
+ if context.get('stock_date_start'):
+ if context['stock_date_start'] > today:
+ def state_date_clause():
+ return (move.state.in_(['done', 'assigned', 'draft'])
+ & (Coalesce(
+ move.effective_date,
+ move.planned_date,
+ datetime.date.max)
+ >= context['stock_date_start'])
+ )
+ state_date_clause_in &= state_date_clause()
+ state_date_clause_out &= state_date_clause()
+ else:
+ def state_date_clause(stock_assign):
+ return ((
+ move.state.in_(['done', 'assigned', 'draft'])
+ & (Coalesce(
+ move.effective_date,
+ move.planned_date,
+ datetime.date.max) >= today)
+ )
+ | (
+ move.state.in_(['done',
+ 'assigned' if stock_assign else 'done'])
+ & (Coalesce(
+ move.effective_date,
+ move.planned_date,
+ datetime.date.max)
+ >= context['stock_date_start'])
+ & (Coalesce(
+ move.effective_date,
+ move.planned_date,
+ datetime.date.min) < today)
+ )
+ )
+ state_date_clause_in &= state_date_clause(False)
+ state_date_clause_out &= state_date_clause(
+ context.get('stock_assign'))
+ elif PeriodCache:
+ periods = Period.search([
+ ('date', '<=', context['stock_date_end']),
+ ('state', '=', 'closed'),
+ ('company', '=', company.id if company else -1),
+ ], order=[('date', 'DESC')], limit=1)
+ if periods:
+ period, = periods
+
+ def state_date_clause():
+ return (Coalesce(move.effective_date, move.planned_date,
+ datetime.date.max) > period.date)
+ state_date_clause_in &= state_date_clause()
+ state_date_clause_out &= state_date_clause()
+
+ if with_childs:
+ location_query = _location_children(location_ids, query=True)
+ else:
+ location_query = location_ids[:]
+
+ if PeriodCache:
+ from_period = period_cache
+ where = where_period = Literal(True)
+ if grouping_filter and any(grouping_filter):
+ for fieldname, grouping_ids in zip(grouping, grouping_filter):
+ if not grouping_ids:
+ continue
+ column = get_column(fieldname, move)
+ if PeriodCache:
+ cache_column = Column(period_cache, fieldname)
+ if isinstance(grouping_ids[0], (int, float, Decimal)):
+ where &= reduce_ids(column, grouping_ids)
+ if PeriodCache:
+ where_period &= reduce_ids(cache_column, grouping_ids)
+ else:
+ where &= column.in_(grouping_ids)
+ if PeriodCache:
+ where_period &= cache_column.in_(grouping_ids)
+
+ if context.get('stock_destinations'):
+ destinations = context['stock_destinations']
+ dest_clause_from = move.from_location.in_(destinations)
+ dest_clause_to = move.to_location.in_(destinations)
+
+ if PeriodCache:
+ dest_clause_period = period_cache.location.in_(destinations)
+
+ else:
+ dest_clause_from = dest_clause_to = dest_clause_period = \
+ Literal(True)
+
+ # The main select clause is a union between three similar subqueries.
+ # One that sums incoming moves towards locations, one that sums
+ # outgoing moves and one for the period cache. UNION ALL is used
+ # because we already know that there will be no duplicates.
+ move_keys_alias = [get_column(key, move).as_(key) for key in grouping]
+ move_keys = [get_column(key, move) for key in grouping]
+ query = move.select(move.to_location.as_('location'),
+ Sum(move.internal_quantity).as_('quantity'),
+ *move_keys_alias,
+ where=state_date_clause_in
+ & where
+ & move.to_location.in_(location_query)
+ & ((move.company == company.id) if company else Literal(True))
+ & dest_clause_from,
+ group_by=[move.to_location] + move_keys)
+ query = Union(query, move.select(move.from_location.as_('location'),
+ (-Sum(move.internal_quantity)).as_('quantity'),
+ *move_keys_alias,
+ where=state_date_clause_out
+ & where
+ & move.from_location.in_(location_query)
+ & ((move.company == company.id) if company else Literal(True))
+ & dest_clause_to,
+ group_by=[move.from_location] + move_keys),
+ all_=True)
+ if PeriodCache:
+ period_keys = [Column(period_cache, key).as_(key)
+ for key in grouping]
+ query = Union(query, from_period.select(
+ period_cache.location.as_('location'),
+ period_cache.internal_quantity.as_('quantity'),
+ *period_keys,
+ where=(period_cache.period
+ == (period.id if period else None))
+ & where_period
+ & period_cache.location.in_(location_query)
+ & dest_clause_period),
+ all_=True)
+ query_keys = [Column(query, key).as_(key) for key in grouping]
+ columns = ([query.location.as_('location')]
+ + query_keys
+ + [Sum(query.quantity).as_('quantity')])
+ query = query.select(*columns,
+ group_by=[query.location] + query_keys)
+ return query
+
+ @classmethod
+ def compute_quantities(cls, query, location_ids, with_childs=False,
+ grouping=('product',), grouping_filter=None):
+ """
+ Executes the supplied query to compute for each location and product
+ the stock quantity in the default uom of the product and rounded to
+ Uom's rounding digits.
+
+ See compute_quantites_query for params explanation.
+
+ Return a dictionary with location id and grouping as key
+ and quantity as value.
+ """
+ pool = Pool()
+ Product = pool.get('product.product')
+ Template = pool.get('product.template')
+
+ assert query is not None, (
+ "Query in Move.compute_quantities() can't be None")
+ assert 'product' in grouping or 'product.template' in grouping
+
+ cursor = Transaction().connection.cursor()
+ cursor.execute(*query)
+
+ if 'product' in grouping:
+ id_name = 'product'
+ Model = Product
+ else:
+ id_name = 'product.template'
+ Model = Template
+ id_getter = operator.itemgetter(grouping.index(id_name) + 1)
+ ids = set()
+ quantities = defaultdict(int)
+ keys = set()
+ # We can do a quick loop without propagation if the request is for a
+ # single location because all the locations are children and we can sum
+ # them directly.
+ if len(location_ids) == 1:
+ location, = location_ids
+ for line in cursor:
+ if len(location_ids) > 1:
+ location = line[0]
+ key = list(line[1:-1])
+ if 'date' in grouping:
+ i = grouping.index('date')
+ if key[i] and not isinstance(key[i], datetime.date):
+ key[i] = datetime.date.fromisoformat(key[i])
+ key = tuple(key)
+ quantity = line[-1]
+ quantities[(location,) + key] += quantity
+ ids.add(id_getter(line))
+ keys.add(key)
+
+ # Propagate quantities on from child locations to their parents
+ if with_childs and len(location_ids) > 1:
+ # Fetch all child locations
+ locations = _location_children(location_ids)
+ # Generate a set of locations without childs and a dict
+ # giving the parent of each location.
+ leafs = set([l.id for l in locations])
+ parent = {}
+ for location in locations:
+ if not location.parent or location.parent.flat_childs:
+ continue
+ if location.parent.id in leafs:
+ leafs.remove(location.parent.id)
+ parent[location.id] = location.parent.id
+ locations = set((l.id for l in locations))
+ while leafs:
+ for l in leafs:
+ locations.remove(l)
+ if l not in parent:
+ continue
+ for key in keys:
+ parent_key = (parent[l],) + key
+ quantities.setdefault(parent_key, 0)
+ quantities[parent_key] += quantities.get((l,) + key, 0)
+ next_leafs = set(locations)
+ for l in locations:
+ if l not in parent:
+ continue
+ if parent[l] in next_leafs and parent[l] in locations:
+ next_leafs.remove(parent[l])
+ leafs = next_leafs
+
+ # clean result
+ for key in list(quantities.keys()):
+ location = key[0]
+ if location not in location_ids:
+ del quantities[key]
+
+ # Round quantities
+ default_uom = dict((p.id, p.default_uom) for p in
+ Model.browse(list(ids)))
+ for key, quantity in quantities.items():
+ location = key[0]
+ uom = default_uom[id_getter(key)]
+ quantities[key] = uom.round(quantity)
+
+ return quantities
+
+
+def _location_children(location_ids, query=False):
+ "Return children location without including flat children"
+ pool = Pool()
+ Location = pool.get('stock.location')
+ nested_location_ids = []
+ flat_location_ids = []
+ for location in Location.browse(location_ids):
+ if location.flat_childs:
+ flat_location_ids.append(location.id)
+ else:
+ nested_location_ids.append(location.id)
+ if nested_location_ids:
+ return Location.search(['OR',
+ [
+ ('parent', 'child_of', nested_location_ids),
+ ('parent.flat_childs', '!=', True),
+ ],
+ ('id', 'in', location_ids),
+ ], query=query, order=[])
+ else:
+ if query:
+ return flat_location_ids
+ else:
+ return Location.browse(flat_location_ids)
diff --git a/modules/stock/move.xml b/modules/stock/move.xml
new file mode 100644
index 0000000000..cb7d4ec23b
--- /dev/null
+++ b/modules/stock/move.xml
@@ -0,0 +1,180 @@
+
+
+
+
+
+ stock.move
+ form
+ move_form
+
+
+ stock.move
+ tree
+
+ move_tree
+
+
+
+ stock.move
+ tree
+
+ move_tree_simple
+
+
+
+ stock.move
+ tree
+
+ move_list_shipment_in
+
+
+
+ stock.move
+ tree
+
+ move_list_shipment
+
+
+
+ Moves
+ stock.move
+
+
+
+
+
+
+
+
+
+
+
+
+
+ All
+
+
+
+
+
+ From Suppliers
+
+
+
+
+
+ From Suppliers Waiting
+
+
+
+
+
+
+ To Customers
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+ Are you sure you want to cancel the move?
+
+
+
+
+ draft
+ Reset to Draft
+
+
+
+
+ do
+ Do
+ Are you sure you want to complete the move?
+
+
+
+
+ Stock Moves
+ stock.move
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ form_relate
+ product.product,-1
+
+
+
+ form_relate
+ product.template,-1
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/party.py b/modules/stock/party.py
new file mode 100644
index 0000000000..d0bbc151dd
--- /dev/null
+++ b/modules/stock/party.py
@@ -0,0 +1,183 @@
+# 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.i18n import gettext
+from trytond.model import ModelSQL, ValueMixin, fields
+from trytond.modules.party.exceptions import EraseError
+from trytond.pool import Pool, PoolMeta
+from trytond.tools.multivalue import migrate_property
+from trytond.transaction import Transaction
+
+supplier_location = fields.Many2One(
+ 'stock.location', "Supplier Location", domain=[('type', '=', 'supplier')],
+ help="The default source location for stock received from the party.")
+customer_location = fields.Many2One(
+ 'stock.location', "Customer Location", domain=[('type', '=', 'customer')],
+ help="The default destination location for stock sent to the party.")
+
+
+class Party(metaclass=PoolMeta):
+ __name__ = 'party.party'
+
+ supplier_location = fields.MultiValue(supplier_location)
+ customer_location = fields.MultiValue(customer_location)
+ locations = fields.One2Many(
+ 'party.party.location', 'party', "Locations")
+ delivered_to_warehouses = fields.Many2Many(
+ 'party.party-delivered_to-stock.location', 'party', 'location',
+ "Delivered to Warehouses",
+ domain=[
+ ('type', '=', 'warehouse'),
+ ],
+ filter=[
+ ('allow_pickup', '=', True),
+ ])
+
+ @classmethod
+ def multivalue_model(cls, field):
+ pool = Pool()
+ if field in {'supplier_location', 'customer_location'}:
+ return pool.get('party.party.location')
+ return super().multivalue_model(field)
+
+ @classmethod
+ def default_supplier_location(cls, **pattern):
+ return cls.multivalue_model(
+ 'supplier_location').default_supplier_location()
+
+ @classmethod
+ def default_customer_location(cls, **pattern):
+ return cls.multivalue_model(
+ 'customer_location').default_customer_location()
+
+ def address_get(self, type=None):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ context = Transaction().context
+ address = super().address_get(type=type)
+ if (type == 'delivery'
+ and context.get('warehouse')):
+ warehouse = Location(context['warehouse'])
+ if warehouse in self.delivered_to_warehouses:
+ address = warehouse.address
+ return address
+
+
+class PartyLocation(ModelSQL, ValueMixin):
+ "Party Location"
+ __name__ = 'party.party.location'
+ party = fields.Many2One('party.party', "Party", ondelete='CASCADE')
+ supplier_location = supplier_location
+ customer_location = customer_location
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+
+ super().__register__(module_name)
+
+ if not exist:
+ cls._migrate_property([], [], [])
+
+ @classmethod
+ def _migrate_property(cls, field_names, value_names, fields):
+ field_names.extend(['supplier_location', 'customer_location'])
+ value_names.extend(['supplier_location', 'customer_location'])
+ migrate_property(
+ 'party.party', field_names, cls, value_names,
+ parent='party', fields=fields)
+
+ @classmethod
+ def default_supplier_location(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id('stock', 'location_supplier')
+ except KeyError:
+ return None
+
+ @classmethod
+ def default_customer_location(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id('stock', 'location_customer')
+ except KeyError:
+ return None
+
+
+class PartyDeliveredToWarehouse(ModelSQL):
+ "Party Delivered to Warehouse"
+ __name__ = 'party.party-delivered_to-stock.location'
+
+ party = fields.Many2One('party.party', "Party", required=True)
+ location = fields.Many2One(
+ 'stock.location', "Location", required=True, ondelete='CASCADE',
+ domain=[
+ ('type', '=', 'warehouse'),
+ ])
+
+
+class Address(metaclass=PoolMeta):
+ __name__ = 'party.address'
+ delivery = fields.Boolean(
+ 'Delivery',
+ help="Check to send deliveries to the address.")
+ warehouses = fields.One2Many(
+ 'stock.location', 'address', "Warehouses", readonly=True)
+
+
+class ContactMechanism(metaclass=PoolMeta):
+ __name__ = 'party.contact_mechanism'
+ delivery = fields.Boolean(
+ 'Delivery',
+ help="Check to use for delivery.")
+
+ @classmethod
+ def usages(cls, _fields=None):
+ if _fields is None:
+ _fields = []
+ _fields.append('delivery')
+ return super().usages(_fields=_fields)
+
+
+class Replace(metaclass=PoolMeta):
+ __name__ = 'party.replace'
+
+ @classmethod
+ def fields_to_replace(cls):
+ return super().fields_to_replace() + [
+ ('stock.shipment.in', 'supplier'),
+ ('stock.shipment.in.return', 'supplier'),
+ ('stock.shipment.out', 'customer'),
+ ('stock.shipment.out.return', 'customer'),
+ ]
+
+
+class Erase(metaclass=PoolMeta):
+ __name__ = 'party.erase'
+
+ def check_erase_company(self, party, company):
+ pool = Pool()
+ ShipmentIn = pool.get('stock.shipment.in')
+ ShipmentInReturn = pool.get('stock.shipment.in.return')
+ ShipmentOut = pool.get('stock.shipment.out')
+ ShipmentOutReturn = pool.get('stock.shipment.out.return')
+ super().check_erase_company(party, company)
+
+ for Shipment, field in [
+ (ShipmentIn, 'supplier'),
+ (ShipmentInReturn, 'supplier'),
+ (ShipmentOut, 'customer'),
+ (ShipmentOutReturn, 'customer'),
+ ]:
+ shipments = Shipment.search([
+ (field, '=', party.id),
+ ('company', '=', company.id),
+ ('state', 'not in', ['done', 'cancelled']),
+ ])
+ if shipments:
+ raise EraseError(
+ gettext('stock.msg_erase_party_shipment',
+ party=party.rec_name,
+ company=company.rec_name))
diff --git a/modules/stock/party.xml b/modules/stock/party.xml
new file mode 100644
index 0000000000..bb6ea67584
--- /dev/null
+++ b/modules/stock/party.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+ party.party
+
+ party_form
+
+
+
+ party.address
+
+ party_address_tree
+
+
+ party.address
+
+ party_address_form
+
+
+
+ party.address
+
+ party_address_form
+
+
+
+ party.address
+
+ party_address_tree
+
+
+
+ party.contact_mechanism
+
+ party_contact_mechanism_tree
+
+
+ party.contact_mechanism
+
+ party_contact_mechanism_form
+
+
+ party.contact_mechanism
+
+ party_contact_mechanism_tree
+
+
+
+ Customer Shipments
+ stock.shipment.out
+
+
+
+
+ form_relate
+ party.party,-1
+
+
+
+
+
+
+
+
+ Supplier Shipments
+ stock.shipment.in
+
+
+
+
+ form_relate
+ party.party,-1
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/period.py b/modules/stock/period.py
new file mode 100644
index 0000000000..64d8603a72
--- /dev/null
+++ b/modules/stock/period.py
@@ -0,0 +1,198 @@
+# 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 chain, groupby
+
+from sql import For, Literal
+
+from trytond.i18n import gettext
+from trytond.model import Index, ModelSQL, ModelView, Workflow, fields
+from trytond.pool import Pool
+from trytond.pyson import Eval
+from trytond.tools import grouped_slice
+from trytond.transaction import Transaction
+
+from .exceptions import PeriodCloseError
+
+
+class Period(Workflow, ModelSQL, ModelView):
+ 'Stock Period'
+ __name__ = 'stock.period'
+ date = fields.Date('Date', required=True, states={
+ 'readonly': Eval('state') == 'closed',
+ },
+ help="When the stock period ends.")
+ company = fields.Many2One(
+ 'company.company', "Company", required=True,
+ help="The company the stock period is associated with.")
+ caches = fields.One2Many('stock.period.cache', 'period', 'Caches',
+ readonly=True)
+ state = fields.Selection([
+ ('draft', 'Draft'),
+ ('closed', 'Closed'),
+ ], "State", readonly=True, sort=False,
+ help="The current state of the stock period.")
+
+ @classmethod
+ def __setup__(cls):
+ super(Period, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.add(
+ Index(
+ t,
+ (t.company, Index.Equality()),
+ (t.date, Index.Range(order='DESC')),
+ where=t.state == 'closed'))
+ cls._transitions |= set((
+ ('draft', 'closed'),
+ ('closed', 'draft'),
+ ))
+ cls._buttons.update({
+ 'draft': {
+ 'invisible': Eval('state') == 'draft',
+ 'depends': ['state'],
+ },
+ 'close': {
+ 'invisible': Eval('state') == 'closed',
+ 'depends': ['state'],
+ },
+ })
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @staticmethod
+ def default_state():
+ return 'draft'
+
+ @staticmethod
+ def groupings():
+ return [('product',)]
+
+ @staticmethod
+ def get_cache(grouping):
+ pool = Pool()
+ if all(g == 'product' or g.startswith('product.') for g in grouping):
+ return pool.get('stock.period.cache')
+
+ def get_rec_name(self, name):
+ return str(self.date)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, periods):
+ for grouping in cls.groupings():
+ Cache = cls.get_cache(grouping)
+ caches = []
+ for sub_periods in grouped_slice(periods):
+ caches.append(Cache.search([
+ ('period', 'in',
+ [p.id for p in sub_periods]),
+ ], order=[]))
+ Cache.delete(list(chain(*caches)))
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('closed')
+ def close(cls, periods):
+ pool = Pool()
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ transaction = Transaction()
+ connection = transaction.connection
+ database = transaction.database
+
+ # XXX: A move in the period could be inserted before the lock
+ # from a different transaction. It will not be taken in the pbl
+ # computation but it is quite rare because only past periods are
+ # closed.
+ Move.lock()
+ if database.has_select_for():
+ move = Move.__table__()
+ query = move.select(Literal(1), for_=For('UPDATE', nowait=True))
+ with connection.cursor() as cursor:
+ cursor.execute(*query)
+
+ locations = Location.search([
+ ('type', 'not in', ['warehouse', 'view']),
+ ], order=[])
+
+ for company, c_periods in groupby(periods, key=lambda p: p.company):
+ with Transaction().set_context(company=company.id):
+ today = Date.today()
+ recent_date = max(period.date for period in c_periods)
+ if recent_date >= today:
+ raise PeriodCloseError(
+ gettext('stock.msg_period_close_date'))
+ if Move.search([
+ ('state', '=', 'assigned'),
+ ['OR', [
+ ('effective_date', '=', None),
+ ('planned_date', '<=', recent_date),
+ ],
+ ('effective_date', '<=', recent_date),
+ ]]):
+ raise PeriodCloseError(
+ gettext('stock.msg_period_close_assigned_move'))
+
+ for grouping in cls.groupings():
+ Cache = cls.get_cache(grouping)
+ to_create = []
+ for period in periods:
+ with Transaction().set_context(
+ stock_date_end=period.date,
+ stock_date_start=None,
+ stock_assign=False,
+ forecast=False,
+ stock_destinations=None,
+ ):
+ pbl = Product.products_by_location(
+ [l.id for l in locations], grouping=grouping)
+ for key, quantity in pbl.items():
+ values = {
+ 'location': key[0],
+ 'period': period.id,
+ 'internal_quantity': quantity,
+ }
+ for i, field in enumerate(grouping, 1):
+ values[field] = key[i]
+ to_create.append(values)
+ if to_create:
+ Cache.create(to_create)
+
+
+class Cache(ModelSQL, ModelView):
+ '''
+ Stock Period Cache
+
+ It is used to store cached computation of stock quantities.
+ '''
+ __name__ = 'stock.period.cache'
+ period = fields.Many2One(
+ 'stock.period', "Period",
+ required=True, readonly=True, ondelete='CASCADE')
+ location = fields.Many2One(
+ 'stock.location', "Location",
+ required=True, readonly=True, ondelete='CASCADE')
+ product = fields.Many2One(
+ 'product.product', "Product",
+ required=True, readonly=True, ondelete='CASCADE')
+ internal_quantity = fields.Float('Internal Quantity', readonly=True)
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.update({
+ Index(
+ t,
+ (t.period, Index.Equality()),
+ (t.product, Index.Equality()),
+ include=[t.internal_quantity]),
+ Index(
+ t,
+ (t.location, Index.Equality())),
+ })
diff --git a/modules/stock/period.xml b/modules/stock/period.xml
new file mode 100644
index 0000000000..e9286c2966
--- /dev/null
+++ b/modules/stock/period.xml
@@ -0,0 +1,130 @@
+
+
+
+
+
+ stock.period
+ form
+ period_form
+
+
+ stock.period
+ tree
+ period_list
+
+
+
+ Periods
+ stock.period
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ draft
+ Draft
+
+
+
+
+
+
+
+
+ close
+ Close
+
+
+
+
+
+
+
+
+ stock.period.cache
+ form
+ period_cache_form
+
+
+ stock.period.cache
+ tree
+ period_cache_list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/picking_list.fodt b/modules/stock/picking_list.fodt
new file mode 100644
index 0000000000..95126355d1
--- /dev/null
+++ b/modules/stock/picking_list.fodt
@@ -0,0 +1,490 @@
+
+
+
+ LibreOffice/5.2.7.2$Linux_X86_64 LibreOffice_project/20m0$Build-2Bertrand Chenal2009-03-26T13:54:482016-03-21T16:05:27.39538848350PT7H39M6S
+
+
+ 0
+ 0
+ 43760
+ 21691
+ true
+ false
+
+
+ view2
+ 2630
+ 5313
+ 0
+ 0
+ 43759
+ 21689
+ 0
+ 0
+ false
+ 100
+ false
+
+
+
+
+ false
+ true
+ true
+ true
+ 0
+ true
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ true
+ 2539458
+ false
+ true
+ true
+ false
+ true
+ true
+ false
+ true
+ 0
+ false
+ true
+ high-resolution
+ false
+ false
+ false
+ true
+ true
+ true
+
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+
+ false
+ false
+ 1812667
+ false
+ 1
+ true
+ false
+ false
+ 0
+ false
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <if test="company and company.header">
+ <for each="line in company.header.split('\n')">
+ <line>
+ </for>
+ </if>
+ <company.rec_name if company else ''>
+
+
+ <if test="company and company.footer">
+ <for each="line in company.footer.split('\n')">
+ <line>
+ </for>
+ </if>
+ 2/2
+
+
+
+
+
+
+
+
+
+
+
+
+ <for each="shipment in records">
+ Picking List
+ Shipment Number: <shipment.number>
+ Reference: <shipment.origins or ''><', ' if (shipment.origins and shipment.reference) else ''><shipment.reference or ''>
+ Customer: <shipment.customer.rec_name>
+ Planned Date: <shipment.planned_date and format_date(shipment.planned_date, user.language) or ''>
+ Warehouse: <shipment.warehouse.rec_name>
+
+
+
+
+
+
+
+ From Location
+
+
+ To Location
+
+
+ Product
+
+
+ Quantity
+
+
+
+
+
+ <for each="move in moves[shipment.id]">
+
+
+
+
+
+
+
+
+
+
+
+ <move.from_location.rec_name>
+
+
+ <move.to_location.rec_name>
+
+
+ <move.product.rec_name>
+
+
+ <format_number_symbol(move.quantity, user.language, move.uom, digits=move.uom.digits)>
+
+
+
+
+ </for>
+
+
+
+
+
+
+
+
+
+
+ </for>
+
+
+
diff --git a/modules/stock/product.py b/modules/stock/product.py
new file mode 100644
index 0000000000..90ae57b3ea
--- /dev/null
+++ b/modules/stock/product.py
@@ -0,0 +1,1296 @@
+# 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 functools
+from collections import defaultdict
+from copy import deepcopy
+from decimal import Decimal
+
+from simpleeval import simple_eval
+from sql import Literal, Select, Window, With
+from sql.aggregate import Max, Sum
+from sql.conditionals import Case, Coalesce
+from sql.functions import CurrentTimestamp
+from sql.operators import Concat
+
+from trytond.i18n import gettext
+from trytond.model import Index, ModelSQL, ModelView, fields
+from trytond.model.exceptions import AccessError
+from trytond.modules.product import price_digits, round_price
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Bool, Eval, If, PYSONEncoder
+from trytond.tools import decistmt, grouped_slice
+from trytond.transaction import Transaction
+from trytond.wizard import (
+ Button, StateAction, StateTransition, StateView, Wizard)
+
+from .exceptions import ProductCostPriceError, ProductStockWarning
+from .move import StockMixin
+from .shipment import ShipmentAssignMixin
+
+
+def check_no_move(func):
+
+ def find_moves(cls, records):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ if cls.__name__ == 'product.template':
+ field = 'product.template'
+ else:
+ field = 'product'
+ for sub_records in grouped_slice(records):
+ moves = Move.search([
+ (field, 'in', list(map(int, sub_records))),
+ ],
+ limit=1, order=[])
+ if moves:
+ return moves
+ return False
+
+ @functools.wraps(func)
+ def decorator(cls, *args):
+ pool = Pool()
+ Template = pool.get('product.template')
+ transaction = Transaction()
+ if (transaction.user != 0
+ and transaction.context.get('_check_access')):
+ actions = iter(args)
+ for records, values in zip(actions, actions):
+ for field, msg in Template._modify_no_move:
+ if field in values:
+ if find_moves(cls, records):
+ raise AccessError(gettext(msg))
+ # No moves for those records
+ break
+
+ if not values.get('template'):
+ continue
+ template = Template(values['template'])
+ for record in records:
+ for field, msg in Template._modify_no_move:
+ if isinstance(
+ getattr(Template, field), fields.Function):
+ continue
+ if getattr(record, field) != getattr(template, field):
+ if find_moves(cls, [record]):
+ raise AccessError(gettext(msg))
+ # No moves for this record
+ break
+ func(cls, *args)
+ return decorator
+
+
+def check_no_stock_if_inactive(func):
+
+ def get_product_locations(company, location_ids, sub_products):
+ pool = Pool()
+ Product = pool.get('product.product')
+
+ product2locations = defaultdict(list)
+ product_ids = list(map(int, sub_products))
+ with Transaction().set_context(company=company.id):
+ quantities = Product.products_by_location(
+ location_ids, with_childs=True,
+ grouping=('product',), grouping_filter=(product_ids,))
+ for key, quantity in quantities.items():
+ location_id, product_id, = key
+ if quantity:
+ product2locations[product_id].append(location_id)
+ return product2locations
+
+ def raise_warning(company, product2locations):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ Warning = pool.get('res.user.warning')
+ Product = pool.get('product.product')
+
+ for product_id, location_ids in product2locations.items():
+ product = Product(product_id)
+ locations = ','.join(
+ l.rec_name for l in Location.browse(location_ids[:5]))
+ if len(location_ids) > 5:
+ locations += '...'
+ warning_name = Warning.format(
+ 'deactivate_product_with_stock', [product])
+ if Warning.check(warning_name):
+ raise ProductStockWarning(warning_name,
+ gettext(
+ 'stock.msg_product_location_quantity',
+ product=product.rec_name,
+ company=company.rec_name,
+ locations=locations),
+ gettext('stock.msg_product_location_quantity_description'))
+
+ @functools.wraps(func)
+ def decorator(cls, *args):
+ pool = Pool()
+ Company = pool.get('company.company')
+ Location = pool.get('stock.location')
+
+ to_check = []
+ actions = iter(args)
+ for products, values in zip(actions, actions):
+ if not values.get('active', True):
+ to_check.extend(products)
+ if to_check:
+ with Transaction().set_context(_check_access=False):
+ locations = Location.search([('type', '=', 'storage')])
+ location_ids = list(map(int, locations))
+ for company in Company.search([]):
+ for sub_products in grouped_slice(to_check):
+ product2locations = get_product_locations(
+ company, location_ids, sub_products)
+ raise_warning(company, product2locations)
+ return func(cls, *args)
+ return decorator
+
+
+class Template(metaclass=PoolMeta):
+ __name__ = "product.template"
+ quantity = fields.Function(fields.Float('Quantity',
+ help="The amount of stock in the location."),
+ 'sum_product')
+ forecast_quantity = fields.Function(fields.Float('Forecast Quantity',
+ help="The amount of stock expected to be in the location."),
+ 'sum_product')
+ cost_value = fields.Function(fields.Numeric('Cost Value',
+ help="The value of the stock in the location."),
+ 'sum_product')
+
+ def sum_product(self, name):
+ if name not in ('quantity', 'forecast_quantity', 'cost_value'):
+ raise Exception('Bad argument')
+ sum_ = 0. if name != 'cost_value' else Decimal(0)
+ for product in self.products:
+ sum_ += getattr(product, name)
+ return sum_
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._modify_no_move = [
+ ('default_uom', 'stock.msg_product_change_default_uom'),
+ ('type', 'stock.msg_product_change_type'),
+ ('cost_price', 'stock.msg_product_change_cost_price'),
+ ]
+
+ @classmethod
+ @check_no_move
+ def write(cls, *args):
+ super(Template, cls).write(*args)
+
+ @classmethod
+ def recompute_cost_price(cls, templates, start=None):
+ pool = Pool()
+ Product = pool.get('product.product')
+
+ products = [p for t in templates for p in t.products]
+ Product.recompute_cost_price(products, start=start)
+
+
+class Product(StockMixin, object, metaclass=PoolMeta):
+ __name__ = "product.product"
+ quantity = fields.Function(fields.Float(
+ "Quantity", digits=(16, Eval('default_uom_digits', 2)),
+ help="The amount of stock in the location."),
+ 'get_quantity', searcher='search_quantity')
+ forecast_quantity = fields.Function(fields.Float(
+ "Forecast Quantity", digits=(16, Eval('default_uom_digits', 2)),
+ help="The amount of stock expected to be in the location."),
+ 'get_quantity', searcher='search_quantity')
+ cost_value = fields.Function(fields.Numeric(
+ "Cost Value", digits=price_digits,
+ help="The value of the stock in the location."),
+ 'get_cost_value')
+
+ @classmethod
+ def get_quantity(cls, products, name):
+ location_ids = Transaction().context.get('locations')
+ product_ids = list(map(int, products))
+ return cls._get_quantity(
+ products, name, location_ids, grouping_filter=(product_ids,))
+
+ @classmethod
+ def search_quantity(cls, name, domain=None):
+ location_ids = Transaction().context.get('locations')
+ return cls._search_quantity(name, location_ids, domain)
+
+ @classmethod
+ def get_cost_value(cls, products, name):
+ cost_values = {p.id: None for p in products}
+ context = {}
+ trans_context = Transaction().context
+ if trans_context.get('stock_date_end'):
+ # Use the last cost_price of the day
+ context['_datetime'] = datetime.datetime.combine(
+ trans_context['stock_date_end'], datetime.time.max)
+ # The date could be before the product creation
+ products = [p for p in products
+ if p.create_date <= context['_datetime']]
+ with Transaction().set_context(context):
+ for product in cls.browse(products):
+ # The product may not have a cost price
+ if product.cost_price is not None:
+ cost_values[product.id] = round_price(
+ Decimal(str(product.quantity)) * product.cost_price)
+ return cost_values
+
+ @classmethod
+ @check_no_move
+ @check_no_stock_if_inactive
+ def write(cls, *args):
+ super(Product, cls).write(*args)
+
+ @classmethod
+ def products_by_location(cls, location_ids,
+ with_childs=False, grouping=('product',), grouping_filter=None):
+ """
+ Compute for each location and product the stock quantity in the default
+ uom of the product.
+
+ The context with keys:
+ stock_skip_warehouse: if set, quantities on a warehouse are no more
+ quantities of all child locations but quantities of the storage
+ zone.
+
+ Return a dictionary with location id and grouping as key
+ and quantity as value.
+ """
+ pool = Pool()
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+
+ # Skip warehouse location in favor of their storage location
+ # to compute quantities. Keep track of which ids to remove
+ # and to add after the query.
+ storage_to_remove = set()
+ wh_to_add = {}
+ if Transaction().context.get('stock_skip_warehouse'):
+ location_ids = set(location_ids)
+ for location in Location.browse(list(location_ids)):
+ if location.type == 'warehouse':
+ location_ids.remove(location.id)
+ if location.storage_location.id not in location_ids:
+ storage_to_remove.add(location.storage_location.id)
+ location_ids.add(location.storage_location.id)
+ wh_to_add[location.id] = location.storage_location.id
+ location_ids = list(location_ids)
+
+ query = Move.compute_quantities_query(location_ids, with_childs,
+ grouping=grouping, grouping_filter=grouping_filter)
+ if query is None:
+ return {}
+ quantities = Move.compute_quantities(query, location_ids, with_childs,
+ grouping=grouping, grouping_filter=grouping_filter)
+
+ if wh_to_add:
+ for wh, storage in wh_to_add.items():
+ for key in list(quantities.keys()):
+ if key[0] == storage:
+ quantities[(wh,) + key[1:]] = quantities[key]
+ if storage in storage_to_remove:
+ del quantities[key]
+ return quantities
+
+ @classmethod
+ def recompute_cost_price_from_moves(cls):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ products = set()
+ for move in Move.search([
+ ('unit_price_updated', '=', True),
+ cls._domain_moves_cost(),
+ ],
+ order=[('effective_date', 'ASC')]):
+ if move.product not in products:
+ cls.__queue__.recompute_cost_price(
+ [move.product], start=move.effective_date)
+ products.add(move.product)
+
+ @classmethod
+ def recompute_cost_price(cls, products, start=None):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ costs = defaultdict(list)
+ for product in products:
+ if product.type == 'service':
+ continue
+ cost = getattr(
+ product, 'recompute_cost_price_%s' %
+ product.cost_price_method)(start)
+ cost = round_price(cost)
+ costs[cost].append(product)
+
+ updated = []
+ for sub_products in grouped_slice(products):
+ domain = [
+ ('unit_price_updated', '=', True),
+ cls._domain_moves_cost(),
+ ('product', 'in', [p.id for p in sub_products]),
+ ]
+ if start:
+ domain.append(('effective_date', '>=', start))
+ updated += Move.search(domain, order=[])
+ if updated:
+ Move.write(updated, {'unit_price_updated': False})
+
+ if costs:
+ cls.update_cost_price(costs)
+
+ @classmethod
+ def update_cost_price(cls, costs):
+ "Update cost price of products from costs re-computation dictionary"
+ to_write = []
+ for cost, products in costs.items():
+ to_write.append(products)
+ to_write.append({'cost_price': cost})
+
+ with Transaction().set_context(_check_access=False):
+ cls.write(*to_write)
+
+ def recompute_cost_price_fixed(self, start=None):
+ return self.cost_price
+
+ @classmethod
+ def _domain_moves_cost(cls):
+ "Returns the domain for moves to use in cost computation"
+ context = Transaction().context
+ return [
+ ('company', '=', context.get('company')),
+ ('state', '=', 'done'),
+ ]
+
+ @classmethod
+ def _domain_in_moves_cost(cls):
+ "Return the domain for incoming moves in cost computation"
+ return [
+ ('to_location.type', '=', 'storage'),
+ ('from_location.type', '!=', 'storage'),
+ ]
+
+ @classmethod
+ def _domain_out_moves_cost(cls):
+ "Return the domain for outgoing moves in cost computation"
+ return [
+ ('from_location.type', '=', 'storage'),
+ ('to_location.type', '!=', 'storage'),
+ ]
+
+ @classmethod
+ def _domain_storage_quantity(cls):
+ "Returns the domain for locations to use in cost computation"
+ return [('type', '=', 'storage')]
+
+ def _get_storage_quantity(self, date=None):
+ pool = Pool()
+ Location = pool.get('stock.location')
+
+ locations = Location.search(self._domain_storage_quantity())
+ if not date:
+ date = datetime.date.today()
+ location_ids = [l.id for l in locations]
+ with Transaction().set_context(
+ locations=location_ids,
+ with_childs=False,
+ stock_date_end=date):
+ return self.__class__(self.id).quantity
+
+ def recompute_cost_price_average(self, start=None):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Uom = pool.get('product.uom')
+ Revision = pool.get('product.cost_price.revision')
+
+ domain = [
+ ('product', '=', self.id),
+ self._domain_moves_cost(),
+ ['OR',
+ self._domain_in_moves_cost(),
+ self._domain_out_moves_cost(),
+ ]
+ ]
+ if start:
+ domain.append(('effective_date', '>=', start))
+ moves = Move.search(
+ domain, order=[('effective_date', 'ASC'), ('id', 'ASC')])
+
+ _in_moves = Move.search([
+ ('product', '=', self.id),
+ self._domain_moves_cost(),
+ self._domain_in_moves_cost(),
+ ], order=[])
+ _in_moves = set(m.id for m in _in_moves)
+
+ revisions = Revision.get_for_product(self)
+
+ cost_price = Decimal(0)
+ quantity = 0
+ if start:
+ domain.remove(('effective_date', '>=', start))
+ domain.append(('effective_date', '<', start))
+ domain.append(self._domain_in_moves_cost())
+ prev_moves = Move.search(
+ domain,
+ order=[('effective_date', 'DESC'), ('id', 'DESC')],
+ limit=1)
+ if prev_moves:
+ move, = prev_moves
+ cost_price = move.cost_price
+ quantity = self._get_storage_quantity(
+ date=start - datetime.timedelta(days=1))
+ quantity = Decimal(str(quantity))
+
+ def in_move(move):
+ return move.id in _in_moves
+
+ def out_move(move):
+ return not in_move(move)
+
+ def production_move(move):
+ return (
+ move.from_location.type == 'production'
+ or move.to_location.type == 'production')
+
+ current_moves = []
+ current_cost_price = cost_price
+ qty_production = 0
+ for move in moves:
+ if (current_moves
+ and current_moves[-1].effective_date
+ != move.effective_date):
+ Move.write([
+ m for m in current_moves
+ if m.cost_price != current_cost_price],
+ dict(cost_price=current_cost_price))
+ current_moves.clear()
+ qty_production = 0
+ current_moves.append(move)
+
+ cost_price = Revision.apply_up_to(
+ revisions, cost_price, move.effective_date)
+ qty = Uom.compute_qty(move.uom, move.quantity, self.default_uom)
+ qty = Decimal(str(qty))
+ if out_move(move):
+ qty *= -1
+ if in_move(move):
+ in_qty = qty
+ if production_move(move) and qty_production < 0:
+ # Exclude quantity coming back from production
+ in_qty -= min(abs(qty_production), in_qty)
+ unit_price = move.get_cost_price(product_cost_price=cost_price)
+ if quantity + in_qty > 0 and quantity >= 0:
+ cost_price = (
+ (cost_price * quantity) + (unit_price * in_qty)
+ ) / (quantity + in_qty)
+ elif in_qty > 0:
+ cost_price = unit_price
+ current_cost_price = round_price(cost_price)
+ quantity += qty
+ if production_move(move):
+ qty_production += qty
+
+ Move.write([
+ m for m in current_moves
+ if m.cost_price != current_cost_price],
+ dict(cost_price=current_cost_price))
+
+ for revision in revisions:
+ cost_price = revision.get_cost_price(cost_price)
+ return cost_price
+
+ @classmethod
+ def view_attributes(cls):
+ return super().view_attributes() + [
+ ('/tree/field[@name="quantity"]',
+ 'visual', If(Eval('quantity', 0) < 0, 'danger', '')),
+ ('/tree/field[@name="forecast_quantity"]',
+ 'visual', If(Eval('forecast_quantity', 0) < 0, 'warning', '')),
+ ]
+
+
+class ProductByLocationContext(ModelView):
+ 'Product by Location'
+ __name__ = 'product.by_location.context'
+ forecast_date = fields.Date(
+ 'At Date',
+ help="The date for which the stock quantity is calculated.\n"
+ "* An empty value calculates as far ahead as possible.\n"
+ "* A date in the past will provide historical values.")
+ stock_date_end = fields.Function(fields.Date('At Date'),
+ 'on_change_with_stock_date_end')
+
+ @staticmethod
+ def default_forecast_date():
+ Date = Pool().get('ir.date')
+ return Date.today()
+
+ @fields.depends('forecast_date')
+ def on_change_with_stock_date_end(self, name=None):
+ if self.forecast_date is None:
+ return datetime.date.max
+ return self.forecast_date
+
+
+class OpenProductQuantitiesByWarehouse(Wizard):
+ "Open Product Quantities By Warehouse"
+ __name__ = 'stock.product_quantities_warehouse.open'
+ start_state = 'open_'
+ open_ = StateAction('stock.act_product_quantities_warehouse')
+
+ def do_open_(self, action):
+ encoder = PYSONEncoder()
+ action['pyson_context'] = encoder.encode(self.get_context())
+ action['pyson_search_value'] = encoder.encode(self.get_search_value())
+ action['pyson_domain'] = encoder.encode(self.get_domain())
+ action['name'] += '(' + self.record.rec_name + ')'
+ return action, {}
+
+ def get_context(self):
+ context = {}
+ if issubclass(self.model, ShipmentAssignMixin):
+ context['product_template'] = None
+ context['product'] = [
+ m.product.id for m in self.record.assign_moves]
+ warehouse = getattr(self.record, 'warehouse', None)
+ if self.model == 'stock.shipment.internal':
+ warehouse = self.record.from_location.warehouse
+ if warehouse:
+ context['warehouse'] = warehouse.id
+ return context
+
+ def get_search_value(self):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ today = Date.today()
+ value = [('date', '>=', today)]
+ if (getattr(self.record, 'planned_date', None)
+ and self.record.planned_date >= today):
+ value.append(('date', '<=', self.record.planned_date))
+ return value
+
+ def get_domain(self):
+ if issubclass(self.model, ShipmentAssignMixin):
+ return [('product', 'in', [
+ str(m.product) for m in self.record.assign_moves])]
+ return []
+
+
+class ProductQuantitiesByWarehouse(ModelSQL, ModelView):
+ 'Product Quantities By Warehouse'
+ __name__ = 'stock.product_quantities_warehouse'
+
+ class _Date(fields.Date):
+ def get(self, ids, model, name, values=None):
+ if values is None:
+ values = {}
+ result = {}
+ for v in values:
+ date = v[name]
+ # SQLite does not convert to date
+ if isinstance(date, str):
+ date = datetime.date.fromisoformat(date)
+ result[v['id']] = date
+ return result
+
+ product = fields.Reference("Product", [
+ ('product.product', "Variant"),
+ ('product.template', "Product"),
+ ])
+ date = _Date('Date')
+ quantity = fields.Function(fields.Float('Quantity'), 'get_quantity')
+ company = fields.Many2One('company.company', "Company")
+
+ del _Date
+
+ @classmethod
+ def __setup__(cls):
+ super(ProductQuantitiesByWarehouse, cls).__setup__()
+ cls._order.insert(0, ('date', 'ASC'))
+
+ @classmethod
+ def table_query(cls):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Location = pool.get('stock.location')
+ Product = pool.get('product.product')
+ Date = pool.get('ir.date')
+ move = from_ = Move.__table__()
+ context = Transaction().context
+ today = Date.today()
+
+ if context.get('product_template') is not None:
+ product_template = context['product_template']
+ if isinstance(product_template, int):
+ product_template = [product_template]
+ product = Product.__table__()
+ from_ = move.join(product, condition=move.product == product.id)
+ product_clause = product.template.in_(product_template or [-1])
+ product_column = Concat('product.template,', product.template)
+ products = [('product.template', i) for i in product_template]
+ else:
+ product = context.get('product')
+ if product is None:
+ product = []
+ if isinstance(product, int):
+ product = [product]
+ product_clause = move.product.in_(product or [-1])
+ product_column = Concat('product.product,', move.product)
+ products = [('product.product', i) for i in product]
+
+ if 'warehouse' in context:
+ warehouse = Location(context.get('warehouse'))
+ if context.get('stock_skip_warehouse'):
+ location_id = warehouse.storage_location.id
+ else:
+ location_id = warehouse.id
+ else:
+ location_id = -1
+ warehouse = With('id', query=Location.search([
+ ('parent', 'child_of', [location_id]),
+ ], query=True, order=[]))
+ date_column = Coalesce(move.effective_date, move.planned_date)
+ query = (from_.select(
+ Max(move.id * 3).as_('id'),
+ Literal(0).as_('create_uid'),
+ CurrentTimestamp().as_('create_date'),
+ Literal(None).as_('write_uid'),
+ Literal(None).as_('write_date'),
+ product_column.as_('product'),
+ date_column.as_('date'),
+ move.company.as_('company'),
+ where=product_clause
+ & (
+ (move.from_location.in_(
+ warehouse.select(warehouse.id))
+ & ~move.to_location.in_(
+ warehouse.select(warehouse.id)))
+ | (~move.from_location.in_(
+ warehouse.select(warehouse.id))
+ & move.to_location.in_(
+ warehouse.select(warehouse.id))))
+ & ((date_column < today) & (move.state == 'done')
+ | (date_column > today)),
+ group_by=(date_column, product_column, move.company),
+ with_=warehouse))
+ for model, id_ in products:
+ gap = ['product.template', 'product.product'].index(model) + 1
+ query |= Select([
+ Literal(id_ * 3 + gap).as_('id'),
+ Literal(0).as_('create_uid'),
+ CurrentTimestamp().as_('create_date'),
+ Literal(None).as_('write_uid'),
+ Literal(None).as_('write_date'),
+ Literal('%s,%s' % (model, id_)).as_('product'),
+ Literal(today).as_('date'),
+ Literal(context.get('company', -1)).as_('company'),
+ ])
+ return query
+
+ @classmethod
+ def parse_view(cls, tree, type, *args, **kwargs):
+ pool = Pool()
+ Product = pool.get('product.product')
+ Template = pool.get('product.template')
+ context = Transaction().context
+ if kwargs.get('view_depends') is None:
+ view_depends = []
+ else:
+ view_depends = kwargs['view_depends'].copy()
+ kwargs['view_depends'] = view_depends
+ if type == 'graph':
+ encoder = PYSONEncoder()
+ if context.get('product_template') is not None:
+ product_template = context['product_template']
+ if isinstance(product_template, int):
+ product_template = [product_template]
+ records = Template.browse(product_template)
+ elif context.get('product'):
+ product = context['product']
+ if product is None:
+ product = -1
+ if isinstance(product, int):
+ product = [product]
+ records = Product.browse(product)
+ else:
+ records = []
+ if len(records) > 1:
+ quantity_node, = tree.xpath('//y/field[@name="quantity"]')
+ parent = quantity_node.getparent()
+ parent.remove(quantity_node)
+ for record in records:
+ node = deepcopy(quantity_node)
+ node.set('key', str(record.id))
+ node.set('string', record.rec_name)
+ node.set('domain', encoder.encode(
+ Eval('product') == str(record)))
+ node.set('fill', '0')
+ parent.append(node)
+ graph, = tree.xpath('/graph')
+ graph.set('legend', '1')
+ view_depends.append('product')
+ return super().parse_view(tree, type, *args, **kwargs)
+
+ @classmethod
+ def get_quantity(cls, lines, name):
+ Product = Pool().get('product.product')
+ trans_context = Transaction().context
+
+ if trans_context.get('product_template') is not None:
+ grouping = ('product.template',)
+ product_template = trans_context['product_template']
+ if isinstance(product_template, int):
+ product_template = [product_template]
+ grouping_filter = (product_template,)
+ else:
+ grouping = ('product',)
+ product = trans_context.get('product', -1)
+ if product is None:
+ product = -1
+ if isinstance(product, int):
+ product = [product]
+ grouping_filter = (product,)
+ warehouse_id = trans_context.get('warehouse')
+
+ def cast_date(date):
+ if isinstance(date, str):
+ date = datetime.date.fromisoformat(date)
+ return date
+
+ dates = sorted({cast_date(l.date) for l in lines})
+ quantities = {}
+ keys = set()
+ date_start = None
+ for date in dates:
+ context = {
+ 'stock_date_start': date_start,
+ 'stock_date_end': date,
+ 'forecast': True,
+ }
+ with Transaction().set_context(**context):
+ quantities[date] = Product.products_by_location(
+ [warehouse_id],
+ grouping=grouping,
+ grouping_filter=grouping_filter,
+ with_childs=True)
+ keys.update(quantities[date])
+ try:
+ date_start = date + datetime.timedelta(1)
+ except OverflowError:
+ pass
+ cumulate = defaultdict(lambda: 0)
+ for date in dates:
+ for key in keys:
+ cumulate[key] += quantities[date][key]
+ quantities[date][key] = cumulate[key]
+
+ return {
+ l.id: quantities[cast_date(l.date)].get(
+ (warehouse_id, int(l.product)), 0)
+ for l in lines}
+
+ def get_rec_name(self, name):
+ return self.product.rec_name if self.product else ''
+
+
+class ProductQuantitiesByWarehouseContext(ModelView):
+ 'Product Quantities By Warehouse'
+ __name__ = 'stock.product_quantities_warehouse.context'
+ warehouse = fields.Many2One('stock.location', 'Warehouse', required=True,
+ domain=[
+ ('type', '=', 'warehouse'),
+ ],
+ help="The warehouse for which the quantities will be calculated.")
+ stock_skip_warehouse = fields.Boolean(
+ "Only storage zone",
+ help="Check to use only the quantity of the storage zone.")
+
+ @classmethod
+ def default_warehouse(cls):
+ Location = Pool().get('stock.location')
+ return Location.get_default_warehouse()
+
+ @classmethod
+ def default_stock_skip_warehouse(cls):
+ return Transaction().context.get('stock_skip_warehouse')
+
+
+class OpenProductQuantitiesByWarehouseMove(Wizard):
+ "Open Product Quantities By Warehouse Moves"
+ __name__ = 'stock.product_quantities_warehouse.move.open'
+ start_state = 'open_'
+ open_ = StateAction('stock.act_product_quantities_warehouse_move')
+
+ def do_open_(self, action):
+ encoder = PYSONEncoder()
+ action['pyson_context'] = '{}'
+ action['pyson_search_value'] = encoder.encode(
+ [('date', '>=', self.record.date)])
+ action['pyson_domain'] = encoder.encode(
+ [('product', '=', str(self.record.product))])
+ action['name'] += ' (' + self.record.rec_name + ')'
+ return action, {}
+
+
+class ProductQuantitiesByWarehouseMove(ModelSQL, ModelView):
+ "Product Quantities By Warehouse Moves"
+ __name__ = 'stock.product_quantities_warehouse.move'
+
+ product = fields.Reference("Product", [
+ ('product.product', "Variant"),
+ ('product.template', "Product"),
+ ])
+ date = fields.Date("Date")
+ move = fields.Many2One('stock.move', "Move")
+ origin = fields.Reference("Origin", selection='get_origin')
+ document = fields.Function(
+ fields.Reference("Document", selection='get_documents'),
+ 'get_document')
+ quantity = fields.Float("Quantity")
+ cumulative_quantity_start = fields.Function(
+ fields.Float("Cumulative Quantity Start"), 'get_cumulative_quantity')
+ cumulative_quantity_delta = fields.Float("Cumulative Quantity Delta")
+ cumulative_quantity_end = fields.Function(
+ fields.Float("Cumulative Quantity End"), 'get_cumulative_quantity')
+ company = fields.Many2One('company.company', "Company")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._order.insert(0, ('date', 'ASC'))
+
+ @classmethod
+ def table_query(cls):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Product = pool.get('product.product')
+ move = from_ = Move.__table__()
+ transaction = Transaction()
+ context = transaction.context
+ database = transaction.database
+ today = Date.today()
+
+ if context.get('product_template') is not None:
+ product_template = context['product_template']
+ if isinstance(product_template, int):
+ product_template = [product_template]
+ product = Product.__table__()
+ from_ = move.join(product, condition=move.product == product.id)
+ product_clause = product.template.in_(product_template or [-1])
+ product_column = Concat('product.template,', product.template)
+ else:
+ product = context.get('product', -1)
+ if product is None:
+ product = -1
+ if isinstance(product, int):
+ product = [product]
+ product_clause = move.product.in_(product or [-1])
+ product_column = Concat('product.product,', move.product)
+
+ if 'warehouse' in context:
+ warehouse = Location(context.get('warehouse'))
+ if context.get('stock_skip_warehouse'):
+ location_id = warehouse.storage_location.id
+ else:
+ location_id = warehouse.id
+ else:
+ location_id = -1
+ warehouse = With('id', query=Location.search([
+ ('parent', 'child_of', [location_id]),
+ ], query=True, order=[]))
+ date_column = Coalesce(move.effective_date, move.planned_date)
+ quantity = Case(
+ (move.to_location.in_(warehouse.select(warehouse.id)),
+ move.internal_quantity),
+ else_=-move.internal_quantity)
+ if database.has_window_functions():
+ cumulative_quantity_delta = Sum(
+ quantity,
+ window=Window(
+ [product_column, date_column], order_by=[move.id.asc]))
+ else:
+ cumulative_quantity_delta = Literal(0)
+ return (from_.select(
+ move.id.as_('id'),
+ Literal(0).as_('create_uid'),
+ CurrentTimestamp().as_('create_date'),
+ Literal(None).as_('write_uid'),
+ Literal(None).as_('write_date'),
+ product_column.as_('product'),
+ date_column.as_('date'),
+ move.id.as_('move'),
+ move.origin.as_('origin'),
+ quantity.as_('quantity'),
+ cumulative_quantity_delta.as_('cumulative_quantity_delta'),
+ move.company.as_('company'),
+ where=product_clause
+ & (
+ (move.from_location.in_(
+ warehouse.select(warehouse.id))
+ & ~move.to_location.in_(
+ warehouse.select(warehouse.id)))
+ | (~move.from_location.in_(
+ warehouse.select(warehouse.id))
+ & move.to_location.in_(
+ warehouse.select(warehouse.id))))
+ & ((date_column < today) & (move.state == 'done')
+ | (date_column >= today) & (move.state != 'cancelled')),
+ with_=warehouse))
+
+ @classmethod
+ def get_origin(cls):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ return Move.get_origin()
+
+ @classmethod
+ def _get_document_models(cls):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ return [m for m, _ in Move.get_shipment() if m]
+
+ @classmethod
+ def get_documents(cls):
+ pool = Pool()
+ Model = pool.get('ir.model')
+ get_name = Model.get_name
+ models = cls._get_document_models()
+ return [(None, '')] + [(m, get_name(m)) for m in models]
+
+ def get_document(self, name):
+ if self.move and self.move.shipment:
+ return str(self.move.shipment)
+
+ @classmethod
+ def get_cumulative_quantity(cls, records, names):
+ pool = Pool()
+ Product = pool.get('product.product')
+ transaction = Transaction()
+ database = transaction.database
+ trans_context = transaction.context
+
+ if trans_context.get('product_template') is not None:
+ grouping = ('product.template',)
+ product_template = trans_context['product_template']
+ if isinstance(product_template, int):
+ product_template = [product_template]
+ grouping_filter = (product_template,)
+ else:
+ grouping = ('product',)
+ product = trans_context.get('product', -1)
+ if product is None:
+ product = -1
+ if isinstance(product, int):
+ product = [product]
+ grouping_filter = (product,)
+ warehouse_id = trans_context.get('warehouse')
+
+ def cast_date(date):
+ if isinstance(date, str):
+ date = datetime.date.fromisoformat(date)
+ return date
+
+ dates = sorted({cast_date(r.date) for r in records})
+ quantities = {}
+ keys = set()
+ date_start = None
+ for date in dates:
+ try:
+ context = {
+ 'stock_date_start': date_start,
+ 'stock_date_end': date - datetime.timedelta(days=1),
+ 'forecast': True,
+ }
+ except OverflowError:
+ pass
+ with Transaction().set_context(**context):
+ quantities[date] = Product.products_by_location(
+ [warehouse_id],
+ grouping=grouping,
+ grouping_filter=grouping_filter,
+ with_childs=True)
+ keys.update(quantities[date])
+ date_start = date
+ cumulate = defaultdict(lambda: 0)
+ for date in dates:
+ for key in keys:
+ cumulate[key] += quantities[date][key]
+ quantities[date][key] = cumulate[key]
+
+ result = {}
+ if database.has_window_functions():
+ if 'cumulative_quantity_start' in names:
+ result['cumulative_quantity_start'] = {
+ r.id: (
+ quantities[cast_date(r.date)].get(
+ (warehouse_id, int(r.product)), 0)
+ + r.cumulative_quantity_delta
+ - r.quantity)
+ for r in records}
+ if 'cumulative_quantity_end' in names:
+ result['cumulative_quantity_end'] = {
+ r.id: (
+ quantities[cast_date(r.date)].get(
+ (warehouse_id, int(r.product)), 0)
+ + r.cumulative_quantity_delta)
+ for r in records}
+ else:
+ values = {
+ r.id: quantities[cast_date(r.date)].get(
+ (warehouse_id, int(r.product)), 0)
+ for r in records}
+ for name in names:
+ result[name] = values
+ return result
+
+ def get_rec_name(self, name):
+ return self.move.rec_name
+
+
+class RecomputeCostPrice(Wizard):
+ 'Recompute Cost Price'
+ __name__ = 'product.recompute_cost_price'
+ start = StateView(
+ 'product.recompute_cost_price.start',
+ 'stock.recompute_cost_price_start_view_form', [
+ Button("Cancel", 'end'),
+ Button("Recompute", 'recompute', default=True)])
+ recompute = StateTransition()
+
+ def default_start(self, fields):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Product = pool.get('product.product')
+
+ if self.model.__name__ == 'product.product':
+ products = self.records
+ elif self.model.__name__ == 'product.template':
+ templates = self.records
+ products = sum((t.products for t in templates), ())
+ else:
+ products = []
+
+ from_ = None
+ for sub_products in grouped_slice(products):
+ moves = Move.search([
+ ('unit_price_updated', '=', True),
+ Product._domain_moves_cost(),
+ ('product', 'in', [p.id for p in sub_products]),
+ ],
+ order=[('effective_date', 'ASC')],
+ limit=1)
+ if moves:
+ move, = moves
+ from_ = min(from_ or datetime.date.max, move.effective_date)
+ return {'from_': from_}
+
+ def transition_recompute(self):
+ self.model.recompute_cost_price(self.records, start=self.start.from_)
+ return 'end'
+
+
+class RecomputeCostPriceStart(ModelView):
+ "Recompute Cost Price"
+ __name__ = 'product.recompute_cost_price.start'
+ from_ = fields.Date("From")
+
+
+class ModifyCostPrice(Wizard):
+ "Modify Cost Price"
+ __name__ = 'product.modify_cost_price'
+ start = StateView(
+ 'product.modify_cost_price.start',
+ 'stock.product_modify_cost_price_start_form', [
+ Button("Cancel", 'end', 'tryton-cancel'),
+ Button("OK", 'modify', default=True),
+ ])
+ modify = StateTransition()
+
+ def transition_modify(self):
+ pool = Pool()
+ Product = pool.get('product.product')
+ Revision = pool.get('product.cost_price.revision')
+ Date = pool.get('ir.date')
+ today = Date.today()
+ revisions = []
+ costs = defaultdict(list)
+ if self.model.__name__ == 'product.product':
+ records = list(self.records)
+ for product in list(records):
+ revision = self.get_revision(Revision)
+ revision.product = product
+ revision.template = product.template
+ revisions.append(revision)
+ if ((
+ product.cost_price_method == 'fixed'
+ and revision.date == today)
+ or product.type == 'service'):
+ cost = revision.get_cost_price(product.cost_price)
+ costs[cost].append(product)
+ records.remove(product)
+ elif self.model.__name__ == 'product.template':
+ records = list(self.records)
+ for template in list(records):
+ revision = self.get_revision(Revision)
+ revision.template = template
+ revisions.append(revision)
+ if ((
+ template.cost_price_method == 'fixed'
+ and revision.date == today)
+ or template.type == 'service'):
+ for product in template.products:
+ cost = revision.get_cost_price(product.cost_price)
+ costs[cost].append(product)
+ records.remove(template)
+ Revision.save(revisions)
+ if costs:
+ Product.update_cost_price(costs)
+ if records:
+ start = min((r.date for r in revisions), default=None)
+ self.model.recompute_cost_price(records, start=start)
+ return 'end'
+
+ def get_revision(self, Revision):
+ return Revision(
+ company=Transaction().context.get('company'),
+ date=self.start.date,
+ cost_price=self.start.cost_price,
+ )
+
+
+class ModifyCostPriceStart(ModelView):
+ "Modify Cost Price"
+ __name__ = 'product.modify_cost_price.start'
+ date = fields.Date("Date", required=True)
+ cost_price = fields.Char(
+ "New Cost Price", required=True,
+ help="Python expression that will be evaluated with:\n"
+ "- cost_price: the current cost price of the product")
+
+ @classmethod
+ def default_date(cls):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ return Date.today()
+
+ @classmethod
+ def default_cost_price(cls):
+ return 'cost_price'
+
+
+class CostPriceRevision(ModelSQL, ModifyCostPriceStart):
+ "Product Cost Price Revision"
+ __name__ = 'product.cost_price.revision'
+ template = fields.Many2One(
+ 'product.template', "Product",
+ ondelete='CASCADE', required=True,
+ domain=[
+ If(Bool(Eval('product')),
+ ('products', '=', Eval('product')),
+ ()),
+ ],
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'})
+ product = fields.Many2One(
+ 'product.product', "Variant",
+ ondelete='CASCADE',
+ domain=[
+ If(Bool(Eval('template')),
+ ('template', '=', Eval('template')),
+ ()),
+ ],
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'})
+ company = fields.Many2One(
+ 'company.company', "Company", ondelete='CASCADE', required=True)
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.add(
+ Index(
+ t,
+ (t.product, Index.Equality()),
+ (t.template, Index.Equality()),
+ (t.company, Index.Equality())))
+ cls._order.insert(0, ('date', 'DESC'))
+
+ @classmethod
+ def default_company(cls):
+ return Transaction().context.get('company')
+
+ @fields.depends('product', '_parent_product.template')
+ def on_change_product(self):
+ if self.product:
+ self.template = self.product.template
+
+ @classmethod
+ def validate_fields(cls, revisions, field_names):
+ super().validate_fields(revisions, field_names)
+ cls.check_cost_price(revisions, field_names)
+
+ @classmethod
+ def check_cost_price(cls, revisions, field_names):
+ if field_names and 'cost_price' not in field_names:
+ return
+ for revision in revisions:
+ try:
+ if not isinstance(
+ revision.get_cost_price(Decimal(0)), Decimal):
+ raise ValueError
+ except Exception as exception:
+ product = revision.product or revision.template
+ raise ProductCostPriceError(
+ gettext('stock.msg_invalid_cost_price',
+ cost_price=revision.cost_price,
+ product=product.rec_name,
+ exception=exception)) from exception
+
+ def get_cost_price(self, cost_price, **context):
+ context.setdefault('names', {})['cost_price'] = cost_price
+ context.setdefault('functions', {})['Decimal'] = Decimal
+ return simple_eval(decistmt(self.cost_price), **context)
+
+ @classmethod
+ def _get_for_product_domain(cls):
+ context = Transaction().context
+ return [
+ ('company', '=', context.get('company')),
+ ]
+
+ @classmethod
+ def get_for_product(cls, product):
+ revisions = cls.search([
+ cls._get_for_product_domain(),
+ ['OR',
+ ('product', '=', product.id),
+ [
+ ('template', '=', product.template.id),
+ ('product', '=', None),
+ ],
+ ],
+ ],
+ order=[('date', 'ASC'), ('id', 'ASC')])
+ return revisions
+
+ @classmethod
+ def apply_up_to(cls, revisions, cost_price, date):
+ """Apply revision to cost price up to date
+ revisions list is modified"""
+ try:
+ while True:
+ revision = revisions.pop(0)
+ if revision.date <= date:
+ cost_price = revision.get_cost_price(cost_price)
+ else:
+ revisions.insert(0, revision)
+ break
+ except IndexError:
+ pass
+ return cost_price
diff --git a/modules/stock/product.xml b/modules/stock/product.xml
new file mode 100644
index 0000000000..eecfc41080
--- /dev/null
+++ b/modules/stock/product.xml
@@ -0,0 +1,414 @@
+
+
+
+
+
+ Recompute Cost Price
+ product.recompute_cost_price
+
+
+ form_action
+ product.product,-1
+
+
+
+ form_action
+ product.template,-1
+
+
+
+
+
+
+
+
+ product.recompute_cost_price.start
+ form
+ recompute_cost_price_start_form
+
+
+
+ product.product|recompute_cost_price_from_moves
+
+ days
+
+
+
+ product.cost_price.revision
+ form
+ product_cost_price_revision_form
+
+
+ product.cost_price.revision
+ tree
+ product_cost_price_revision_list
+
+
+
+ Cost Price Revision
+ product.cost_price.revision
+
+
+
+
+
+
+
+
+
+
+
+
+
+ form_relate
+ product.template,-1
+
+
+
+ form_relate
+ product.product,-1
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ product.modify_cost_price.start
+ form
+ product_modify_cost_price_start_form
+
+
+
+ Modify Cost Price
+ product.modify_cost_price
+
+
+ form_action
+ product.product,-1
+
+
+
+ form_action
+ product.template,-1
+
+
+
+
+
+
+
+
+ stock.location
+ tree
+ childs
+
+ location_quantity_tree
+
+
+
+ stock.location
+ form
+
+ location_quantity_form
+
+
+
+ stock.location
+ tree
+
+ location_quantity_tree
+
+
+
+ Locations Tree Quantity
+ stock.location
+
+
+ product.by_location.context
+
+
+
+
+
+
+
+
+
+
+
+
+
+ form_relate
+ product.product,-1
+
+
+
+ form_relate
+ product.template,-1
+
+
+
+
+
+
+
+
+ Locations List Quantity
+ stock.location
+
+
+ product.by_location.context
+
+
+
+
+
+
+
+ form_relate
+ product.product,-1
+
+
+
+ form_relate
+ product.template,-1
+
+
+
+
+
+
+
+
+ product.by_location.context
+ form
+ product_by_location_context_form
+
+
+
+ Products Quantities By Warehouse
+ stock.product_quantities_warehouse.open
+
+
+ form_relate
+ stock.shipment.in.return,-1
+
+
+
+ form_relate
+ stock.shipment.out,-1
+
+
+
+ form_relate
+ stock.shipment.internal,-1
+
+
+
+
+ stock.product_quantities_warehouse
+ graph
+ product_quantities_warehouse_graph
+
+
+
+ stock.product_quantities_warehouse
+ tree
+ product_quantities_warehouse_list
+
+
+
+ Product Quantities By Warehouse
+ stock.product_quantities_warehouse
+
+
+ stock.product_quantities_warehouse.context
+
+
+
+
+
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.product_quantities_warehouse.context
+ form
+ product_quantities_warehouse_context_form
+
+
+
+ form_relate
+ product.product,-1
+
+
+
+ form_relate
+ product.template,-1
+
+
+
+
+
+
+
+
+ Stock Moves
+ stock.product_quantities_warehouse.move.open
+
+
+ tree_open
+ stock.product_quantities_warehouse,-1
+
+
+
+
+ stock.product_quantities_warehouse.move
+ tree
+ product_quantities_warehouse_move_list
+
+
+
+ Stock Moves By Warehouse
+ stock.product_quantities_warehouse.move
+
+
+ stock.product_quantities_warehouse.context
+
+
+
+
+
+
+
+
+ form_relate
+ product.product,-1
+
+
+
+ form_relate
+ product.template,-1
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/res.py b/modules/stock/res.py
new file mode 100644
index 0000000000..8d9902cb54
--- /dev/null
+++ b/modules/stock/res.py
@@ -0,0 +1,51 @@
+# 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 Pool, PoolMeta
+from trytond.transaction import Transaction
+
+
+class User(metaclass=PoolMeta):
+ __name__ = 'res.user'
+
+ warehouse = fields.Many2One('stock.location',
+ "Current Warehouse",
+ domain=[('type', '=', 'warehouse')],
+ help="The warehouse that the user works at.")
+
+ @classmethod
+ def __setup__(cls):
+ super(User, cls).__setup__()
+ cls._context_fields.insert(0, 'warehouse')
+
+ @classmethod
+ def _get_preferences(cls, user, context_only=False):
+ preferences = super()._get_preferences(user, context_only=context_only)
+ if user.warehouse:
+ preferences['warehouse'] = user.warehouse.id
+ return preferences
+
+ def get_status_bar(self, name):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ status = super().get_status_bar(name)
+
+ if (self.warehouse
+ and len(Location.search([('type', '=', 'warehouse')])) > 1):
+ status += ' - %s' % self.warehouse.rec_name
+ return status
+
+ @classmethod
+ def read(cls, ids, fields_names):
+ context = Transaction().context
+ user_id = Transaction().user
+ if user_id == 0 and 'user' in Transaction().context:
+ user_id = Transaction().context['user']
+ result = super().read(ids, fields_names)
+ if ('warehouse' in fields_names
+ and context.get('warehouse')
+ and user_id in ids):
+ for values in result:
+ if values['id'] == user_id:
+ values['warehouse'] = context['warehouse']
+ return result
diff --git a/modules/stock/res.xml b/modules/stock/res.xml
new file mode 100644
index 0000000000..e75b801bee
--- /dev/null
+++ b/modules/stock/res.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ res.user
+
+ user_form
+
+
+ res.user
+
+ user_form_preferences
+
+
+
diff --git a/modules/stock/setup.py b/modules/stock/setup.py
new file mode 100755
index 0000000000..7681ff0978
--- /dev/null
+++ b/modules/stock/setup.py
@@ -0,0 +1,155 @@
+#!/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 find_packages, setup
+
+
+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_stock'
+
+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 >= 1.3.0', 'simpleeval']
+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 stock and inventory',
+ 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-stock/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/stock',
+ },
+ keywords='tryton stock',
+ package_dir={'trytond.modules.stock': '.'},
+ packages=(
+ ['trytond.modules.stock']
+ + ['trytond.modules.stock.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock': (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',
+ '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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'sparklines': ['pygal'],
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock = trytond.modules.stock
+ """,
+ )
diff --git a/modules/stock/shipment.py b/modules/stock/shipment.py
new file mode 100644
index 0000000000..c5c436f5c1
--- /dev/null
+++ b/modules/stock/shipment.py
@@ -0,0 +1,2976 @@
+# 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 functools
+from collections import defaultdict
+from functools import partial
+from itertools import groupby
+
+from sql import Null
+from sql.conditionals import Coalesce
+from sql.functions import CharLength
+
+from trytond.i18n import gettext
+from trytond.model import (
+ Index, ModelSQL, ModelView, Workflow, dualmethod, fields)
+from trytond.model.exceptions import AccessError
+from trytond.modules.company import CompanyReport
+from trytond.modules.company.model import employee_field, set_employee
+from trytond.pool import Pool
+from trytond.pyson import Bool, Eval, Id, If
+from trytond.transaction import Transaction
+from trytond.wizard import Button, StateTransition, StateView, Wizard
+
+
+class ShipmentMixin:
+ __slots__ = ()
+
+ @classmethod
+ def view_attributes(cls):
+ return super().view_attributes() + [
+ ('/tree', 'visual', If(Eval('state') == 'cancelled', 'muted', '')),
+ ]
+
+
+class ShipmentAssignMixin(ShipmentMixin):
+ __slots__ = ()
+ _assign_moves_field = None
+
+ partially_assigned = fields.Function(
+ fields.Boolean("Partially Assigned"),
+ 'get_partially_assigned',
+ searcher='search_partially_assigned')
+
+ @classmethod
+ def assign_wizard(cls, shipments):
+ raise NotImplementedError
+
+ @property
+ def assign_moves(self):
+ return getattr(self, self._assign_moves_field)
+
+ @dualmethod
+ @ModelView.button
+ def assign_try(cls, shipments):
+ raise NotImplementedError
+
+ @dualmethod
+ def assign_reset(cls, shipments):
+ cls.wait(shipments)
+
+ @dualmethod
+ @ModelView.button
+ def assign_force(cls, shipments):
+ cls.assign(shipments)
+
+ @dualmethod
+ def assign_ignore(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Move.write([
+ m for s in shipments for m in s.assign_moves
+ if m.assignation_required
+ and m.state in {'staging', 'draft'}], {
+ 'quantity': 0,
+ })
+ cls.assign(shipments)
+
+ @classmethod
+ def _get_assign_domain(cls):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ context = Transaction().context
+ return [
+ ('company', '=', context.get('company')),
+ ('state', '=', 'waiting'),
+ ('planned_date', '=', Date.today()),
+ ]
+
+ @classmethod
+ def assign_cron(cls):
+ shipments = cls.search(cls._get_assign_domain())
+ cls.assign_try(shipments)
+
+ def get_partially_assigned(self, name):
+ return (self.state != 'assigned'
+ and any(m.state == 'assigned' for m in self.assign_moves
+ if m.assignation_required))
+
+ @classmethod
+ def search_partially_assigned(cls, name, clause):
+ operators = {
+ '=': 'where',
+ '!=': 'not where',
+ }
+ reverse = {
+ '=': '!=',
+ '!=': '=',
+ }
+ if clause[1] in operators:
+ if not clause[2]:
+ operator = reverse[clause[1]]
+ else:
+ operator = clause[1]
+ return [
+ (cls._assign_moves_field, operators[operator], [
+ ('state', '=', 'assigned'),
+ ('assignation_required', '=', True),
+ ]),
+ ('state', '=', 'waiting'),
+ ]
+ else:
+ return []
+
+
+class ShipmentIn(ShipmentMixin, Workflow, ModelSQL, ModelView):
+ "Supplier Shipment"
+ __name__ = 'stock.shipment.in'
+ _rec_name = 'number'
+ effective_date = fields.Date('Effective Date',
+ states={
+ 'readonly': Eval('state').in_(['cancelled', 'done']),
+ },
+ help="When the stock was actually received.")
+ planned_date = fields.Date('Planned Date', states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="When the stock is expected to be received.")
+ company = fields.Many2One(
+ 'company.company', "Company", required=True,
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The company the shipment is associated with.")
+ reference = fields.Char(
+ "Reference",
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The supplier's identifier for the shipment.")
+ supplier = fields.Many2One('party.party', 'Supplier',
+ states={
+ 'readonly': (((Eval('state') != 'draft')
+ | Eval('incoming_moves', [0]))
+ & Eval('supplier')),
+ }, required=True,
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'},
+ help="The party that supplied the stock.")
+ supplier_location = fields.Function(fields.Many2One('stock.location',
+ 'Supplier Location'),
+ 'on_change_with_supplier_location')
+ contact_address = fields.Many2One('party.address', 'Contact Address',
+ states={
+ 'readonly': Eval('state') != 'draft',
+ }, domain=[('party', '=', Eval('supplier'))],
+ help="The address at which the supplier can be contacted.")
+ warehouse = fields.Many2One('stock.location', "Warehouse",
+ required=True, domain=[('type', '=', 'warehouse')],
+ states={
+ 'readonly': (Eval('state').in_(['cancelled', 'done'])
+ | Eval('incoming_moves', [0]) | Eval('inventory_moves', [0])),
+ },
+ help="Where the stock is received.")
+ warehouse_input = fields.Function(fields.Many2One('stock.location',
+ 'Warehouse Input'),
+ 'on_change_with_warehouse_input')
+ warehouse_storage = fields.Function(fields.Many2One('stock.location',
+ 'Warehouse Storage'),
+ 'on_change_with_warehouse_storage')
+ incoming_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
+ 'Incoming Moves',
+ add_remove=[
+ ('shipment', '=', None),
+ ('from_location', '=', Eval('supplier_location')),
+ ('state', '=', 'draft'),
+ If(Eval('warehouse_input') == Eval('warehouse_storage'),
+ ('to_location', 'child_of',
+ [Eval('warehouse_input', -1)], 'parent'),
+ ('to_location', '=', Eval('warehouse_input'))),
+ ],
+ domain=[
+ ('from_location', '=', Eval('supplier_location')),
+ If(Eval('warehouse_input') == Eval('warehouse_storage'),
+ ('to_location', 'child_of',
+ [Eval('warehouse_input', -1)], 'parent'),
+ ('to_location', '=', Eval('warehouse_input'))),
+ ('company', '=', Eval('company')),
+ ],
+ states={
+ 'readonly': (
+ Eval('state').in_(['received', 'done', 'cancelled'])
+ | ~Eval('warehouse') | ~Eval('supplier')),
+ },
+ help="The moves that bring the stock into the warehouse."),
+ 'get_incoming_moves', setter='set_incoming_moves')
+ inventory_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
+ 'Inventory Moves',
+ domain=[
+ ('from_location', '=', Eval('warehouse_input')),
+ If(~Eval('state').in_(['done', 'cancelled']),
+ ['OR',
+ ('to_location', 'child_of',
+ [Eval('warehouse_storage', -1)], 'parent'),
+ ('to_location.waste_warehouses', '=',
+ Eval('warehouse')),
+ ],
+ [],),
+ ('company', '=', Eval('company')),
+ ],
+ states={
+ 'readonly': Eval('state').in_(['draft', 'done', 'cancelled']),
+ 'invisible': (
+ Eval('warehouse_input') == Eval('warehouse_storage')),
+ },
+ help="The moves that put the stock away into the storage area."),
+ 'get_inventory_moves', setter='set_inventory_moves')
+ moves = fields.One2Many('stock.move', 'shipment', 'Moves',
+ domain=[('company', '=', Eval('company'))], readonly=True)
+ origins = fields.Function(fields.Char('Origins'), 'get_origins')
+ number = fields.Char(
+ "Number", readonly=True,
+ help="The main identifier for the shipment.")
+ received_by = employee_field("Received By")
+ done_by = employee_field("Done By")
+ state = fields.Selection([
+ ('draft', 'Draft'),
+ ('received', 'Received'),
+ ('done', 'Done'),
+ ('cancelled', 'Cancelled'),
+ ], "State", readonly=True, sort=False,
+ help="The current state of the shipment.")
+
+ @classmethod
+ def __setup__(cls):
+ cls.number.search_unaccented = False
+ cls.reference.search_unaccented = False
+ super(ShipmentIn, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.update({
+ Index(t, (t.reference, Index.Similarity())),
+ Index(
+ t,
+ (t.state, Index.Equality()),
+ where=t.state.in_(['draft', 'received'])),
+ })
+ cls._order = [
+ ('id', 'DESC'),
+ ]
+ cls._transitions |= set((
+ ('draft', 'received'),
+ ('received', 'done'),
+ ('draft', 'cancelled'),
+ ('received', 'cancelled'),
+ ('cancelled', 'draft'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': Eval('state').in_(['cancelled', 'done']),
+ 'depends': ['state'],
+ },
+ 'draft': {
+ 'invisible': Eval('state') != 'cancelled',
+ 'depends': ['state'],
+ },
+ 'receive': {
+ 'invisible': Eval('state') != 'draft',
+ 'depends': ['state'],
+ },
+ 'done': {
+ 'invisible': Eval('state') != 'received',
+ 'depends': ['state'],
+ },
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
+ cursor = Transaction().connection.cursor()
+ table = cls.__table_handler__(module_name)
+ sql_table = cls.__table__()
+
+ # Migration from 3.8: rename code into number
+ if table.column_exist('code'):
+ table.column_rename('code', 'number')
+
+ super(ShipmentIn, cls).__register__(module_name)
+
+ # Migration from 5.6: rename state cancel to cancelled
+ cursor.execute(*sql_table.update(
+ [sql_table.state], ['cancelled'],
+ where=sql_table.state == 'cancel'))
+
+ @classmethod
+ def order_number(cls, tables):
+ table, _ = tables[None]
+ return [CharLength(table.number), table.number]
+
+ @classmethod
+ def order_effective_date(cls, tables):
+ table, _ = tables[None]
+ return [Coalesce(table.effective_date, table.planned_date)]
+
+ @staticmethod
+ def default_planned_date():
+ return Pool().get('ir.date').today()
+
+ @staticmethod
+ def default_state():
+ return 'draft'
+
+ @classmethod
+ def default_warehouse(cls):
+ Location = Pool().get('stock.location')
+ return Location.get_default_warehouse()
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @fields.depends('supplier')
+ def on_change_supplier(self):
+ self.contact_address = None
+ if self.supplier:
+ self.contact_address = self.supplier.address_get()
+
+ @fields.depends('supplier')
+ def on_change_with_supplier_location(self, name=None):
+ if self.supplier and self.supplier.supplier_location:
+ return self.supplier.supplier_location.id
+
+ @classmethod
+ def default_warehouse_input(cls):
+ warehouse = cls.default_warehouse()
+ if warehouse:
+ return cls(warehouse=warehouse).on_change_with_warehouse_input()
+
+ @fields.depends('warehouse')
+ def on_change_with_warehouse_input(self, name=None):
+ if self.warehouse:
+ return self.warehouse.input_location.id
+
+ @classmethod
+ def default_warehouse_storage(cls):
+ warehouse = cls.default_warehouse()
+ if warehouse:
+ return cls(warehouse=warehouse).on_change_with_warehouse_storage()
+
+ @fields.depends('warehouse')
+ def on_change_with_warehouse_storage(self, name=None):
+ if self.warehouse:
+ return self.warehouse.storage_location.id
+
+ def get_incoming_moves(self, name):
+ moves = []
+ if self.warehouse_input == self.warehouse_storage:
+ return [m.id for m in self.moves]
+ for move in self.moves:
+ if move.to_location == self.warehouse_input:
+ moves.append(move.id)
+ return moves
+
+ @classmethod
+ def set_incoming_moves(cls, shipments, name, value):
+ if not value:
+ return
+ cls.write(shipments, {
+ 'moves': value,
+ })
+
+ def get_inventory_moves(self, name):
+ moves = []
+ for move in self.moves:
+ if move.from_location == self.warehouse_input:
+ moves.append(move.id)
+ return moves
+
+ @classmethod
+ def set_inventory_moves(cls, shipments, name, value):
+ if not value:
+ return
+ cls.write(shipments, {
+ 'moves': value,
+ })
+
+ @property
+ def _move_planned_date(self):
+ '''
+ Return the planned date for incoming moves and inventory_moves
+ '''
+ return self.planned_date, self.planned_date
+
+ @classmethod
+ def _set_move_planned_date(cls, shipments):
+ '''
+ Set planned date of moves for the shipments
+ '''
+ Move = Pool().get('stock.move')
+ to_write = []
+ for shipment in shipments:
+ dates = shipment._move_planned_date
+ incoming_date, inventory_date = dates
+ # Update planned_date only for later to not be too optimistic if
+ # the shipment is not directly received.
+ incoming_moves_to_write = [m for m in shipment.incoming_moves
+ if (m.state not in ('assigned', 'done', 'cancelled')
+ and ((m.planned_date or datetime.date.max)
+ < (incoming_date or datetime.date.max)))]
+ if incoming_moves_to_write:
+ to_write.extend((incoming_moves_to_write, {
+ 'planned_date': incoming_date,
+ }))
+ inventory_moves_to_write = [m for m in shipment.inventory_moves
+ if (m.state not in ('assigned', 'done', 'cancelled')
+ and ((m.planned_date or datetime.date.max)
+ < (inventory_date or datetime.date.max)))]
+ if inventory_moves_to_write:
+ to_write.extend((inventory_moves_to_write, {
+ 'planned_date': inventory_date,
+ }))
+ if to_write:
+ Move.write(*to_write)
+
+ def get_origins(self, name):
+ return ', '.join(set(filter(None,
+ (m.origin_name for m in self.incoming_moves))))
+
+ @classmethod
+ def create(cls, vlist):
+ pool = Pool()
+ Config = pool.get('stock.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(
+ 'shipment_in_sequence',
+ company=values.get('company', default_company)).get()
+ shipments = super(ShipmentIn, cls).create(vlist)
+ cls._set_move_planned_date(shipments)
+ return shipments
+
+ @classmethod
+ def write(cls, *args):
+ super(ShipmentIn, cls).write(*args)
+ cls._set_move_planned_date(sum(args[::2], []))
+
+ @classmethod
+ def copy(cls, shipments, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('inventory_moves', None)
+ default.setdefault('incoming_moves', None)
+ default.setdefault('number', None)
+ default.setdefault('received_by', None)
+ default.setdefault('done_by', None)
+ return super(ShipmentIn, cls).copy(shipments, default=default)
+
+ def _get_inventory_move(self, incoming_move):
+ 'Return inventory move for the incoming move'
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ if incoming_move.quantity <= 0.0:
+ return None
+ with Transaction().set_context(company=self.company.id):
+ today = Date.today()
+ move = Move()
+ move.product = incoming_move.product
+ move.uom = incoming_move.uom
+ move.quantity = incoming_move.quantity
+ move.from_location = incoming_move.to_location
+ move.to_location = self.warehouse_storage
+ move.state = Move.default_state()
+ move.planned_date = max(
+ filter(None, [self._move_planned_date[1], today]))
+ move.company = incoming_move.company
+ move.origin = incoming_move
+ return move
+
+ @classmethod
+ def create_inventory_moves(cls, shipments):
+ for shipment in shipments:
+ if shipment.warehouse_storage == shipment.warehouse_input:
+ # Do not create inventory moves
+ continue
+ # Use moves instead of inventory_moves because save reset before
+ # adding new records and as set_inventory_moves is just a proxy to
+ # moves, it will reset also the incoming_moves
+ moves = list(shipment.moves)
+ for incoming_move in shipment.incoming_moves:
+ move = shipment._get_inventory_move(incoming_move)
+ if move:
+ moves.append(move)
+ shipment.moves = moves
+ cls.save(shipments)
+
+ @classmethod
+ def delete(cls, shipments):
+ Move = Pool().get('stock.move')
+ # Cancel before delete
+ cls.cancel(shipments)
+ for shipment in shipments:
+ if shipment.state != 'cancelled':
+ raise AccessError(
+ gettext('stock.msg_shipment_delete_cancel',
+ shipment=shipment.rec_name))
+ Move.delete([m for s in shipments for m in s.moves])
+ super(ShipmentIn, cls).delete(shipments)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.cancel([m for s in shipments
+ for m in s.incoming_moves + s.inventory_moves])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.draft([m for s in shipments for m in s.incoming_moves
+ if m.state != 'staging'])
+ Move.delete([m for s in shipments for m in s.inventory_moves
+ if m.state in ('draft', 'cancelled')])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('received')
+ @set_employee('received_by')
+ def receive(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.do([m for s in shipments for m in s.incoming_moves])
+ Move.delete([m for s in shipments for m in s.inventory_moves
+ if m.state in ('draft', 'cancelled')])
+ cls.create_inventory_moves(shipments)
+ # Set received state to allow done transition
+ cls.write(shipments, {'state': 'received'})
+ to_do = [s for s in shipments
+ if s.warehouse_storage == s.warehouse_input]
+ if to_do:
+ cls.done(to_do)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @set_employee('done_by')
+ def done(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ Move.do([m for s in shipments for m in s.inventory_moves])
+ for company, c_shipments in groupby(
+ shipments, key=lambda s: s.company):
+ with Transaction().set_context(company=company.id):
+ today = Date.today()
+ cls.write([s for s in c_shipments if not s.effective_date], {
+ 'effective_date': today,
+ })
+
+
+class ShipmentInReturn(ShipmentAssignMixin, Workflow, ModelSQL, ModelView):
+ "Supplier Return Shipment"
+ __name__ = 'stock.shipment.in.return'
+ _rec_name = 'number'
+ _assign_moves_field = 'moves'
+
+ effective_date = fields.Date('Effective Date',
+ states={
+ 'readonly': Eval('state').in_(['cancelled', 'done']),
+ },
+ help="When the stock was actually returned.")
+ planned_date = fields.Date('Planned Date',
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="When the stock is expected to be returned.")
+ company = fields.Many2One(
+ 'company.company', "Company", required=True,
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The company the shipment is associated with.")
+ number = fields.Char(
+ "Number", readonly=True,
+ help="The main identifier for the shipment.")
+ reference = fields.Char(
+ "Reference",
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The supplier's identifier for the shipment.")
+ supplier = fields.Many2One('party.party', 'Supplier',
+ states={
+ 'readonly': (((Eval('state') != 'draft')
+ | Eval('moves', [0]))
+ & Eval('supplier', 0)),
+ }, required=True,
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'},
+ help="The party that supplied the stock.")
+ delivery_address = fields.Many2One('party.address', 'Delivery Address',
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ domain=['OR',
+ ('party', '=', Eval('supplier')),
+ ('warehouses', 'where', [
+ ('id', '=', Eval('warehouse', -1)),
+ If(Eval('state') == 'draft',
+ ('allow_pickup', '=', True),
+ ()),
+ ]),
+ ],
+ help="Where the stock is sent to.")
+ from_location = fields.Many2One('stock.location', "From Location",
+ required=True, states={
+ 'readonly': (Eval('state') != 'draft') | Eval('moves', [0]),
+ }, domain=[('type', 'in', ['storage', 'view'])],
+ help="Where the stock is moved from.")
+ to_location = fields.Many2One('stock.location', "To Location",
+ required=True, states={
+ 'readonly': (Eval('state') != 'draft') | Eval('moves', [0]),
+ }, domain=[('type', '=', 'supplier')],
+ help="Where the stock is moved to.")
+ warehouse = fields.Function(
+ fields.Many2One('stock.location', "Warehouse"),
+ 'on_change_with_warehouse')
+ moves = fields.One2Many('stock.move', 'shipment', 'Moves',
+ states={
+ 'readonly': (((Eval('state') != 'draft') | ~Eval('from_location'))
+ & Eval('to_location')),
+ },
+ domain=[
+ If(Eval('state') == 'draft', [
+ ('from_location', '=', Eval('from_location')),
+ ('to_location', '=', Eval('to_location')),
+ ],
+ If(~Eval('state').in_(['done', 'cancelled']), [
+ ('from_location', 'child_of',
+ [Eval('from_location', -1)], 'parent'),
+ ('to_location', 'child_of',
+ [Eval('to_location', -1)], 'parent'),
+ ],
+ [])),
+ ('company', '=', Eval('company')),
+ ],
+ help="The moves that return the stock to the supplier.")
+ origins = fields.Function(fields.Char('Origins'), 'get_origins')
+ assigned_by = employee_field("Assigned By")
+ done_by = employee_field("Done By")
+ state = fields.Selection([
+ ('draft', 'Draft'),
+ ('waiting', 'Waiting'),
+ ('assigned', 'Assigned'),
+ ('done', 'Done'),
+ ('cancelled', 'Cancelled'),
+ ], 'State', readonly=True, sort=False,
+ help="The current state of the shipment.")
+
+ @classmethod
+ def __setup__(cls):
+ cls.number.search_unaccented = False
+ cls.reference.search_unaccented = False
+ super(ShipmentInReturn, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.update({
+ Index(t, (t.reference, Index.Similarity())),
+ Index(
+ t,
+ (t.state, Index.Equality()),
+ where=t.state.in_(['draft', 'waiting', 'assigned'])),
+ })
+ cls._order = [
+ ('effective_date', 'ASC NULLS LAST'),
+ ('id', 'ASC'),
+ ]
+ cls._transitions |= set((
+ ('draft', 'waiting'),
+ ('waiting', 'assigned'),
+ ('waiting', 'draft'),
+ ('assigned', 'done'),
+ ('assigned', 'waiting'),
+ ('draft', 'cancelled'),
+ ('waiting', 'cancelled'),
+ ('assigned', 'cancelled'),
+ ('cancelled', 'draft'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': Eval('state').in_(['cancelled', 'done']),
+ 'depends': ['state'],
+ },
+ 'draft': {
+ 'invisible': ~Eval('state').in_(['waiting', 'cancelled']),
+ 'icon': If(Eval('state') == 'cancelled',
+ 'tryton-undo',
+ If(Eval('state') == 'waiting',
+ 'tryton-back',
+ 'tryton-forward')),
+ 'depends': ['state'],
+ },
+ 'wait': {
+ 'invisible': ~Eval('state').in_(['assigned', 'draft']),
+ 'icon': If(Eval('state') == 'assigned',
+ 'tryton-back', 'tryton-forward'),
+ 'depends': ['state'],
+ },
+ 'done': {
+ 'invisible': Eval('state') != 'assigned',
+ 'depends': ['state'],
+ },
+ 'assign_wizard': {
+ 'invisible': Eval('state') != 'waiting',
+ 'depends': ['state'],
+ },
+ 'assign_try': {},
+ 'assign_force': {},
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
+ cursor = Transaction().connection.cursor()
+ table = cls.__table_handler__(module_name)
+ sql_table = cls.__table__()
+
+ # Migration from 3.8: rename code into number
+ if table.column_exist('code'):
+ table.column_rename('code', 'number')
+
+ super(ShipmentInReturn, cls).__register__(module_name)
+
+ # Migration from 5.6: rename state cancel to cancelled
+ cursor.execute(*sql_table.update(
+ [sql_table.state], ['cancelled'],
+ where=sql_table.state == 'cancel'))
+
+ @classmethod
+ def order_number(cls, tables):
+ table, _ = tables[None]
+ return [CharLength(table.number), table.number]
+
+ @classmethod
+ def order_effective_date(cls, tables):
+ table, _ = tables[None]
+ return [Coalesce(table.effective_date, table.planned_date)]
+
+ @staticmethod
+ def default_state():
+ return 'draft'
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @fields.depends('supplier')
+ def on_change_supplier(self):
+ if self.supplier:
+ self.delivery_address = self.supplier.address_get('delivery')
+ self.to_location = self.supplier.supplier_location
+
+ @fields.depends('from_location')
+ def on_change_with_warehouse(self, name=None):
+ if self.from_location and self.from_location.warehouse:
+ return self.from_location.warehouse.id
+
+ @property
+ def _move_planned_date(self):
+ '''
+ Return the planned date for the moves
+ '''
+ return self.planned_date
+
+ @classmethod
+ def _set_move_planned_date(cls, shipments):
+ '''
+ Set planned date of moves for the shipments
+ '''
+ Move = Pool().get('stock.move')
+ to_write = []
+ for shipment in shipments:
+ moves = [m for m in shipment.moves
+ if (m.state not in ('assigned', 'done', 'cancelled')
+ and m.planned_date != shipment._move_planned_date)]
+ if moves:
+ to_write.extend((moves, {
+ 'planned_date': shipment._move_planned_date,
+ }))
+ if to_write:
+ Move.write(*to_write)
+
+ def get_origins(self, name):
+ return ', '.join(set(filter(None,
+ (m.origin_name for m in self.moves))))
+
+ @classmethod
+ def create(cls, vlist):
+ pool = Pool()
+ Config = pool.get('stock.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(
+ 'shipment_in_return_sequence',
+ company=values.get('company', default_company)).get()
+ shipments = super(ShipmentInReturn, cls).create(vlist)
+ cls._set_move_planned_date(shipments)
+ return shipments
+
+ @classmethod
+ def write(cls, *args):
+ super(ShipmentInReturn, cls).write(*args)
+ cls._set_move_planned_date(sum(args[::2], []))
+
+ @classmethod
+ def delete(cls, shipments):
+ Move = Pool().get('stock.move')
+ # Cancel before delete
+ cls.cancel(shipments)
+ for shipment in shipments:
+ if shipment.state != 'cancelled':
+ raise AccessError(
+ gettext('stock.msg_shipment_delete_cancel',
+ shipment=shipment.rec_name))
+ Move.delete([m for s in shipments for m in s.moves])
+ super(ShipmentInReturn, cls).delete(shipments)
+
+ @classmethod
+ def copy(cls, shipments, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('number', None)
+ default.setdefault('assigned_by', None)
+ default.setdefault('done_by', None)
+ return super(ShipmentInReturn, cls).copy(shipments, default=default)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.draft([m for s in shipments for m in s.moves
+ if m.state != 'staging'])
+ for shipment in shipments:
+ Move.write([m for m in shipment.moves
+ if m.state != 'done'], {
+ 'from_location': shipment.from_location.id,
+ 'to_location': shipment.to_location.id,
+ 'planned_date': shipment.planned_date,
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('waiting')
+ def wait(cls, shipments, moves=None):
+ """
+ If moves is set, only this subset is set to draft.
+ """
+ Move = Pool().get('stock.move')
+ if moves is None:
+ moves = sum((s.moves for s in shipments), ())
+ else:
+ assert all(m.shipment in shipments for m in moves)
+ Move.draft(moves)
+ cls._set_move_planned_date(shipments)
+
+ @classmethod
+ @Workflow.transition('assigned')
+ @set_employee('assigned_by')
+ def assign(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.assign([m for s in shipments for m in s.assign_moves])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @set_employee('done_by')
+ def done(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+
+ Move.do([m for s in shipments for m in s.moves])
+ for company, c_shipments in groupby(
+ shipments, key=lambda s: s.company):
+ with Transaction().set_context(company=company.id):
+ today = Date.today()
+ cls.write([s for s in c_shipments if not s.effective_date], {
+ 'effective_date': today,
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.cancel([m for s in shipments for m in s.moves])
+
+ @classmethod
+ @ModelView.button_action('stock.wizard_shipment_in_return_assign')
+ def assign_wizard(cls, shipments):
+ pass
+
+ @dualmethod
+ @ModelView.button
+ def assign_try(cls, shipments, with_childs=None):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ to_assign = defaultdict(list)
+ for shipment in shipments:
+ location_type = shipment.from_location.type
+ for move in shipment.assign_moves:
+ if move.assignation_required:
+ to_assign[location_type].append(move)
+ success = True
+ for location_type, moves in to_assign.items():
+ if with_childs is None:
+ _with_childs = location_type == 'view'
+ elif not with_childs and location_type == 'view':
+ _with_childs = True
+ else:
+ _with_childs = with_childs
+ if not Move.assign_try(moves, with_childs=_with_childs):
+ success = False
+ if success:
+ cls.assign(shipments)
+ return success
+
+ @classmethod
+ def _get_reschedule_domain(cls, date):
+ return [
+ ('state', '=', 'waiting'),
+ ('planned_date', '<', date),
+ ]
+
+ @classmethod
+ def reschedule(cls, date=None):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ if date is None:
+ date = Date.today()
+ shipments = cls.search(cls._get_reschedule_domain(date))
+ cls.write(shipments, {'planned_date': date})
+
+
+class ShipmentOut(ShipmentAssignMixin, Workflow, ModelSQL, ModelView):
+ "Customer Shipment"
+ __name__ = 'stock.shipment.out'
+ _rec_name = 'number'
+ _assign_moves_field = 'moves'
+ effective_date = fields.Date('Effective Date',
+ states={
+ 'readonly': Eval('state').in_(['cancelled', 'done']),
+ },
+ help="When the stock was actually sent.")
+ planned_date = fields.Date('Planned Date',
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="When the stock is expected to be sent.")
+ company = fields.Many2One(
+ 'company.company', "Company", required=True,
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The company the shipment is associated with.")
+ customer = fields.Many2One('party.party', 'Customer', required=True,
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | Eval('outgoing_moves', [0])),
+ },
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'},
+ help="The party that purchased the stock.")
+ customer_location = fields.Function(fields.Many2One('stock.location',
+ 'Customer Location'), 'on_change_with_customer_location')
+ delivery_address = fields.Many2One('party.address',
+ 'Delivery Address', required=True,
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ domain=['OR',
+ ('party', '=', Eval('customer')),
+ ('warehouses', 'where', [
+ ('id', '=', Eval('warehouse', -1)),
+ If(Eval('state') == 'draft',
+ ('allow_pickup', '=', True),
+ ()),
+ ]),
+ ],
+ help="Where the stock is sent to.")
+ reference = fields.Char(
+ "Reference",
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The customer's identifier for the shipment.")
+ warehouse = fields.Many2One('stock.location', "Warehouse", required=True,
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | Eval('outgoing_moves', [0]) | Eval('inventory_moves', [0])),
+ }, domain=[('type', '=', 'warehouse')],
+ help="Where the stock is sent from.")
+ warehouse_storage = fields.Function(fields.Many2One('stock.location',
+ 'Warehouse Storage'), 'on_change_with_warehouse_storage')
+ warehouse_output = fields.Function(fields.Many2One('stock.location',
+ 'Warehouse Output'), 'on_change_with_warehouse_output')
+ outgoing_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
+ 'Outgoing Moves',
+ domain=[
+ ('from_location', '=', Eval('warehouse_output')),
+ ('to_location', '=', Eval('customer_location')),
+ ('company', '=', Eval('company')),
+ ],
+ states={
+ 'readonly': (Eval('state').in_(
+ If(Eval('warehouse_storage')
+ == Eval('warehouse_output'),
+ ['done', 'cancelled'],
+ ['waiting', 'packed', 'done', 'cancelled'],
+ ))
+ | ~Eval('warehouse') | ~Eval('customer')),
+ },
+ help="The moves that send the stock to the customer."),
+ 'get_outgoing_moves', setter='set_outgoing_moves')
+ inventory_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
+ 'Inventory Moves',
+ domain=[
+ If(Eval('state').in_(['waiting']),
+ ('from_location', 'child_of',
+ [Eval('warehouse_storage', -1)], 'parent'),
+ ()),
+ ('to_location', '=', Eval('warehouse_output')),
+ ('company', '=', Eval('company')),
+ ],
+ states={
+ 'readonly': Eval('state').in_(
+ ['draft', 'assigned', 'packed', 'done', 'cancelled']),
+ 'invisible': (
+ Eval('warehouse_storage') == Eval('warehouse_output')),
+ },
+ help="The moves that pick the stock from the storage area."),
+ 'get_inventory_moves', setter='set_inventory_moves')
+ moves = fields.One2Many('stock.move', 'shipment', 'Moves',
+ domain=[('company', '=', Eval('company'))], readonly=True)
+ origins = fields.Function(fields.Char('Origins'), 'get_origins')
+ number = fields.Char(
+ "Number", readonly=True,
+ help="The main identifier for the shipment.")
+ picked_by = employee_field("Picked By")
+ packed_by = employee_field("Packed By")
+ done_by = employee_field("Done By")
+ state = fields.Selection([
+ ('draft', 'Draft'),
+ ('waiting', 'Waiting'),
+ ('assigned', 'Assigned'),
+ ('picked', 'Picked'),
+ ('packed', 'Packed'),
+ ('done', 'Done'),
+ ('cancelled', 'Cancelled'),
+ ], "State", readonly=True, sort=False,
+ help="The current state of the shipment.")
+
+ @classmethod
+ def __setup__(cls):
+ cls.number.search_unaccented = False
+ cls.reference.search_unaccented = False
+ super(ShipmentOut, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.update({
+ Index(t, (t.reference, Index.Similarity())),
+ Index(
+ t,
+ (t.state, Index.Equality()),
+ where=t.state.in_([
+ 'draft', 'waiting', 'assigned',
+ 'picked', 'packed'])),
+ })
+ cls._order = [
+ ('effective_date', 'ASC NULLS LAST'),
+ ('id', 'ASC'),
+ ]
+ cls._transitions |= set((
+ ('draft', 'waiting'),
+ ('waiting', 'assigned'),
+ ('waiting', 'picked'),
+ ('assigned', 'picked'),
+ ('waiting', 'packed'),
+ ('picked', 'packed'),
+ ('packed', 'done'),
+ ('packed', 'waiting'),
+ ('packed', 'picked'),
+ ('assigned', 'waiting'),
+ ('waiting', 'waiting'),
+ ('waiting', 'draft'),
+ ('draft', 'cancelled'),
+ ('waiting', 'cancelled'),
+ ('assigned', 'cancelled'),
+ ('picked', 'cancelled'),
+ ('packed', 'cancelled'),
+ ('cancelled', 'draft'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': Eval('state').in_(['cancelled', 'done']),
+ 'depends': ['state'],
+ },
+ 'draft': {
+ 'invisible': ~Eval('state').in_(['waiting', 'cancelled']),
+ 'icon': If(Eval('state') == 'cancelled',
+ 'tryton-undo',
+ If(Eval('state') == 'waiting',
+ 'tryton-back',
+ 'tryton-forward')),
+ 'depends': ['state'],
+ },
+ 'wait': {
+ 'invisible': (
+ ~(Eval('state').in_(['assigned', 'waiting', 'draft'])
+ | ((Eval('state') == 'packed')
+ & (Eval('warehouse_storage')
+ == Eval('warehouse_output'))))),
+ 'icon': If(Eval('state').in_(['assigned', 'packed']),
+ 'tryton-back',
+ If(Eval('state') == 'waiting',
+ 'tryton-clear',
+ 'tryton-forward')),
+ 'depends': [
+ 'state', 'warehouse_storage', 'warehouse_output'],
+ },
+ 'pick': {
+ 'invisible': If(
+ Eval('warehouse_storage') == Eval('warehouse_output'),
+ True,
+ ~Eval('state').in_(['assigned', 'packed'])),
+ 'icon': If(Eval('state') == 'packed',
+ 'tryton-back',
+ 'tryton-forward'),
+ 'depends': [
+ 'state', 'warehouse_storage', 'warehouse_output'],
+ },
+ 'pack': {
+ 'invisible': If(
+ Eval('warehouse_storage') == Eval('warehouse_output'),
+ Eval('state') != 'waiting',
+ Eval('state') != 'picked'),
+ 'depends': [
+ 'state', 'warehouse_storage', 'warehouse_output'],
+ },
+ 'done': {
+ 'invisible': Eval('state') != 'packed',
+ },
+ 'assign_wizard': {
+ 'invisible': ((Eval('state') != 'waiting')
+ | (Eval('warehouse_storage')
+ == Eval('warehouse_output'))),
+ },
+ 'assign_try': {},
+ 'assign_force': {},
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
+ cursor = Transaction().connection.cursor()
+ table = cls.__table_handler__(module_name)
+ sql_table = cls.__table__()
+
+ # Migration from 3.8: rename code into number
+ if table.column_exist('code'):
+ table.column_rename('code', 'number')
+
+ # Migration from 5.6: rename assigned_by into picked_by
+ if table.column_exist('assigned_by'):
+ table.column_rename('assigned_by', 'picked_by')
+
+ super(ShipmentOut, cls).__register__(module_name)
+
+ # Migration from 5.6: rename state cancel to cancelled
+ cursor.execute(*sql_table.update(
+ [sql_table.state], ['cancelled'],
+ where=sql_table.state == 'cancel'))
+
+ @classmethod
+ def order_number(cls, tables):
+ table, _ = tables[None]
+ return [CharLength(table.number), table.number]
+
+ @classmethod
+ def order_effective_date(cls, tables):
+ table, _ = tables[None]
+ return [Coalesce(table.effective_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()
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @fields.depends('customer', 'warehouse')
+ def on_change_customer(self):
+ self.delivery_address = None
+ if self.customer:
+ with Transaction().set_context(
+ warehouse=self.warehouse.id if self.warehouse else None):
+ self.delivery_address = self.customer.address_get(
+ type='delivery')
+
+ @fields.depends('customer')
+ def on_change_with_customer_location(self, name=None):
+ if self.customer:
+ return self.customer.customer_location.id
+
+ @classmethod
+ def default_warehouse_storage(cls):
+ warehouse = cls.default_warehouse()
+ if warehouse:
+ return cls(warehouse=warehouse).on_change_with_warehouse_storage()
+
+ @fields.depends('warehouse')
+ def on_change_with_warehouse_storage(self, name=None):
+ if self.warehouse:
+ if self.warehouse.picking_location:
+ location = self.warehouse.picking_location
+ else:
+ location = self.warehouse.storage_location
+ return location.id
+
+ @classmethod
+ def default_warehouse_output(cls):
+ warehouse = cls.default_warehouse()
+ if warehouse:
+ return cls(warehouse=warehouse).on_change_with_warehouse_output()
+
+ @fields.depends('warehouse')
+ def on_change_with_warehouse_output(self, name=None):
+ if self.warehouse:
+ return self.warehouse.output_location.id
+
+ def get_outgoing_moves(self, name):
+ moves = []
+ for move in self.moves:
+ if move.from_location == self.warehouse_output:
+ moves.append(move.id)
+ return moves
+
+ @classmethod
+ def set_outgoing_moves(cls, shipments, name, value):
+ if not value:
+ return
+ cls.write(shipments, {
+ 'moves': value,
+ })
+
+ def get_inventory_moves(self, name):
+ moves = []
+ for move in self.moves:
+ if move.to_location == self.warehouse_output:
+ moves.append(move.id)
+ return moves
+
+ @classmethod
+ def set_inventory_moves(cls, shipments, name, value):
+ if not value:
+ return
+ cls.write(shipments, {
+ 'moves': value,
+ })
+
+ def get_origins(self, name):
+ return ', '.join(set(filter(None,
+ (m.origin_name for m in self.outgoing_moves))))
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.draft([m for s in shipments
+ for m in s.inventory_moves + s.outgoing_moves
+ if m.state != 'staging'])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('waiting')
+ def wait(cls, shipments, moves=None):
+ """
+ Complete inventory moves to match the products and quantities
+ that are in the outgoing moves.
+ If moves is set, only this subset is set to draft.
+ """
+ Move = Pool().get('stock.move')
+
+ if moves is None:
+ moves = sum((s.inventory_moves for s in shipments), ())
+ else:
+ assert all(m.shipment in shipments for m in moves)
+ Move.draft(moves)
+ Move.delete([m for s in shipments for m in s.inventory_moves
+ if m.state in ('draft', 'cancelled')])
+ Move.draft([
+ m for s in shipments for m in s.outgoing_moves
+ if m.state != 'staging'])
+
+ to_create = []
+ for shipment in shipments:
+ if shipment.warehouse_storage == shipment.warehouse_output:
+ # Do not create inventory moves
+ continue
+ for move in shipment.outgoing_moves:
+ if move.state in ('cancelled', 'done'):
+ continue
+ inventory_move = shipment._get_inventory_move(move)
+ if inventory_move:
+ to_create.append(inventory_move)
+ if to_create:
+ Move.save(to_create)
+
+ def _get_inventory_move(self, move):
+ 'Return inventory move for the outgoing move if necessary'
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Uom = pool.get('product.uom')
+ quantity = move.quantity
+ for inventory_move in self.inventory_moves:
+ if (inventory_move.origin == move
+ and inventory_move.state != 'cancelled'):
+ quantity -= Uom.compute_qty(
+ inventory_move.uom, inventory_move.quantity, move.uom)
+ quantity = move.uom.round(quantity)
+ if quantity <= 0:
+ return
+ inventory_move = Move(
+ from_location=self.warehouse_storage,
+ to_location=move.from_location,
+ product=move.product,
+ uom=move.uom,
+ quantity=quantity,
+ shipment=self,
+ planned_date=move.planned_date,
+ company=move.company,
+ origin=move,
+ state='staging' if move.state == 'staging' else 'draft',
+ )
+ if inventory_move.on_change_with_unit_price_required():
+ inventory_move.unit_price = move.unit_price
+ inventory_move.currency = move.currency
+ return inventory_move
+
+ @classmethod
+ @Workflow.transition('assigned')
+ def assign(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Move.assign([m for s in shipments for m in s.assign_moves])
+ cls._sync_inventory_to_outgoing(shipments, quantity=False)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('picked')
+ @set_employee('picked_by')
+ def pick(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Move.delete([
+ m for s in shipments for m in s.inventory_moves
+ if m.state == 'staging'])
+ Move.do([m for s in shipments for m in s.inventory_moves])
+ Move.draft([m for s in shipments for m in s.outgoing_moves])
+ cls._sync_inventory_to_outgoing(shipments, quantity=True)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('packed')
+ @set_employee('packed_by')
+ def pack(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ for shipment in shipments:
+ for move in shipment.inventory_moves:
+ if move.state != 'done':
+ raise AccessError(
+ gettext('stock.msg_shipment_pack_inventory_done',
+ shipment=shipment.rec_name))
+ Move.delete([m for s in shipments for m in s.outgoing_moves
+ if not m.quantity])
+ Move.assign([m for s in shipments for m in s.outgoing_moves])
+
+ def _sync_move_key(self, move):
+ return (
+ ('product', move.product),
+ ('uom', move.uom),
+ )
+
+ def _sync_outgoing_move(self, template=None):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ move = Move(
+ from_location=self.warehouse_output,
+ to_location=self.customer_location,
+ quantity=0,
+ shipment=self,
+ planned_date=self.planned_date,
+ company=self.company,
+ )
+ if template:
+ move.origin = template.origin
+ if move.on_change_with_unit_price_required():
+ if template:
+ move.unit_price = template.unit_price
+ move.currency = template.currency
+ else:
+ move.unit_price = 0
+ move.currency = self.company.currency
+ return move
+
+ @classmethod
+ def _sync_inventory_to_outgoing(cls, shipments, quantity=True):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Uom = pool.get('product.uom')
+
+ def active(move):
+ return move.state != 'cancelled'
+
+ moves = []
+ for shipment in shipments:
+ if shipment.warehouse_storage == shipment.warehouse_output:
+ # Do not have inventory moves
+ continue
+
+ outgoing_moves = {m: m for m in shipment.outgoing_moves}
+ inventory_qty = defaultdict(lambda: defaultdict(float))
+ for move in filter(active, shipment.outgoing_moves):
+ key = shipment._sync_move_key(move)
+ inventory_qty[move][key] = 0
+ for move in filter(active, shipment.inventory_moves):
+ key = shipment._sync_move_key(move)
+ outgoing_move = outgoing_moves.get(move.origin)
+ qty_default_uom = Uom.compute_qty(
+ move.uom, move.quantity,
+ move.product.default_uom, round=False)
+ inventory_qty[outgoing_move][key] += qty_default_uom
+
+ for outgoing_move in inventory_qty:
+ if outgoing_move:
+ outgoing_key = shipment._sync_move_key(outgoing_move)
+ for key, qty in inventory_qty[outgoing_move].items():
+ if not quantity and outgoing_move:
+ # Do not create outgoing move with origin
+ # to allow to reset to draft
+ continue
+ if outgoing_move and key == outgoing_key:
+ move = outgoing_move
+ else:
+ move = shipment._sync_outgoing_move(outgoing_move)
+ for name, value in key:
+ setattr(move, name, value)
+ qty = Uom.compute_qty(
+ move.product.default_uom, qty,
+ move.uom)
+ if quantity and move.quantity != qty:
+ move.quantity = qty
+ moves.append(move)
+ Move.save(moves)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @set_employee('done_by')
+ def done(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+
+ Move.delete([
+ m for s in shipments for m in s.outgoing_moves
+ if m.state == 'staging'])
+ Move.do([m for s in shipments for m in s.outgoing_moves])
+ for company, c_shipments in groupby(
+ shipments, key=lambda s: s.company):
+ with Transaction().set_context(company=company.id):
+ today = Date.today()
+ cls.write([s for s in c_shipments if not s.effective_date], {
+ 'effective_date': today,
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.cancel([m for s in shipments
+ for m in s.outgoing_moves + s.inventory_moves])
+
+ @property
+ def _move_planned_date(self):
+ '''
+ Return the planned date for outgoing moves and inventory moves
+ '''
+ return self.planned_date, self.planned_date
+
+ @classmethod
+ def _set_move_planned_date(cls, shipments):
+ '''
+ Set planned date of moves for the shipments
+ '''
+ Move = Pool().get('stock.move')
+ to_write = []
+ for shipment in shipments:
+ outgoing_date, inventory_date = shipment._move_planned_date
+ out_moves_to_write = [x for x in shipment.outgoing_moves
+ if (x.state not in ('assigned', 'done', 'cancelled')
+ and x.planned_date != outgoing_date)]
+ if out_moves_to_write:
+ to_write.extend((out_moves_to_write, {
+ 'planned_date': outgoing_date,
+ }))
+
+ inv_moves_to_write = [x for x in shipment.inventory_moves
+ if (x.state not in ('assigned', 'done', 'cancelled')
+ and x.planned_date != inventory_date)]
+ if inv_moves_to_write:
+ to_write.extend((inv_moves_to_write, {
+ 'planned_date': inventory_date,
+ }))
+ if to_write:
+ Move.write(*to_write)
+
+ @classmethod
+ def create(cls, vlist):
+ pool = Pool()
+ Config = pool.get('stock.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(
+ 'shipment_out_sequence',
+ company=values.get('company', default_company)).get()
+ shipments = super(ShipmentOut, cls).create(vlist)
+ cls._set_move_planned_date(shipments)
+ return shipments
+
+ @classmethod
+ def write(cls, *args):
+ super(ShipmentOut, cls).write(*args)
+ cls._set_move_planned_date(sum(args[::2], []))
+
+ @classmethod
+ def copy(cls, shipments, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('inventory_moves', None)
+ default.setdefault('outgoing_moves', None)
+ default.setdefault('number', None)
+ default.setdefault('picked_by', None)
+ default.setdefault('packed_by', None)
+ default.setdefault('done_by', None)
+ return super(ShipmentOut, cls).copy(shipments, default=default)
+
+ @classmethod
+ def delete(cls, shipments):
+ Move = Pool().get('stock.move')
+ # Cancel before delete
+ cls.cancel(shipments)
+ for shipment in shipments:
+ if shipment.state != 'cancelled':
+ raise AccessError(
+ gettext('stock.msg_shipment_delete_cancel',
+ shipment=shipment.rec_name))
+ Move.delete([m for s in shipments for m in s.moves])
+ super(ShipmentOut, cls).delete(shipments)
+
+ @staticmethod
+ def _location_amount(target_uom, qty_uom, uom_index):
+ """
+ Take a raw list of quantities and uom and convert it to
+ the target uom.
+ """
+ Uom = Pool().get('product.uom')
+ res = 0
+ for uom, qty in qty_uom:
+ res += Uom.compute_qty(uom_index[uom], qty,
+ uom_index[target_uom])
+ return res
+
+ @classmethod
+ @ModelView.button_action('stock.wizard_shipment_out_assign')
+ def assign_wizard(cls, shipments):
+ pass
+
+ @property
+ def assign_moves(self):
+ return self.inventory_moves
+
+ @dualmethod
+ @ModelView.button
+ def assign_try(cls, shipments):
+ Move = Pool().get('stock.move')
+ to_assign = [
+ m for s in shipments for m in s.assign_moves
+ if m.assignation_required]
+ if Move.assign_try(to_assign):
+ cls.assign(shipments)
+ return True
+ else:
+ return False
+
+ @classmethod
+ def _get_reschedule_domain(cls, date):
+ return [
+ ('state', '=', 'waiting'),
+ ('planned_date', '<', date),
+ ]
+
+ @classmethod
+ def reschedule(cls, date=None):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ if date is None:
+ date = Date.today()
+ shipments = cls.search(cls._get_reschedule_domain(date))
+ cls.write(shipments, {'planned_date': date})
+
+
+class ShipmentOutReturn(ShipmentMixin, Workflow, ModelSQL, ModelView):
+ "Customer Return Shipment"
+ __name__ = 'stock.shipment.out.return'
+ _rec_name = 'number'
+ effective_date = fields.Date('Effective Date',
+ states={
+ 'readonly': Eval('state').in_(['cancelled', 'done']),
+ },
+ help="When the stock was returned.")
+ planned_date = fields.Date('Planned Date',
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="When the stock is expected to be returned.")
+ company = fields.Many2One(
+ 'company.company', "Company", required=True,
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The company the shipment is associated with.")
+ customer = fields.Many2One('party.party', 'Customer', required=True,
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | Eval('incoming_moves', [0])),
+ },
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'},
+ help="The party that purchased the stock.")
+ customer_location = fields.Function(fields.Many2One('stock.location',
+ 'Customer Location'), 'on_change_with_customer_location')
+ contact_address = fields.Many2One(
+ 'party.address', "Contact Address",
+ states={
+ 'readonly': Eval('state') != 'draft',
+ }, domain=[('party', '=', Eval('customer'))],
+ help="The address the customer can be contacted at.")
+ reference = fields.Char(
+ "Reference",
+ states={
+ 'readonly': Eval('state') != 'draft',
+ },
+ help="The customer's identifier for the shipment.")
+ warehouse = fields.Many2One('stock.location', "Warehouse", required=True,
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | Eval('incoming_moves', [0]) | Eval('inventory_moves', [0])),
+ }, domain=[('type', '=', 'warehouse')],
+ help="Where the stock is returned.")
+ warehouse_storage = fields.Function(fields.Many2One('stock.location',
+ 'Warehouse Storage'), 'on_change_with_warehouse_storage')
+ warehouse_input = fields.Function(fields.Many2One('stock.location',
+ 'Warehouse Input'), 'on_change_with_warehouse_input')
+ incoming_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
+ 'Incoming Moves',
+ domain=[
+ ('from_location', '=', Eval('customer_location')),
+ If(Eval('warehouse_input') == Eval('warehouse_storage'),
+ ('to_location', 'child_of',
+ [Eval('warehouse_input', -1)], 'parent'),
+ ('to_location', '=', Eval('warehouse_input'))),
+ ('company', '=', Eval('company')),
+ ],
+ states={
+ 'readonly': ((Eval('state') != 'draft')
+ | ~Eval('warehouse') | ~Eval('customer')),
+ },
+ help="The moves that bring the stock into the warehouse."),
+ 'get_incoming_moves', setter='set_incoming_moves')
+ inventory_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
+ 'Inventory Moves',
+ domain=[
+ ('from_location', '=', Eval('warehouse_input')),
+ If(Eval('state').in_(['received']),
+ ['OR',
+ ('to_location', 'child_of',
+ [Eval('warehouse_storage', -1)], 'parent'),
+ ('to_location.waste_warehouses', '=',
+ Eval('warehouse')),
+ ],
+ []),
+ ('company', '=', Eval('company')),
+ ],
+ states={
+ 'readonly': Eval('state').in_(['draft', 'cancelled', 'done']),
+ 'invisible': (
+ Eval('warehouse_input') == Eval('warehouse_storage')),
+ },
+ help="The moves that put the stock away into the storage area."),
+ 'get_inventory_moves', setter='set_inventory_moves')
+ moves = fields.One2Many('stock.move', 'shipment', 'Moves',
+ domain=[('company', '=', Eval('company'))], readonly=True)
+ origins = fields.Function(fields.Char('Origins'), 'get_origins')
+ number = fields.Char(
+ "Number", readonly=True,
+ help="The main identifier for the shipment.")
+ received_by = employee_field("Received By")
+ done_by = employee_field("Done By")
+ state = fields.Selection([
+ ('draft', 'Draft'),
+ ('received', 'Received'),
+ ('done', 'Done'),
+ ('cancelled', 'Cancelled'),
+ ], "State", readonly=True, sort=False,
+ help="The current state of the shipment.")
+
+ @classmethod
+ def __setup__(cls):
+ cls.number.search_unaccented = False
+ cls.reference.search_unaccented = False
+ super(ShipmentOutReturn, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.update({
+ Index(t, (t.reference, Index.Similarity())),
+ Index(
+ t,
+ (t.state, Index.Equality()),
+ where=t.state.in_(['draft', 'received'])),
+ })
+ cls._order = [
+ ('effective_date', 'ASC NULLS LAST'),
+ ('id', 'ASC'),
+ ]
+ cls._transitions |= set((
+ ('draft', 'received'),
+ ('received', 'done'),
+ ('received', 'draft'),
+ ('draft', 'cancelled'),
+ ('received', 'cancelled'),
+ ('cancelled', 'draft'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': Eval('state').in_(['cancelled', 'done']),
+ 'depends': ['state'],
+ },
+ 'draft': {
+ 'invisible': Eval('state') != 'cancelled',
+ 'depends': ['state'],
+ },
+ 'receive': {
+ 'invisible': Eval('state') != 'draft',
+ 'depends': ['state'],
+ },
+ 'done': {
+ 'invisible': Eval('state') != 'received',
+ 'depends': ['state'],
+ },
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
+ cursor = Transaction().connection.cursor()
+ table = cls.__table_handler__(module_name)
+ sql_table = cls.__table__()
+
+ # Migration from 3.8: rename code into number
+ if table.column_exist('code'):
+ table.column_rename('code', 'number')
+
+ # Migration from 6.4: rename delivery_address to contact_address
+ table.column_rename('delivery_address', 'contact_address')
+
+ super(ShipmentOutReturn, cls).__register__(module_name)
+
+ # Migration from 5.6: rename state cancel to cancelled
+ cursor.execute(*sql_table.update(
+ [sql_table.state], ['cancelled'],
+ where=sql_table.state == 'cancel'))
+
+ # Migration from 6.4: remove required on contact_address
+ table.not_null_action('contact_address', 'remove')
+
+ @classmethod
+ def order_number(cls, tables):
+ table, _ = tables[None]
+ return [CharLength(table.number), table.number]
+
+ @classmethod
+ def order_effective_date(cls, tables):
+ table, _ = tables[None]
+ return [Coalesce(table.effective_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()
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @fields.depends('customer')
+ def on_change_customer(self):
+ self.contact_address = None
+ if self.customer:
+ self.contact_address = self.customer.address_get()
+
+ @fields.depends('customer')
+ def on_change_with_customer_location(self, name=None):
+ if self.customer:
+ return self.customer.customer_location.id
+
+ @classmethod
+ def default_warehouse_storage(cls):
+ warehouse = cls.default_warehouse()
+ if warehouse:
+ return cls(warehouse=warehouse).on_change_with_warehouse_storage()
+
+ @fields.depends('warehouse')
+ def on_change_with_warehouse_storage(self, name=None):
+ if self.warehouse:
+ return self.warehouse.storage_location.id
+
+ @classmethod
+ def default_warehouse_input(cls):
+ warehouse = cls.default_warehouse()
+ if warehouse:
+ return cls(warehouse=warehouse).on_change_with_warehouse_input()
+
+ @fields.depends('warehouse')
+ def on_change_with_warehouse_input(self, name=None):
+ if self.warehouse:
+ return self.warehouse.input_location.id
+
+ def get_incoming_moves(self, name):
+ moves = []
+ if self.warehouse_input == self.warehouse_storage:
+ return [m.id for m in self.moves]
+ for move in self.moves:
+ if move.to_location == self.warehouse_input:
+ moves.append(move.id)
+ return moves
+
+ @classmethod
+ def set_incoming_moves(cls, shipments, name, value):
+ if not value:
+ return
+ cls.write(shipments, {
+ 'moves': value,
+ })
+
+ def get_inventory_moves(self, name):
+ moves = []
+ for move in self.moves:
+ if move.from_location == self.warehouse_input:
+ moves.append(move.id)
+ return moves
+
+ @classmethod
+ def set_inventory_moves(cls, shipments, name, value):
+ if not value:
+ return
+ cls.write(shipments, {
+ 'moves': value,
+ })
+
+ def _get_move_planned_date(self):
+ '''
+ Return the planned date for incoming moves and inventory moves
+ '''
+ return self.planned_date, self.planned_date
+
+ @classmethod
+ def _set_move_planned_date(cls, shipments):
+ '''
+ Set planned date of moves for the shipments
+ '''
+ Move = Pool().get('stock.move')
+ to_write = []
+ for shipment in shipments:
+ dates = shipment._get_move_planned_date()
+ incoming_date, inventory_date = dates
+ incoming_moves_to_write = [x for x in shipment.incoming_moves
+ if (x.state not in ('assigned', 'done', 'cancelled')
+ and x.planned_date != incoming_date)]
+ if incoming_moves_to_write:
+ to_write.extend((incoming_moves_to_write, {
+ 'planned_date': incoming_date,
+ }))
+ inventory_moves_to_write = [x for x in shipment.inventory_moves
+ if (x.state not in ('assigned', 'done', 'cancelled')
+ and x.planned_date != inventory_date)]
+ if inventory_moves_to_write:
+ to_write.extend((inventory_moves_to_write, {
+ 'planned_date': inventory_date,
+ }))
+ if to_write:
+ Move.write(*to_write)
+
+ def get_origins(self, name):
+ return ', '.join(set(filter(None,
+ (m.origin_name for m in self.incoming_moves))))
+
+ @classmethod
+ def create(cls, vlist):
+ pool = Pool()
+ Config = pool.get('stock.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(
+ 'shipment_out_return_sequence',
+ company=values.get('company', default_company)).get()
+ shipments = super(ShipmentOutReturn, cls).create(vlist)
+ cls._set_move_planned_date(shipments)
+ return shipments
+
+ @classmethod
+ def write(cls, *args):
+ super(ShipmentOutReturn, cls).write(*args)
+ cls._set_move_planned_date(sum(args[::2], []))
+
+ @classmethod
+ def copy(cls, shipments, default=None):
+ if default is None:
+ default = {}
+ default = default.copy()
+ default.setdefault('inventory_moves', None)
+ default.setdefault('incoming_moves', None)
+ default.setdefault('number', None)
+ default.setdefault('received_by', None)
+ default.setdefault('done_by', None)
+ return super(ShipmentOutReturn, cls).copy(shipments, default=default)
+
+ @classmethod
+ def delete(cls, shipments):
+ Move = Pool().get('stock.move')
+ # Cance before delete
+ cls.cancel(shipments)
+ for shipment in shipments:
+ if shipment.state != 'cancelled':
+ raise AccessError(
+ gettext('stock.msg_shipment_delete_cancel',
+ shipment=shipment.rec_name))
+ Move.delete([m for s in shipments for m in s.moves])
+ super(ShipmentOutReturn, cls).delete(shipments)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.draft([m for s in shipments for m in s.incoming_moves
+ if m.state != 'staging'])
+ Move.delete([m for s in shipments for m in s.inventory_moves
+ if m.state in ('draft', 'cancelled')])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('received')
+ @set_employee('received_by')
+ def receive(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.do([m for s in shipments for m in s.incoming_moves])
+ cls.create_inventory_moves(shipments)
+ # Set received state to allow done transition
+ cls.write(shipments, {'state': 'received'})
+ to_do = [s for s in shipments
+ if s.warehouse_storage == s.warehouse_input]
+ if to_do:
+ cls.done(to_do)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @set_employee('done_by')
+ def done(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ Move.do([m for s in shipments for m in s.inventory_moves])
+ for company, c_shipments in groupby(
+ shipments, key=lambda s: s.company):
+ with Transaction().set_context(company=company.id):
+ today = Date.today()
+ cls.write([s for s in c_shipments if not s.effective_date], {
+ 'effective_date': today,
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.cancel([m for s in shipments
+ for m in s.incoming_moves + s.inventory_moves])
+
+ def _get_inventory_move(self, incoming_move):
+ 'Return inventory move for the incoming move'
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ if incoming_move.quantity <= 0.0:
+ return
+ with Transaction().set_context(company=self.company.id):
+ today = Date.today()
+ move = Move()
+ move.product = incoming_move.product
+ move.uom = incoming_move.uom
+ move.quantity = incoming_move.quantity
+ move.from_location = incoming_move.to_location
+ move.to_location = self.warehouse_storage
+ move.state = Move.default_state()
+ move.planned_date = max(
+ filter(None, [self._get_move_planned_date()[1], today]))
+ move.company = incoming_move.company
+ move.origin = incoming_move
+ return move
+
+ @classmethod
+ def create_inventory_moves(cls, shipments):
+ for shipment in shipments:
+ if shipment.warehouse_storage == shipment.warehouse_input:
+ # Do not create inventory moves
+ continue
+ # Use moves instead of inventory_moves because save reset before
+ # adding new records and as set_inventory_moves is just a proxy to
+ # moves, it will reset also the incoming_moves
+ moves = list(shipment.moves)
+ for incoming_move in shipment.incoming_moves:
+ move = shipment._get_inventory_move(incoming_move)
+ if move:
+ moves.append(move)
+ shipment.moves = moves
+ cls.save(shipments)
+
+
+class ShipmentInternal(ShipmentAssignMixin, Workflow, ModelSQL, ModelView):
+ "Internal Shipment"
+ __name__ = 'stock.shipment.internal'
+ _rec_name = 'number'
+ _assign_moves_field = 'moves'
+ effective_date = fields.Date('Effective Date',
+ states={
+ 'readonly': Eval('state').in_(['cancelled', 'done']),
+ },
+ help="When the shipment was actually completed.")
+ planned_date = fields.Date('Planned Date',
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ },
+ help="When the shipment is expected to be completed.")
+ effective_start_date = fields.Date('Effective Start Date',
+ domain=[
+ If(Eval('effective_start_date') & Eval('effective_date'),
+ ('effective_start_date', '<=', Eval('effective_date')),
+ ()),
+ ],
+ states={
+ 'readonly': Eval('state').in_(['cancelled', 'shipped', 'done']),
+ },
+ help="When the stock was actually sent.")
+ planned_start_date = fields.Date('Planned Start Date',
+ domain=[
+ If(Eval('planned_start_date') & Eval('planned_date'),
+ ('planned_start_date', '<=', Eval('planned_date')),
+ ()),
+ ],
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ 'required': Bool(Eval('planned_date')),
+ },
+ help="When the stock is expected to be sent.")
+ company = fields.Many2One(
+ 'company.company', "Company", required=True,
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ },
+ help="The company the shipment is associated with.")
+ number = fields.Char(
+ "Number", readonly=True,
+ help="The main identifier for the shipment.")
+ reference = fields.Char(
+ "Reference",
+ states={
+ 'readonly': ~Eval('state').in_(['request', 'draft']),
+ },
+ help="The external identifiers for the shipment.")
+ from_location = fields.Many2One('stock.location', "From Location",
+ required=True, states={
+ 'readonly': (~Eval('state').in_(['request', 'draft'])
+ | Eval('moves', [0])),
+ },
+ domain=[
+ ('type', 'in', ['view', 'storage', 'lost_found']),
+ ],
+ help="Where the stock is moved from.")
+ to_location = fields.Many2One('stock.location', "To Location",
+ required=True, states={
+ 'readonly': (~Eval('state').in_(['request', 'draft'])
+ | Eval('moves', [0])),
+ }, domain=[
+ ('type', 'in', ['view', 'storage', 'lost_found']),
+ ],
+ help="Where the stock is moved to.")
+ transit_location = fields.Function(fields.Many2One('stock.location',
+ 'Transit Location',
+ help="Where the stock is located while it is in transit between "
+ "the warehouses."),
+ 'on_change_with_transit_location')
+ warehouse = fields.Function(
+ fields.Many2One(
+ 'stock.location', "Warehouse",
+ help="Where the stock is sent from."),
+ 'on_change_with_warehouse')
+ moves = fields.One2Many('stock.move', 'shipment', 'Moves',
+ states={
+ 'readonly': (Eval('state').in_(['cancelled', 'assigned', 'done'])
+ | ~Eval('from_location') | ~Eval('to_location')),
+ 'invisible': (Bool(Eval('transit_location'))
+ & ~Eval('state').in_(['request', 'draft'])),
+ },
+ domain=[
+ If(Eval('state').in_(['request', 'draft']), [
+ ('from_location', '=', Eval('from_location')),
+ ('to_location', '=', Eval('to_location')),
+ ],
+ If(~Eval('state').in_(['done', 'cancelled']),
+ If(~Eval('transit_location'),
+ [
+ ('from_location', 'child_of',
+ [Eval('from_location', -1)], 'parent'),
+ ('to_location', 'child_of',
+ [Eval('to_location', -1)], 'parent'),
+ ],
+ ['OR',
+ [
+ ('from_location', 'child_of',
+ [Eval('from_location', -1)], 'parent'),
+ ('to_location', '=', Eval('transit_location')),
+ ],
+ [
+ ('from_location', '=',
+ Eval('transit_location')),
+ ('to_location', 'child_of',
+ [Eval('to_location', -1)], 'parent'),
+ ],
+ ]),
+ [])),
+ ('company', '=', Eval('company')),
+ ],
+ help="The moves that perform the shipment.")
+ outgoing_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
+ 'Outgoing Moves',
+ domain=[
+ If(Eval('state').in_(['request', 'draft']), [
+ ('from_location', 'child_of',
+ [Eval('from_location', -1)], 'parent'),
+ If(~Eval('transit_location'),
+ ('to_location', 'child_of',
+ [Eval('to_location', -1)], 'parent'),
+ ('to_location', '=', Eval('transit_location'))),
+ ],
+ []),
+ ],
+ states={
+ 'readonly': Eval('state').in_(
+ ['assigned', 'shipped', 'done', 'cancelled']),
+ 'invisible': (~Eval('transit_location')
+ | Eval('state').in_(['request', 'draft'])),
+ },
+ help="The moves that send the stock out."),
+ 'get_outgoing_moves', setter='set_moves')
+ incoming_moves = fields.Function(fields.One2Many('stock.move', 'shipment',
+ 'Incoming Moves',
+ domain=[
+ If(~Eval('state').in_(['done', 'cancelled']), [
+ If(~Eval('transit_location'),
+ ('from_location', 'child_of',
+ [Eval('from_location', -1)], 'parent'),
+ ('from_location', '=', Eval('transit_location'))),
+ ('to_location', 'child_of',
+ [Eval('to_location', -1)], 'parent'),
+ ],
+ []),
+ ],
+ states={
+ 'readonly': Eval('state').in_(['done', 'cancelled']),
+ 'invisible': (~Eval('transit_location')
+ | Eval('state').in_(['request', 'draft'])),
+ },
+ help="The moves that receive the stock in."),
+ 'get_incoming_moves', setter='set_moves')
+ assigned_by = employee_field("Received By")
+ shipped_by = employee_field("Shipped By")
+ done_by = employee_field("Done By")
+ state = fields.Selection([
+ ('request', 'Request'),
+ ('draft', 'Draft'),
+ ('waiting', 'Waiting'),
+ ('assigned', 'Assigned'),
+ ('shipped', 'Shipped'),
+ ('done', 'Done'),
+ ('cancelled', 'Cancelled'),
+ ], "State", readonly=True, sort=False,
+ help="The current state of the shipment.")
+
+ @classmethod
+ def __setup__(cls):
+ cls.number.search_unaccented = False
+ cls.reference.search_unaccented = False
+ super(ShipmentInternal, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.update({
+ Index(t, (t.reference, Index.Similarity())),
+ Index(
+ t,
+ (t.state, Index.Equality()),
+ where=t.state.in_([
+ 'request', 'draft', 'waiting',
+ 'assigned', 'shipped'])),
+ })
+ cls._order = [
+ ('effective_date', 'ASC NULLS LAST'),
+ ('id', 'ASC'),
+ ]
+ cls._transitions |= set((
+ ('request', 'draft'),
+ ('draft', 'waiting'),
+ ('waiting', 'waiting'),
+ ('waiting', 'assigned'),
+ ('assigned', 'shipped'),
+ ('assigned', 'done'),
+ ('shipped', 'done'),
+ ('waiting', 'draft'),
+ ('assigned', 'waiting'),
+ ('request', 'cancelled'),
+ ('draft', 'cancelled'),
+ ('waiting', 'cancelled'),
+ ('assigned', 'cancelled'),
+ ('cancelled', 'draft'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': Eval('state').in_(
+ ['cancelled', 'shipped', 'done']),
+ 'depends': ['state'],
+ },
+ 'draft': {
+ 'invisible': ~Eval('state').in_(
+ ['cancelled', 'request', 'waiting']),
+ 'icon': If(Eval('state') == 'cancelled',
+ 'tryton-undo',
+ If(Eval('state') == 'request',
+ 'tryton-forward',
+ 'tryton-back')),
+ 'depends': ['state'],
+ },
+ 'wait': {
+ 'invisible': ~Eval('state').in_(['assigned', 'waiting',
+ 'draft']),
+ 'icon': If(Eval('state') == 'assigned',
+ 'tryton-back',
+ If(Eval('state') == 'waiting',
+ 'tryton-clear',
+ 'tryton-forward')),
+ 'depends': ['state'],
+ },
+ 'ship': {
+ 'invisible': ((Eval('state') != 'assigned')
+ | ~Eval('transit_location')),
+ 'depends': ['state', 'transit_location'],
+ },
+ 'done': {
+ 'invisible': If(
+ ~Eval('transit_location'),
+ Eval('state') != 'assigned',
+ Eval('state') != 'shipped'),
+ 'depends': ['state', 'transit_location'],
+ },
+ 'assign_wizard': {
+ 'invisible': Eval('state') != 'waiting',
+ 'depends': ['state'],
+ },
+ 'assign_try': {},
+ 'assign_force': {},
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
+ cursor = Transaction().connection.cursor()
+ sql_table = cls.__table__()
+ table = cls.__table_handler__(module_name)
+
+ # Migration from 3.8:
+ if table.column_exist('code'):
+ table.column_rename('code', 'number')
+
+ super(ShipmentInternal, cls).__register__(module_name)
+
+ # Migration from 4.0: fill planned_start_date
+ cursor = Transaction().connection.cursor()
+ cursor.execute(*sql_table.update(
+ [sql_table.planned_start_date],
+ [sql_table.planned_date],
+ where=(sql_table.planned_start_date == Null)
+ & (sql_table.planned_date != Null)))
+
+ # Migration from 5.6: rename state cancel to cancelled
+ cursor.execute(*sql_table.update(
+ [sql_table.state], ['cancelled'],
+ where=sql_table.state == 'cancel'))
+
+ @classmethod
+ def order_number(cls, tables):
+ table, _ = tables[None]
+ return [CharLength(table.number), table.number]
+
+ @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'
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @fields.depends('from_location', 'to_location', 'company')
+ def on_change_with_transit_location(self, name=None):
+ pool = Pool()
+ Config = pool.get('stock.configuration')
+ if (self.from_location
+ and self.to_location
+ and self.from_location.warehouse != self.to_location.warehouse
+ and self.from_location.warehouse
+ and self.to_location.warehouse):
+ return Config(1).get_multivalue(
+ 'shipment_internal_transit',
+ company=self.company.id if self.company else None).id
+
+ @fields.depends('from_location')
+ def on_change_with_warehouse(self, name=None):
+ if self.from_location and self.from_location.warehouse:
+ return self.from_location.warehouse.id
+
+ @fields.depends(
+ 'planned_date', 'from_location', 'to_location',
+ methods=['on_change_with_transit_location'])
+ def on_change_with_planned_start_date(self, pattern=None):
+ pool = Pool()
+ LocationLeadTime = pool.get('stock.location.lead_time')
+ transit_location = self.on_change_with_transit_location()
+ if self.planned_date and transit_location:
+ if pattern is None:
+ pattern = {}
+ pattern.setdefault('warehouse_from',
+ self.from_location.warehouse.id
+ if self.from_location and self.from_location.warehouse
+ else None)
+ pattern.setdefault('warehouse_to',
+ self.to_location.warehouse.id
+ if self.to_location and self.to_location.warehouse
+ else None)
+ lead_time = LocationLeadTime.get_lead_time(pattern)
+ if lead_time:
+ return self.planned_date - lead_time
+ return self.planned_date
+
+ def get_outgoing_moves(self, name):
+ if not self.transit_location:
+ return [m.id for m in self.moves]
+ moves = []
+ for move in self.moves:
+ if move.to_location == self.transit_location:
+ moves.append(move.id)
+ return moves
+
+ def get_incoming_moves(self, name):
+ if not self.transit_location:
+ return [m.id for m in self.moves]
+ moves = []
+ for move in self.moves:
+ if move.from_location == self.transit_location:
+ moves.append(move.id)
+ return moves
+
+ @classmethod
+ def set_moves(cls, shipments, name, value):
+ if not value:
+ return
+ cls.write(shipments, {
+ 'moves': value,
+ })
+
+ @classmethod
+ def create(cls, vlist):
+ pool = Pool()
+ Config = pool.get('stock.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(
+ 'shipment_internal_sequence',
+ company=values.get('company', default_company)).get()
+ shipments = super().create(vlist)
+ cls._set_move_planned_date(shipments)
+ return shipments
+
+ @classmethod
+ def write(cls, *args):
+ super().write(*args)
+ cls._set_move_planned_date(sum(args[::2], []))
+
+ @classmethod
+ def delete(cls, shipments):
+ Move = Pool().get('stock.move')
+ # Cancel before delete
+ cls.cancel(shipments)
+ for shipment in shipments:
+ if shipment.state != 'cancelled':
+ raise AccessError(
+ gettext('stock.msg_shipment_delete_cancel',
+ shipment=shipment.rec_name))
+ Move.delete([m for s in shipments for m in s.moves])
+ super(ShipmentInternal, cls).delete(shipments)
+
+ @classmethod
+ def copy(cls, shipments, default=None):
+ def shipment_field(data, name):
+ model, shipment_id = data['shipment'].split(',', 1)
+ assert model == cls.__name__
+ shipment_id = int(shipment_id)
+ shipment = id2shipments[shipment_id]
+ return getattr(shipment, name)
+
+ def outgoing_moves(data):
+ shipment = id2shipments[data['id']]
+ return shipment.outgoing_moves
+ id2shipments = {s.id: s for s in shipments}
+
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('moves', outgoing_moves)
+ default.setdefault('moves.from_location', partial(
+ shipment_field, name='from_location'))
+ default.setdefault('moves.to_location', partial(
+ shipment_field, name='to_location'))
+ default.setdefault('moves.planned_date', partial(
+ shipment_field, name='planned_date'))
+ default.setdefault('number', None)
+ default.setdefault('assigned_by', None)
+ default.setdefault('shipped_by', None)
+ default.setdefault('done_by', None)
+ return super().copy(shipments, default=default)
+
+ def _sync_move_key(self, move):
+ return (
+ ('product', move.product),
+ ('uom', move.uom),
+ )
+
+ def _sync_incoming_move(self, template=None):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ move = Move(
+ from_location=self.transit_location,
+ to_location=self.to_location,
+ quantity=0,
+ shipment=self,
+ planned_date=self.planned_date,
+ company=self.company,
+ )
+ if template:
+ move.origin = template.origin
+ if move.on_change_with_unit_price_required():
+ if template:
+ move.unit_price = template.unit_price
+ move.currency = template.currency
+ else:
+ move.unit_price = 0
+ move.currency = self.company.currency
+ return move
+
+ @classmethod
+ def _sync_moves(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Uom = pool.get('product.uom')
+
+ def active(move):
+ return move.state != 'cancelled'
+
+ moves = []
+ for shipment in shipments:
+ if not shipment.transit_location:
+ continue
+
+ incoming_moves = {m: m for m in shipment.incoming_moves}
+ outgoing_qty = defaultdict(lambda: defaultdict(lambda: 0))
+ for move in filter(active, shipment.incoming_moves):
+ key = shipment._sync_move_key(move)
+ outgoing_qty[move][key] = 0
+ for move in filter(active, shipment.outgoing_moves):
+ key = shipment._sync_move_key(move)
+ incoming_move = incoming_moves.get(move.origin)
+ qty_default_uom = Uom.compute_qty(
+ move.uom, move.quantity,
+ move.product.default_uom, round=False)
+ outgoing_qty[incoming_move][key] += qty_default_uom
+
+ for incoming_move in outgoing_qty:
+ if incoming_move:
+ incoming_key = shipment._sync_move_key(incoming_move)
+ for key, qty in outgoing_qty[incoming_move].items():
+ if incoming_move and key == incoming_key:
+ move = incoming_move
+ else:
+ move = shipment._sync_incoming_move(incoming_move)
+ for name, value in key:
+ setattr(move, name, value)
+ qty = Uom.compute_qty(
+ move.product.default_uom, qty,
+ move.uom)
+ if move.quantity != qty:
+ move.quantity = qty
+ moves.append(move)
+ Move.save(moves)
+
+ @classmethod
+ def _set_transit(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+
+ to_write = []
+ for shipment in shipments:
+ if not shipment.transit_location:
+ continue
+ moves = [m for m in shipment.moves
+ if m.state != 'done'
+ and m.from_location != shipment.transit_location
+ and m.to_location != shipment.transit_location]
+ Move.copy(moves, default={
+ 'to_location': shipment.transit_location.id,
+ 'planned_date': shipment.planned_start_date,
+ 'origin': lambda data: '%s,%s' % (
+ Move.__name__, data['id']),
+ })
+ to_write.append(moves)
+ to_write.append({
+ 'from_location': shipment.transit_location.id,
+ 'planned_date': shipment.planned_date,
+ })
+ if to_write:
+ Move.write(*to_write)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, shipments):
+ Move = Pool().get('stock.move')
+
+ # First reset state to draft to allow update from and to location
+ Move.draft([m for s in shipments for m in s.moves
+ if m.state != 'staging'])
+ Move.delete([m for s in shipments for m in s.moves
+ if m.from_location == s.transit_location])
+ for shipment in shipments:
+ Move.write([m for m in shipment.moves
+ if m.state != 'done'], {
+ 'from_location': shipment.from_location.id,
+ 'to_location': shipment.to_location.id,
+ 'planned_date': shipment.planned_date,
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('waiting')
+ def wait(cls, shipments, moves=None):
+ """
+ If moves is set, only this subset is set to draft.
+ """
+ Move = Pool().get('stock.move')
+
+ if moves is None:
+ moves = sum((s.moves for s in shipments), ())
+ else:
+ assert all(m.shipment in shipments for m in moves)
+ Move.draft(moves)
+
+ moves = []
+ for shipment in shipments:
+ if shipment.transit_location:
+ continue
+ for move in shipment.moves:
+ if move.state != 'done':
+ move.planned_date = shipment.planned_date
+ moves.append(move)
+ Move.save(moves)
+
+ cls._set_transit(shipments)
+ cls._sync_moves(shipments)
+
+ @classmethod
+ @Workflow.transition('assigned')
+ @set_employee('assigned_by')
+ def assign(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Move.assign([m for s in shipments for m in s.assign_moves])
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('shipped')
+ @set_employee('shipped_by')
+ def ship(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ Move.do([m for s in shipments for m in s.outgoing_moves])
+ cls._sync_moves(shipments)
+ for company, c_shipments in groupby(
+ shipments, key=lambda s: s.company):
+ with Transaction().set_context(company=company.id):
+ today = Date.today()
+ cls.write([s for s in c_shipments if not s.effective_start_date], {
+ 'effective_start_date': today,
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @set_employee('done_by')
+ def done(cls, shipments):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ Move.do([m for s in shipments for m in s.incoming_moves])
+ for company, c_shipments in groupby(
+ shipments, key=lambda s: s.company):
+ with Transaction().set_context(company=company.id):
+ today = Date.today()
+ cls.write([s for s in c_shipments if not s.effective_date], {
+ 'effective_date': today,
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, shipments):
+ Move = Pool().get('stock.move')
+ Move.cancel([m for s in shipments for m in s.moves])
+
+ @classmethod
+ @ModelView.button_action('stock.wizard_shipment_internal_assign')
+ def assign_wizard(cls, shipments):
+ pass
+
+ @property
+ def assign_moves(self):
+ return self.outgoing_moves
+
+ @dualmethod
+ @ModelView.button
+ def assign_try(cls, shipments):
+ Move = Pool().get('stock.move')
+ to_assign = [
+ m for s in shipments for m in s.assign_moves
+ if m.assignation_required]
+ if not to_assign or Move.assign_try(to_assign):
+ cls.assign(shipments)
+ return True
+ else:
+ return False
+
+ @property
+ def _move_planned_date(self):
+ '''
+ Return the planned date for incoming moves and inventory_moves
+ '''
+ return self.planned_start_date, self.planned_date
+
+ @classmethod
+ def _set_move_planned_date(cls, shipments):
+ '''
+ Set planned date of moves for the shipments
+ '''
+ Move = Pool().get('stock.move')
+ to_write = []
+ for shipment in shipments:
+ dates = shipment._move_planned_date
+ if (shipment.transit_location
+ and shipment.state not in {'request', 'draft'}):
+ outgoing_date, incoming_date = dates
+ outgoing_moves = [m for m in shipment.outgoing_moves
+ if (m.state not in ('assigned', 'done', 'cancelled')
+ and m.planned_date != outgoing_date)]
+ if outgoing_moves:
+ to_write.append(outgoing_moves)
+ to_write.append({
+ 'planned_date': outgoing_date,
+ })
+ incoming_moves = [m for m in shipment.incoming_moves
+ if (m.state not in ('assigned', 'done', 'cancelled')
+ and m.planned_date != incoming_date)]
+ if incoming_moves:
+ to_write.append(incoming_moves)
+ to_write.append({
+ 'planned_date': incoming_date,
+ })
+ else:
+ planned_start_date = shipment.planned_start_date
+ moves = [m for m in shipment.moves
+ if (m.state not in {'assigned', 'done', 'cancelled'}
+ and m.planned_date != planned_start_date)]
+ if moves:
+ to_write.append(moves)
+ to_write.append({
+ 'planned_date': planned_start_date,
+ })
+ if to_write:
+ Move.write(*to_write)
+
+ @classmethod
+ def _get_reschedule_domain(cls, date):
+ return [
+ ('state', '=', 'waiting'),
+ ('planned_date', '<', date),
+ ]
+
+ @classmethod
+ def reschedule(cls, date=None):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ if date is None:
+ date = Date.today()
+ shipments = cls.search(cls._get_reschedule_domain(date))
+ for shipment in shipments:
+ shipment.planned_date = date
+ shipment.planned_start_date = (
+ shipment.on_change_with_planned_start_date())
+ cls.save(shipments)
+
+
+class Assign(Wizard):
+ "Assign Shipment"
+ __name__ = 'stock.shipment.assign'
+ start = StateTransition()
+ partial = StateView(
+ 'stock.shipment.assign.partial',
+ 'stock.shipment_assign_partial_view_form', [
+ Button("Cancel", 'cancel', 'tryton-cancel'),
+ Button("Wait", 'end', 'tryton-ok', True),
+ Button("Ignore", 'ignore', 'tryton-forward'),
+ Button("Force", 'force', 'tryton-forward',
+ states={
+ 'invisible': ~Id('stock',
+ 'group_stock_force_assignment').in_(
+ Eval('context', {}).get('groups', [])),
+ }),
+ ])
+ cancel = StateTransition()
+ force = StateTransition()
+ ignore = StateTransition()
+
+ def transition_start(self):
+ if self.record.assign_try():
+ return 'end'
+ else:
+ return 'partial'
+
+ def default_partial(self, fields):
+ values = {}
+ if 'moves' in fields:
+ values['moves'] = [
+ m.id for m in self.record.assign_moves
+ if m.state in {'staging', 'draft'}]
+ return values
+
+ def transition_cancel(self):
+ self.record.assign_reset()
+ return 'end'
+
+ def transition_force(self):
+ self.record.assign_force()
+ return 'end'
+
+ def transition_ignore(self):
+ self.record.assign_ignore()
+ return 'end'
+
+
+class AssignPartial(ModelView):
+ "Assign Shipment"
+ __name__ = 'stock.shipment.assign.partial'
+ moves = fields.Many2Many(
+ 'stock.move', None, None, "Moves", readonly=True,
+ help="The moves that were not assigned.")
+
+
+class DeliveryNote(CompanyReport):
+ 'Delivery Note'
+ __name__ = 'stock.shipment.out.delivery_note'
+
+ @classmethod
+ def execute(cls, ids, data):
+ with Transaction().set_context(address_with_party=False):
+ return super(DeliveryNote, cls).execute(ids, data)
+
+
+class ShipmentReport(CompanyReport):
+
+ @classmethod
+ def execute(cls, ids, data):
+ with Transaction().set_context(address_with_party=True):
+ return super(ShipmentReport, cls).execute(ids, data)
+
+ @classmethod
+ def moves(cls, shipment):
+ raise NotImplementedError
+
+ @classmethod
+ def get_context(cls, shipments, header, data):
+ report_context = super().get_context(shipments, header, data)
+
+ compare_context = cls.get_compare_context(shipments, data)
+ sorted_moves = {}
+ for shipment in shipments:
+ sorted_moves[shipment.id] = sorted(
+ cls.moves(shipment),
+ key=functools.partial(cls.get_compare_key, compare_context))
+ report_context['moves'] = sorted_moves
+
+ return report_context
+
+ @classmethod
+ def get_compare_context(cls, shipments, data):
+ from_location_ids = set()
+ to_location_ids = set()
+ for shipment in shipments:
+ for move in cls.moves(shipment):
+ from_location_ids.add(move.from_location.id)
+ to_location_ids.add(move.to_location.id)
+
+ return {
+ 'from_location_ids': list(from_location_ids),
+ 'to_location_ids': list(to_location_ids),
+ }
+
+ @staticmethod
+ def get_compare_key(compare_context, move):
+ from_location_ids = compare_context['from_location_ids']
+ to_location_ids = compare_context['to_location_ids']
+ return [from_location_ids.index(move.from_location.id),
+ to_location_ids.index(move.to_location.id)]
+
+
+class PickingList(ShipmentReport):
+ 'Picking List'
+ __name__ = 'stock.shipment.out.picking_list'
+
+ @classmethod
+ def moves(cls, shipment):
+ if shipment.warehouse_storage == shipment.warehouse_output:
+ return shipment.outgoing_moves
+ else:
+ return shipment.inventory_moves
+
+
+class SupplierRestockingList(ShipmentReport):
+ 'Supplier Restocking List'
+ __name__ = 'stock.shipment.in.restocking_list'
+
+ @classmethod
+ def moves(cls, shipment):
+ if shipment.warehouse_input == shipment.warehouse_storage:
+ return shipment.incoming_moves
+ else:
+ return shipment.inventory_moves
+
+
+class CustomerReturnRestockingList(ShipmentReport):
+ 'Customer Return Restocking List'
+ __name__ = 'stock.shipment.out.return.restocking_list'
+
+ @classmethod
+ def moves(cls, shipment):
+ if shipment.warehouse_input == shipment.warehouse_storage:
+ return shipment.incoming_moves
+ else:
+ return shipment.inventory_moves
+
+
+class InteralShipmentReport(ShipmentReport):
+ 'Interal Shipment Report'
+ __name__ = 'stock.shipment.internal.report'
+
+ @classmethod
+ def moves(cls, shipment):
+ if shipment.transit_location:
+ if shipment.state == 'shipped':
+ return shipment.incoming_moves
+ else:
+ return shipment.outgoing_moves
+ else:
+ return shipment.moves
diff --git a/modules/stock/shipment.xml b/modules/stock/shipment.xml
new file mode 100644
index 0000000000..bff335ebdd
--- /dev/null
+++ b/modules/stock/shipment.xml
@@ -0,0 +1,1107 @@
+
+
+
+
+
+
+
+
+ stock.shipment.in
+ form
+ shipment_in_form
+
+
+ stock.shipment.in
+ tree
+ shipment_in_tree
+
+
+ Supplier Shipments
+ stock.shipment.in
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+
+ Received
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+ stock.shipment.in.return
+ form
+ shipment_in_return_form
+
+
+ stock.shipment.in.return
+ tree
+ shipment_in_return_tree
+
+
+ Supplier Returns
+ stock.shipment.in.return
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+
+ Waiting
+
+
+
+
+
+
+ Partially Assigned
+
+
+
+
+
+
+ Assigned
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+ stock.shipment.out
+ form
+ shipment_out_form
+
+
+ stock.shipment.out
+ tree
+ shipment_out_tree
+
+
+
+ Customer Shipments
+ stock.shipment.out
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+
+ Waiting
+
+
+
+
+
+
+ Partially Assigned
+
+
+
+
+
+
+ Assigned
+
+
+
+
+
+
+ Picked
+
+
+
+
+
+
+ Packed
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+ stock.shipment.internal
+ form
+ shipment_internal_form
+
+
+ stock.shipment.internal
+ tree
+ shipment_internal_tree
+
+
+ Internal Shipments
+ stock.shipment.internal
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Requests
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+
+ Waiting
+
+
+
+
+
+
+ Partially Assigned
+
+
+
+
+
+
+ Assigned
+
+
+
+
+
+
+ Shipped
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+ stock.shipment.out.return
+ form
+ shipment_out_return_form
+
+
+ stock.shipment.out.return
+ tree
+ shipment_out_return_tree
+
+
+
+ Customer Returns
+ stock.shipment.out.return
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+
+ Received
+
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+ Delivery Note
+ stock.shipment.out
+ stock.shipment.out.delivery_note
+ stock/delivery_note.fodt
+
+
+ form_print
+ stock.shipment.out,-1
+
+
+
+
+ Picking List
+ stock.shipment.out
+ stock.shipment.out.picking_list
+ stock/picking_list.fodt
+
+
+ form_print
+ stock.shipment.out,-1
+
+
+
+
+ Restocking List
+ stock.shipment.in
+ stock.shipment.in.restocking_list
+ stock/supplier_restocking_list.fodt
+
+
+ form_print
+ stock.shipment.in,-1
+
+
+
+
+ Restocking List
+ stock.shipment.out.return
+ stock.shipment.out.return.restocking_list
+ stock/customer_return_restocking_list.fodt
+
+
+ form_print
+ stock.shipment.out.return,-1
+
+
+
+
+ Internal Shipment
+ stock.shipment.internal
+ stock.shipment.internal.report
+ stock/internal_shipment.fodt
+
+
+ form_print
+ stock.shipment.internal,-1
+
+
+
+
+
+ Customer Shipment
+
+
+
+
+
+
+
+
+
+
+
+ Customer Shipment
+
+
+
+
+ Supplier Shipment
+
+
+
+
+
+
+
+
+
+
+
+ Supplier Shipment
+
+
+
+
+ Internal Shipment
+
+
+
+
+
+
+
+
+
+
+
+ Internal Shipment
+
+
+
+
+ Customer Return Shipment
+
+
+
+
+
+
+
+
+
+
+
+ Customer Return Shipment
+
+
+
+
+
+ Supplier Return Shipment
+
+
+
+
+
+
+
+
+
+
+
+ Supplier Return Shipment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+
+
+
+
+
+
+
+
+ draft
+ Reset to Draft
+
+
+
+
+
+
+
+
+ receive
+ Receive
+ Are you sure you want to receive the shipment?
+
+
+
+
+
+
+
+
+ done
+ Done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+
+
+
+
+
+
+
+
+ draft
+ Draft
+
+
+
+
+
+
+
+
+ wait
+ Wait
+
+
+
+
+
+
+
+
+ pick
+ Pick
+
+
+
+
+
+
+
+
+ pack
+ Pack
+
+
+
+
+
+
+
+
+ done
+ Done
+ Are you sure you want to complete the shipment?
+
+
+
+
+
+
+
+
+ assign_try
+
+
+
+
+
+
+
+
+ assign_force
+
+
+
+
+
+
+
+
+ assign_wizard
+ Assign
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+
+
+
+
+
+
+
+
+ draft
+ Draft
+
+
+
+
+
+
+
+
+ wait
+ Wait
+
+
+
+
+
+
+
+
+ done
+ Done
+
+
+
+
+
+
+
+
+ assign_try
+
+
+
+
+
+
+
+
+ assign_force
+
+
+
+
+
+
+
+
+ assign_wizard
+ Assign
+
+
+
+
+
+
+
+
+ ship
+ Ship
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+
+
+
+
+
+
+
+
+ draft
+ Draft
+
+
+
+
+
+
+
+
+ receive
+ Receive
+ Are you sure you want to receive the shipment?
+
+
+
+
+
+
+
+
+ done
+ Done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+
+
+
+
+
+
+
+
+ draft
+ Draft
+
+
+
+
+
+
+
+
+ wait
+ Wait
+
+
+
+
+
+
+
+
+ done
+ Done
+ Are you sure you want to complete the shipment?
+
+
+
+
+
+
+
+
+ assign_try
+
+
+
+
+
+
+
+
+ assign_force
+
+
+
+
+
+
+
+
+ assign_wizard
+ Assign
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+ stock.shipment.assign.partial
+ form
+ shipment_assign_partial_form
+
+
+
+ Assign Supplier Return Shipment
+ stock.shipment.assign
+ stock.shipment.in.return
+
+
+ Assign Customer Shipment
+ stock.shipment.assign
+ stock.shipment.out
+
+
+ Assign Internal Shipment
+ stock.shipment.assign
+ stock.shipment.internal
+
+
+
+
diff --git a/modules/stock/stock.xml b/modules/stock/stock.xml
new file mode 100644
index 0000000000..6fbe3d1729
--- /dev/null
+++ b/modules/stock/stock.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+ Stock
+
+
+ Stock Administration
+
+
+
+ Stock Force Assignment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tryton-stock
+ icons/tryton-stock.svg
+
+
+ tryton-shipment-in
+ icons/tryton-shipment-in.svg
+
+
+ tryton-shipment-out
+ icons/tryton-shipment-out.svg
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/stock_reporting_margin.py b/modules/stock/stock_reporting_margin.py
new file mode 100644
index 0000000000..a760b32ac5
--- /dev/null
+++ b/modules/stock/stock_reporting_margin.py
@@ -0,0 +1,667 @@
+# 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 itertools import tee, zip_longest
+
+from sql import Literal, Null, With
+from sql.aggregate import Max, Min, Sum
+from sql.conditionals import Case, Coalesce
+from sql.functions import Ceil, CurrentTimestamp, DateTrunc, Log, Power, Round
+
+try:
+ import pygal
+except ImportError:
+ pygal = None
+from dateutil.relativedelta import relativedelta
+
+from trytond.i18n import lazy_gettext
+from trytond.model import ModelSQL, ModelView, fields
+from trytond.modules.currency.fields import Monetary
+from trytond.pool import Pool
+from trytond.pyson import Eval, If
+from trytond.tools import grouped_slice, reduce_ids
+from trytond.transaction import Transaction
+
+
+def pairwise(iterable):
+ a, b = tee(iterable)
+ next(b)
+ return zip_longest(a, b)
+
+
+class Abstract(ModelSQL, ModelView):
+
+ company = fields.Many2One(
+ 'company.company', lazy_gettext('stock.msg_stock_reporting_company'))
+ cost = Monetary(
+ lazy_gettext('stock.msg_stock_reporting_cost'),
+ currency='currency', digits='currency')
+ revenue = Monetary(
+ lazy_gettext('stock.msg_stock_reporting_revenue'),
+ currency='currency', digits='currency')
+ profit = Monetary(
+ lazy_gettext('stock.msg_stock_reporting_profit'),
+ currency='currency', digits='currency')
+ margin = fields.Numeric(
+ lazy_gettext('stock.msg_stock_reporting_margin'),
+ digits=(14, 4),
+ states={
+ 'invisible': ~Eval('margin'),
+ })
+ margin_trend = fields.Function(fields.Char(
+ lazy_gettext('stock.msg_stock_reporting_margin_trend')),
+ 'get_trend')
+ time_series = None
+
+ currency = fields.Many2One(
+ 'currency.currency',
+ lazy_gettext('stock.msg_stock_reporting_currency'))
+
+ @classmethod
+ def table_query(cls):
+ from_item, tables, withs = cls._joins()
+ return from_item.select(*cls._columns(tables, withs),
+ where=cls._where(tables, withs),
+ group_by=cls._group_by(tables, withs),
+ with_=withs.values())
+
+ @classmethod
+ def _joins(cls):
+ pool = Pool()
+ Company = pool.get('company.company')
+ Currency = pool.get('currency.currency')
+ Move = pool.get('stock.move')
+ Location = pool.get('stock.location')
+
+ tables = {}
+ tables['move'] = move = Move.__table__()
+ tables['move.company'] = company = Company.__table__()
+ tables['move.company.currency'] = currency = Currency.__table__()
+ tables['move.from_location'] = from_location = Location.__table__()
+ tables['move.to_location'] = to_location = Location.__table__()
+ withs = {}
+ withs['currency_rate'] = currency_rate = With(
+ query=Currency.currency_rate_sql())
+ withs['currency_rate_company'] = currency_rate_company = With(
+ query=Currency.currency_rate_sql())
+
+ from_item = (move
+ .join(currency_rate, type_='LEFT',
+ condition=(move.currency == currency_rate.currency)
+ & (currency_rate.start_date <= move.effective_date)
+ & ((currency_rate.end_date == Null)
+ | (currency_rate.end_date > move.effective_date))
+ )
+ .join(company,
+ condition=move.company == company.id)
+ .join(currency,
+ condition=company.currency == currency.id)
+ .join(currency_rate_company,
+ condition=(company.currency == currency_rate_company.currency)
+ & (currency_rate_company.start_date <= move.effective_date)
+ & ((currency_rate_company.end_date == Null)
+ | (currency_rate_company.end_date > move.effective_date))
+ )
+ .join(from_location,
+ condition=(move.from_location == from_location.id))
+ .join(to_location,
+ condition=(move.to_location == to_location.id)))
+ return from_item, tables, withs
+
+ @classmethod
+ def _columns(cls, tables, withs):
+ move = tables['move']
+ from_location = tables['move.from_location']
+ to_location = tables['move.to_location']
+ currency = tables['move.company.currency']
+
+ sign = Case(
+ (from_location.type.in_(cls._to_location_types())
+ & to_location.type.in_(cls._from_location_types()),
+ -1),
+ else_=1)
+ cost = cls._column_cost(tables, withs, sign)
+ revenue = cls._column_revenue(tables, withs, sign)
+ profit = revenue - cost
+ margin = Case(
+ (revenue != 0, profit / revenue),
+ else_=Null)
+ return [
+ cls._column_id(tables, withs).as_('id'),
+ Literal(0).as_('create_uid'),
+ CurrentTimestamp().as_('create_date'),
+ cls.write_uid.sql_cast(Literal(Null)).as_('write_uid'),
+ cls.write_date.sql_cast(Literal(Null)).as_('write_date'),
+ move.company.as_('company'),
+ cls.cost.sql_cast(
+ Round(cost, currency.digits)).as_('cost'),
+ cls.revenue.sql_cast(
+ Round(revenue, currency.digits)).as_('revenue'),
+ cls.profit.sql_cast(
+ Round(profit, currency.digits)).as_('profit'),
+ cls.margin.sql_cast(
+ Round(margin, cls.margin.digits[1])).as_('margin'),
+ currency.id.as_('currency'),
+ ]
+
+ @classmethod
+ def _column_id(cls, tables, withs):
+ move = tables['move']
+ return Min(move.id)
+
+ @classmethod
+ def _column_cost(cls, tables, withs, sign):
+ move = tables['move']
+ return Sum(
+ sign * cls.cost.sql_cast(move.internal_quantity)
+ * Coalesce(move.cost_price, 0))
+
+ @classmethod
+ def _column_revenue(cls, tables, withs, sign):
+ move = tables['move']
+ currency = withs['currency_rate']
+ currency_company = withs['currency_rate_company']
+ return Sum(
+ sign * cls.revenue.sql_cast(move.quantity)
+ * Coalesce(move.unit_price, 0)
+ * Coalesce(currency_company.rate / currency.rate, 0))
+
+ @classmethod
+ def _group_by(cls, tables, withs):
+ move = tables['move']
+ currency = tables['move.company.currency']
+ return [move.company, currency.id, currency.digits]
+
+ @classmethod
+ def _where(cls, tables, withs):
+ context = Transaction().context
+ move = tables['move']
+ from_location = tables['move.from_location']
+ to_location = tables['move.to_location']
+
+ where = move.company == context.get('company')
+ where &= ((
+ from_location.type.in_(cls._from_location_types())
+ & to_location.type.in_(cls._to_location_types()))
+ | (
+ from_location.type.in_(cls._to_location_types())
+ & to_location.type.in_(cls._from_location_types())))
+ where &= move.state == 'done'
+ from_date = context.get('from_date')
+ if from_date:
+ where &= move.effective_date >= from_date
+ to_date = context.get('to_date')
+ if to_date:
+ where &= move.effective_date <= to_date
+ return where
+
+ @classmethod
+ def _from_location_types(cls):
+ return ['storage', 'drop']
+
+ @classmethod
+ def _to_location_types(cls):
+ types = ['customer']
+ if Transaction().context.get('include_lost'):
+ types += ['lost_found']
+ return types
+
+ @property
+ def time_series_all(self):
+ delta = self._period_delta()
+ for ts, next_ts in pairwise(self.time_series or []):
+ yield ts
+ if delta and next_ts:
+ date = ts.date + delta
+ while date < next_ts.date:
+ yield None
+ date += delta
+
+ @classmethod
+ def _period_delta(cls):
+ context = Transaction().context
+ return {
+ 'year': relativedelta(years=1),
+ 'month': relativedelta(months=1),
+ 'day': relativedelta(days=1),
+ }.get(context.get('period'))
+
+ def get_trend(self, name):
+ name = name[:-len('_trend')]
+ if pygal:
+ chart = pygal.Line()
+ chart.add('', [getattr(ts, name) or 0 if ts else 0
+ for ts in self.time_series_all])
+ return chart.render_sparktext()
+
+ @classmethod
+ def view_attributes(cls):
+ return super().view_attributes() + [
+ ('/tree/field[@name="profit"]', 'visual',
+ If(Eval('profit', 0) < 0, 'danger', '')),
+ ('/tree/field[@name="margin"]', 'visual',
+ If(Eval('margin', 0) < 0, 'danger', '')),
+ ]
+
+
+class AbstractTimeseries(Abstract):
+
+ date = fields.Date("Date")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._order = [('date', 'ASC')]
+
+ @classmethod
+ def _columns(cls, tables, withs):
+ return super()._columns(tables, withs) + [
+ cls._column_date(tables, withs).as_('date')]
+
+ @classmethod
+ def _column_date(cls, tables, withs):
+ context = Transaction().context
+ move = tables['move']
+ date = DateTrunc(context.get('period'), move.effective_date)
+ date = cls.date.sql_cast(date)
+ return date
+
+ @classmethod
+ def _group_by(cls, tables, withs):
+ return super()._group_by(tables, withs) + [
+ cls._column_date(tables, withs)]
+
+
+class Context(ModelView):
+ "Stock Reporting Margin Context"
+ __name__ = 'stock.reporting.margin.context'
+
+ company = fields.Many2One('company.company', "Company", required=True)
+ from_date = fields.Date("From Date",
+ domain=[
+ If(Eval('to_date') & Eval('from_date'),
+ ('from_date', '<=', Eval('to_date')),
+ ()),
+ ])
+ to_date = fields.Date("To Date",
+ domain=[
+ If(Eval('from_date') & Eval('to_date'),
+ ('to_date', '>=', Eval('from_date')),
+ ()),
+ ])
+ period = fields.Selection([
+ ('year', "Year"),
+ ('month', "Month"),
+ ('day', "Day"),
+ ], "Period", required=True)
+ include_lost = fields.Boolean(
+ "Include Lost",
+ help="If checked, the cost of product moved "
+ "to a lost and found location is included.")
+
+ @classmethod
+ def default_company(cls):
+ return Transaction().context.get('company')
+
+ @classmethod
+ def default_from_date(cls):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ context = Transaction().context
+ if 'from_date' in context:
+ return context['from_date']
+ return Date.today() - relativedelta(years=1)
+
+ @classmethod
+ def default_to_date(cls):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ context = Transaction().context
+ if 'to_date' in context:
+ return context['to_date']
+ return Date.today()
+
+ @classmethod
+ def default_period(cls):
+ return Transaction().context.get('period', 'month')
+
+ @classmethod
+ def default_include_lost(cls):
+ return Transaction().context.get('include_lost', False)
+
+
+class Main(Abstract, ModelView):
+ "Stock Reporting Margin"
+ __name__ = 'stock.reporting.margin.main'
+
+ time_series = fields.Function(fields.One2Many(
+ 'stock.reporting.margin.main.time_series', None, "Time Series"),
+ 'get_time_series')
+
+ def get_rec_name(self, name):
+ return ''
+
+ def get_time_series(self, name):
+ pool = Pool()
+ Timeseries = pool.get('stock.reporting.margin.main.time_series')
+ return [t.id for t in Timeseries.search([])]
+
+
+class MainTimeseries(AbstractTimeseries, ModelView):
+ "Stock Reporting Margin"
+ __name__ = 'stock.reporting.margin.main.time_series'
+
+
+class ProductMixin:
+ __slots__ = ()
+
+ product = fields.Many2One(
+ 'product.product', "Product",
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends={'company'})
+ internal_quantity = fields.Float("Internal Quantity")
+ quantity = fields.Function(fields.Float(
+ "Quantity", digits='unit'), 'get_quantity')
+ unit = fields.Many2One('product.uom', "Unit")
+
+ @classmethod
+ def _joins(cls):
+ pool = Pool()
+ Product = pool.get('product.product')
+ Template = pool.get('product.template')
+ from_item, tables, withs = super()._joins()
+ if 'move.product' not in tables:
+ product = Product.__table__()
+ tables['move.product'] = product
+ move = tables['move']
+ from_item = (from_item
+ .join(product, condition=move.product == product.id))
+ if 'move.product.template' not in tables:
+ template = Template.__table__()
+ tables['move.product.template'] = template
+ product = tables['move.product']
+ from_item = (from_item
+ .join(template, condition=product.template == template.id))
+ return from_item, tables, withs
+
+ @classmethod
+ def _columns(cls, tables, withs):
+ move = tables['move']
+ from_location = tables['move.from_location']
+ to_location = tables['move.to_location']
+ template = tables['move.product.template']
+ sign = Case(
+ (from_location.type.in_(cls._to_location_types())
+ & to_location.type.in_(cls._from_location_types()),
+ -1),
+ else_=1)
+ return super()._columns(tables, withs) + [
+ move.product.as_('product'),
+ Sum(sign * move.internal_quantity).as_('internal_quantity'),
+ template.default_uom.as_('unit'),
+ ]
+
+ @classmethod
+ def _group_by(cls, tables, withs):
+ move = tables['move']
+ template = tables['move.product.template']
+ return super()._group_by(tables, withs) + [
+ move.product, template.default_uom]
+
+ def get_rec_name(self, name):
+ return self.product.rec_name
+
+ def get_quantity(self, name):
+ return self.unit.round(self.internal_quantity)
+
+
+class Product(ProductMixin, Abstract, ModelView):
+ "Stock Reporting Margin per Product"
+ __name__ = 'stock.reporting.margin.product'
+
+ time_series = fields.One2Many(
+ 'stock.reporting.margin.product.time_series', 'product', "Time Series")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._order.insert(0, ('product', 'ASC'))
+
+ @classmethod
+ def _column_id(cls, tables, withs):
+ move = tables['move']
+ return move.product
+
+
+class ProductTimeseries(ProductMixin, AbstractTimeseries, ModelView):
+ "Stock Reporting Margin per Product"
+ __name__ = 'stock.reporting.margin.product.time_series'
+
+
+class CategoryMixin:
+ __slots__ = ()
+
+ category = fields.Many2One('product.category', "Category")
+
+ @classmethod
+ def _joins(cls):
+ pool = Pool()
+ Product = pool.get('product.product')
+ TemplateCategory = pool.get('product.template-product.category.all')
+ from_item, tables, withs = super()._joins()
+ if 'move.product' not in tables:
+ product = Product.__table__()
+ tables['move.product'] = product
+ move = tables['move']
+ from_item = (from_item
+ .join(product, condition=move.product == product.id))
+ if 'move.product.template_category' not in tables:
+ template_category = TemplateCategory.__table__()
+ tables['move.product.template_category'] = template_category
+ product = tables['move.product']
+ from_item = (from_item
+ .join(template_category,
+ condition=product.template == template_category.template))
+ return from_item, tables, withs
+
+ @classmethod
+ def _columns(cls, tables, withs):
+ template_category = tables['move.product.template_category']
+ return super()._columns(tables, withs) + [
+ template_category.category.as_('category')]
+
+ @classmethod
+ def _column_id(cls, tables, withs):
+ pool = Pool()
+ Category = pool.get('product.category')
+ category = Category.__table__()
+ move = tables['move']
+ template_category = tables['move.product.template_category']
+ # Get a stable number of category over time
+ # by using number one order bigger.
+ nb_category = category.select(
+ Power(10, (Ceil(Log(Max(category.id))) + Literal(1))))
+ return Min(move.id * nb_category + template_category.id)
+
+ @classmethod
+ def _group_by(cls, tables, withs):
+ template_category = tables['move.product.template_category']
+ return super()._group_by(tables, withs) + [template_category.category]
+
+ @classmethod
+ def _where(cls, tables, withs):
+ template_category = tables['move.product.template_category']
+ where = super()._where(tables, withs)
+ where &= template_category.category != Null
+ return where
+
+ def get_rec_name(self, name):
+ return self.category.rec_name if self.category else None
+
+
+class Category(CategoryMixin, Abstract, ModelView):
+ "Stock Reporting Margin per Category"
+ __name__ = 'stock.reporting.margin.category'
+
+ time_series = fields.One2Many(
+ 'stock.reporting.margin.category.time_series', 'category',
+ "Time Series")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._order.insert(0, ('category', 'ASC'))
+
+ @classmethod
+ def _column_id(cls, tables, withs):
+ template_category = tables['move.product.template_category']
+ return template_category.category
+
+
+class CategoryTimeseries(CategoryMixin, AbstractTimeseries, ModelView):
+ "Stock Reporting Margin per Category"
+ __name__ = 'stock.reporting.margin.category.time_series'
+
+
+class CategoryTree(ModelSQL, ModelView):
+ "Stock Reporting Margin per Category"
+ __name__ = 'stock.reporting.margin.category.tree'
+
+ name = fields.Function(fields.Char("Name"), 'get_name')
+ parent = fields.Many2One('stock.reporting.margin.category.tree', "Parent")
+ children = fields.One2Many(
+ 'stock.reporting.margin.category.tree', 'parent', "Children")
+ cost = fields.Function(Monetary(
+ lazy_gettext('stock.msg_stock_reporting_cost'),
+ currency='currency', digits='currency'),
+ 'get_total')
+ revenue = fields.Function(Monetary(
+ lazy_gettext('stock.msg_stock_reporting_revenue'),
+ currency='currency', digits='currency'),
+ 'get_total')
+ profit = fields.Function(Monetary(
+ lazy_gettext('stock.msg_stock_reporting_profit'),
+ currency='currency', digits='currency'),
+ 'get_total')
+ margin = fields.Function(Monetary(
+ lazy_gettext('stock.msg_stock_reporting_margin'),
+ digits=(14, 4)),
+ 'get_margin')
+
+ currency = fields.Function(fields.Many2One(
+ 'currency.currency',
+ lazy_gettext('stock.msg_stock_reporting_currency')),
+ 'get_currency')
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._order.insert(0, ('name', 'ASC'))
+
+ @classmethod
+ def table_query(cls):
+ pool = Pool()
+ Category = pool.get('product.category')
+ return Category.__table__()
+
+ @classmethod
+ def get_name(cls, categories, name):
+ pool = Pool()
+ Category = pool.get('product.category')
+ categories = Category.browse(categories)
+ return {c.id: c.name for c in categories}
+
+ @classmethod
+ def order_name(cls, tables):
+ pool = Pool()
+ Category = pool.get('product.category')
+ table, _ = tables[None]
+ if 'category' not in tables:
+ category = Category.__table__()
+ tables['category'] = {
+ None: (category, table.id == category.id),
+ }
+ return Category.name.convert_order(
+ 'name', tables['category'], Category)
+
+ def time_series_all(self):
+ return []
+
+ @classmethod
+ def get_total(cls, categories, names):
+ pool = Pool()
+ ReportingCategory = pool.get('stock.reporting.margin.category')
+ table = cls.__table__()
+ reporting_category = ReportingCategory.__table__()
+ cursor = Transaction().connection.cursor()
+
+ categories = cls.search([
+ ('parent', 'child_of', [c.id for c in categories]),
+ ])
+ ids = [c.id for c in categories]
+ parents = {}
+ reporting_categories = []
+ for sub_ids in grouped_slice(ids):
+ sub_ids = list(sub_ids)
+ where = reduce_ids(table.id, sub_ids)
+ cursor.execute(*table.select(table.id, table.parent, where=where))
+ parents.update(cursor)
+
+ where = reduce_ids(reporting_category.id, sub_ids)
+ cursor.execute(
+ *reporting_category.select(reporting_category.id, where=where))
+ reporting_categories.extend(r for r, in cursor)
+
+ result = {}
+ reporting_categories = ReportingCategory.browse(reporting_categories)
+ for name in names:
+ values = dict.fromkeys(ids, 0)
+ values.update(
+ (c.id, getattr(c, name)) for c in reporting_categories)
+ result[name] = cls._sum_tree(categories, values, parents)
+ return result
+
+ @classmethod
+ def _sum_tree(cls, categories, values, parents):
+ result = values.copy()
+ categories = set((c.id for c in categories))
+ leafs = categories - set(parents.values())
+ while leafs:
+ for category in leafs:
+ categories.remove(category)
+ parent = parents.get(category)
+ if parent in result:
+ result[parent] += result[category]
+ next_leafs = set(categories)
+ for category in categories:
+ parent = parents.get(category)
+ if not parent:
+ continue
+ if parent in next_leafs and parent in categories:
+ next_leafs.remove(parent)
+ leafs = next_leafs
+ return result
+
+ def get_margin(self, name):
+ digits = self.__class__.margin.digits
+ if self.profit is not None and self.revenue:
+ return (self.profit / self.revenue).quantize(
+ Decimal(1) / 10 ** digits[1])
+
+ def get_currency(self, name):
+ pool = Pool()
+ Company = pool.get('company.company')
+ company = Transaction().context.get('company')
+ if company:
+ return Company(company).currency.id
+
+ @classmethod
+ def view_attributes(cls):
+ return super().view_attributes() + [
+ ('/tree/field[@name="profit"]', 'visual',
+ If(Eval('profit', 0) < 0, 'danger', '')),
+ ('/tree/field[@name="margin"]', 'visual',
+ If(Eval('margin', 0) < 0, 'danger', '')),
+ ]
diff --git a/modules/stock/stock_reporting_margin.xml b/modules/stock/stock_reporting_margin.xml
new file mode 100644
index 0000000000..cbfc1c2567
--- /dev/null
+++ b/modules/stock/stock_reporting_margin.xml
@@ -0,0 +1,591 @@
+
+
+
+
+
+
+
+
+ stock.reporting.margin.context
+ form
+ reporting_margin_context_form
+
+
+
+
+
+ stock.reporting.margin.main
+ tree
+ reporting_margin_main_list
+
+
+
+ stock.reporting.margin.main
+ graph
+ reporting_margin_main_graph_margin
+
+
+
+ stock.reporting.margin.main
+ graph
+ reporting_margin_main_graph_profit
+
+
+
+ stock.reporting.margin.main
+ graph
+ reporting_margin_main_graph_amount
+
+
+
+ Margins
+ stock.reporting.margin.main
+ stock.reporting.margin.context
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tree_open
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.reporting.margin.main.time_series
+ tree
+ reporting_margin_main_time_series_list
+
+
+
+ stock.reporting.margin.main.time_series
+ graph
+ reporting_margin_main_time_series_graph_margin
+
+
+
+ stock.reporting.margin.main.time_series
+ graph
+ reporting_margin_main_time_series_graph_profit
+
+
+
+ stock.reporting.margin.main.time_series
+ graph
+ reporting_margin_main_time_series_graph_amount
+
+
+
+ Margins
+ stock.reporting.margin.main.time_series
+ stock.reporting.margin.context
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tree_open
+ stock.reporting.margin.main,-1
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.reporting.margin.product
+
+
+ reporting_margin_product_list
+
+
+
+ stock.reporting.margin.product
+
+
+ reporting_margin_product_graph_margin
+
+
+
+ stock.reporting.margin.product
+
+
+ reporting_margin_product_graph_profit
+
+
+
+ stock.reporting.margin.product
+
+
+ reporting_margin_product_graph_amount
+
+
+
+ Margins per Product
+ stock.reporting.margin.product
+ stock.reporting.margin.context
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tree_open
+
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.reporting.margin.product.time_series
+
+
+ reporting_margin_product_time_series_list
+
+
+
+ stock.reporting.margin.product.time_series
+ graph
+ reporting_margin_main_time_series_graph_margin
+
+
+
+ stock.reporting.margin.product.time_series
+ graph
+ reporting_margin_main_time_series_graph_profit
+
+
+
+ stock.reporting.margin.product.time_series
+ graph
+ reporting_margin_main_time_series_graph_amount
+
+
+
+ Margins per Product
+ stock.reporting.margin.product.time_series
+ stock.reporting.margin.context
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tree_open
+ stock.reporting.margin.product,-1
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.reporting.margin.category.tree
+ tree
+ children
+ reporting_margin_category_tree
+
+
+
+ Margins per Category
+ stock.reporting.margin.category.tree
+ stock.reporting.margin.context
+
+
+
+
+
+
+
+
+ tree_open
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.reporting.margin.category
+
+
+ reporting_margin_category_list
+
+
+
+ stock.reporting.margin.category
+
+
+ reporting_margin_category_graph_margin
+
+
+
+ stock.reporting.margin.category
+
+
+ reporting_margin_category_graph_profit
+
+
+
+ stock.reporting.margin.category
+
+
+ reporting_margin_category_graph_amount
+
+
+
+ Margins per Category
+ stock.reporting.margin.category
+ stock.reporting.margin.context
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tree_open
+ stock.reporting.margin.category.tree,-1
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.reporting.margin.category.time_series
+ tree
+ reporting_margin_main_time_series_list
+
+
+
+ stock.reporting.margin.category.time_series
+ graph
+ reporting_margin_main_time_series_graph_margin
+
+
+
+ stock.reporting.margin.category.time_series
+ graph
+ reporting_margin_main_time_series_graph_profit
+
+
+
+ stock.reporting.margin.category.time_series
+ graph
+ reporting_margin_main_time_series_graph_amount
+
+
+
+ Margins per Category
+ stock.reporting.margin.category.time_series
+ stock.reporting.margin.context
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tree_open
+ stock.reporting.margin.category,-1
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/supplier_restocking_list.fodt b/modules/stock/supplier_restocking_list.fodt
new file mode 100644
index 0000000000..ccc30389d7
--- /dev/null
+++ b/modules/stock/supplier_restocking_list.fodt
@@ -0,0 +1,482 @@
+
+
+
+ LibreOffice/5.2.7.2$Linux_X86_64 LibreOffice_project/20m0$Build-2Bertrand Chenal2009-03-26T13:54:482016-03-21T16:06:02.54015281351PT6H57M42S
+
+
+ 0
+ 0
+ 43760
+ 21691
+ true
+ false
+
+
+ view2
+ 2630
+ 5313
+ 0
+ 0
+ 43759
+ 21689
+ 0
+ 0
+ false
+ 100
+ false
+
+
+
+
+ false
+ true
+ true
+ true
+ 0
+ true
+ true
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ false
+
+ false
+ false
+ true
+ false
+ false
+
+ false
+ false
+ false
+ false
+ true
+ 1829759
+ false
+ true
+ true
+ false
+ true
+ true
+ false
+ true
+ 0
+ false
+ true
+ high-resolution
+ false
+ false
+ false
+ true
+ true
+ true
+
+ true
+ false
+ false
+ true
+ false
+ false
+ false
+
+ false
+ false
+ 1289861
+ false
+ 1
+ true
+ false
+ false
+ 0
+ false
+ false
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <if test="company and company.header">
+ <for each="line in company.header.split('\n')">
+ <line>
+ </for>
+ </if>
+ <company.rec_name if company else ''>
+
+
+ <if test="company and company.footer">
+ <for each="line in company.footer.split('\n')">
+ <line>
+ </for>
+ </if>
+ 2/2
+
+
+
+
+
+
+
+
+
+
+
+
+ <for each="shipment in records">
+ Restocking List
+ Shipment Number: <shipment.number>
+ Reference: <shipment.origins or ''><', ' if (shipment.origins and shipment.reference) else ''><shipment.reference or ''>
+ Supplier: <shipment.supplier.rec_name>
+ Planned Date: <shipment.planned_date and format_date(shipment.planned_date, user.language) or ''>
+ Warehouse: <shipment.warehouse.rec_name>
+
+
+
+
+
+
+
+ From Location
+
+
+ To Location
+
+
+ Product
+
+
+ Quantity
+
+
+
+
+
+ <for each="move in moves[shipment.id]">
+
+
+
+
+
+
+
+
+
+
+
+ <move.from_location.rec_name>
+
+
+ <move.to_location.rec_name>
+
+
+ <move.product.rec_name>
+
+
+ <format_number_symbol(move.quantity, user.language, move.uom, digits=move.uom.digits)>
+
+
+
+
+ </for>
+
+
+
+
+
+
+
+
+
+
+ </for>
+
+
+
diff --git a/modules/stock/tests/__init__.py b/modules/stock/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock/tests/scenario_stock_average_cost_price.rst b/modules/stock/tests/scenario_stock_average_cost_price.rst
new file mode 100644
index 0000000000..47ee3959f4
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_average_cost_price.rst
@@ -0,0 +1,253 @@
+========================
+Stock Average Cost Price
+========================
+
+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('stock')
+
+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
+ >>> product.cost_price = Decimal('80')
+ >>> template.save()
+ >>> product, = template.products
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Negative Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('28')
+ >>> template.cost_price_method = 'average'
+ >>> negative_product, = template.products
+ >>> negative_product.cost_price = Decimal('5.0000')
+ >>> template.save()
+ >>> negative_product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> storage_sub_loc = Location(
+ ... name="Storage Sub", type='storage', parent=storage_loc)
+ >>> storage_sub_loc.save()
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+
+Make 1 unit of the product available @ 100 ::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_sub_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('100')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.click('do')
+
+Check Cost Price is 100::
+
+ >>> product.reload()
+ >>> product.cost_price
+ Decimal('100.0000')
+
+Add 1 more unit @ 200::
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('200')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.click('do')
+
+Check Cost Price Average is 150::
+
+ >>> product.reload()
+ >>> product.cost_price
+ Decimal('150.0000')
+
+Add twice 1 more unit @ 200::
+
+ >>> incoming_moves = []
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('200')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.save()
+ >>> incoming_moves.append(incoming_move)
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('200')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.save()
+ >>> incoming_moves.append(incoming_move)
+
+ >>> StockMove.click(incoming_moves, 'do')
+
+Check Cost Price Average is 175::
+
+ >>> product.reload()
+ >>> product.cost_price
+ Decimal('175.0000')
+
+Reduce Cost Price by 80%, to force to write recomputed price later::
+
+ >>> modify_cost_price = Wizard('product.modify_cost_price', [product])
+ >>> modify_cost_price.form.cost_price = 'cost_price * 0.8'
+ >>> modify_cost_price.form.date = today + datetime.timedelta(days=1)
+ >>> modify_cost_price.execute('modify')
+ >>> product.cost_price
+ Decimal('140.0000')
+
+Increase Cost Price by 10% using Template wizard::
+
+ >>> modify_cost_price = Wizard(
+ ... 'product.modify_cost_price', [product.template])
+ >>> modify_cost_price.form.cost_price = 'cost_price * 1.1'
+ >>> modify_cost_price.form.date = today + datetime.timedelta(days=1)
+ >>> modify_cost_price.execute('modify')
+ >>> product.reload()
+ >>> product.cost_price
+ Decimal('154.0000')
+
+Send one product we don't have in stock::
+
+ >>> outgoing_move = StockMove()
+ >>> outgoing_move.product = negative_product
+ >>> outgoing_move.uom = unit
+ >>> outgoing_move.quantity = 1
+ >>> outgoing_move.unit_price = Decimal('28')
+ >>> outgoing_move.from_location = storage_loc
+ >>> outgoing_move.to_location = customer_loc
+ >>> outgoing_move.planned_date = today
+ >>> outgoing_move.effective_date = today
+ >>> outgoing_move.company = company
+ >>> outgoing_move.currency = company.currency
+ >>> outgoing_move.click('do')
+
+Cost price should stay 5::
+
+ >>> negative_product.cost_price
+ Decimal('5.0000')
+
+Return one product to the supplier::
+
+ >>> outgoing_move = StockMove()
+ >>> outgoing_move.product = negative_product
+ >>> outgoing_move.uom = unit
+ >>> outgoing_move.quantity = 1
+ >>> outgoing_move.unit_price = Decimal('28')
+ >>> outgoing_move.currency = company.currency
+ >>> outgoing_move.from_location = storage_loc
+ >>> outgoing_move.to_location = supplier_loc
+ >>> outgoing_move.planned_date = today
+ >>> outgoing_move.effective_date = today
+ >>> outgoing_move.company = company
+ >>> outgoing_move.click('do')
+
+Cost price should stay 5::
+
+ >>> negative_product.cost_price
+ Decimal('5.0000')
+
+Receive one unit of the product with negative stock so the stock stays negative::
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = negative_product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('3')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.click('do')
+
+Cost price should be set to last unit price::
+
+ >>> negative_product.reload()
+ >>> negative_product.cost_price
+ Decimal('3.0000')
+
+Receive two units of the product so the stock becomes positive::
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = negative_product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 2
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('2')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.click('do')
+
+Cost price should be set to last unit price::
+
+ >>> negative_product.reload()
+ >>> negative_product.cost_price
+ Decimal('2.0000')
+
+Recompute Cost Price::
+
+ >>> recompute = Wizard('product.recompute_cost_price', [negative_product])
+ >>> recompute.execute('recompute')
+ >>> negative_product.cost_price
+ Decimal('2.0000')
diff --git a/modules/stock/tests/scenario_stock_inventory.rst b/modules/stock/tests/scenario_stock_inventory.rst
new file mode 100644
index 0000000000..403394ebe1
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_inventory.rst
@@ -0,0 +1,247 @@
+========================
+Stock Inventory 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('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> lost_found_loc, = Location.find([('type', '=', 'lost_found')])
+
+Create products::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> 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
+ >>> product.cost_price = Decimal('80')
+ >>> template.save()
+ >>> product, = template.products
+
+ >>> kg, = ProductUom.find([('name', '=', 'Kilogram')])
+ >>> template2 = ProductTemplate()
+ >>> template2.name = 'Product'
+ >>> template2.default_uom = kg
+ >>> template2.type = 'goods'
+ >>> template2.list_price = Decimal('140')
+ >>> template2.cost_price_method = 'average'
+ >>> product2, = template2.products
+ >>> product2.cost_price = Decimal('60')
+ >>> template2.save()
+ >>> product2, = template2.products
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.consumable = True
+ >>> template.list_price = Decimal('300')
+ >>> template.cost_price_method = 'average'
+ >>> consumable, = template.products
+ >>> consumable.cost_price = Decimal('80')
+ >>> template.save()
+ >>> consumable, = template.products
+
+Fill storage::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('100')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_moves = [incoming_move]
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product2
+ >>> incoming_move.uom = kg
+ >>> incoming_move.quantity = 2.5
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('70')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_moves.append(incoming_move)
+ >>> StockMove.click(incoming_moves, 'do')
+
+Create an inventory::
+
+ >>> Inventory = Model.get('stock.inventory')
+ >>> inventory = Inventory()
+ >>> inventory.location = storage_loc
+ >>> inventory.empty_quantity = 'keep'
+ >>> inventory.save()
+ >>> inventory.click('complete_lines')
+ >>> line_by_product = {l.product.id: l for l in inventory.lines}
+ >>> line_p1 = line_by_product[product.id]
+ >>> line_p1.expected_quantity
+ 1.0
+ >>> line_p1.quantity = 3
+ >>> line_p2 = line_by_product[product2.id]
+ >>> line_p2.expected_quantity
+ 2.5
+ >>> inventory.save()
+
+Fill storage with more quantities::
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('100')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_moves = [incoming_move]
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product2
+ >>> incoming_move.uom = kg
+ >>> incoming_move.quantity = 1.3
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('70')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_moves.append(incoming_move)
+ >>> StockMove.click(incoming_moves, 'do')
+
+Update the inventory::
+
+ >>> inventory.click('complete_lines')
+ >>> line_p1.reload()
+ >>> line_p1.expected_quantity
+ 2.0
+ >>> line_p1.quantity
+ 3.0
+ >>> line_p2.reload()
+ >>> line_p2.expected_quantity
+ 3.8
+ >>> line_p2.quantity = 3.8
+ >>> line_p2.save()
+
+Confirm the inventory::
+
+ >>> inventory.click('confirm')
+ >>> line_p1.reload()
+ >>> line_p1.expected_quantity
+ 2.0
+ >>> move, = line_p1.moves
+ >>> move.quantity
+ 1.0
+ >>> move.from_location == lost_found_loc
+ True
+ >>> move.to_location == inventory.location
+ True
+ >>> line_p2.reload()
+ >>> len(line_p2.moves)
+ 0
+
+Creating an inventory with empty quantities::
+
+ >>> inventory = Inventory()
+ >>> inventory.location = storage_loc
+ >>> inventory.empty_quantity = 'keep'
+ >>> line = inventory.lines.new()
+ >>> line.product = product
+ >>> inventory.click('confirm')
+ >>> line, = inventory.lines
+ >>> len(line.moves)
+ 0
+
+Empty storage::
+
+ >>> Inventory = Model.get('stock.inventory')
+ >>> inventory = Inventory()
+ >>> inventory.location = storage_loc
+ >>> inventory.empty_quantity = 'keep'
+ >>> line = inventory.lines.new()
+ >>> line.product = product
+ >>> line.quantity = 0
+ >>> line = inventory.lines.new()
+ >>> line.product = product2
+ >>> line.quantity = 0
+ >>> inventory.save()
+ >>> line_p1, line_p2 = inventory.lines
+ >>> line_p1.quantity
+ 0.0
+ >>> line_p1.expected_quantity
+ 3.0
+ >>> line_p2.quantity
+ 0.0
+ >>> line_p2.expected_quantity
+ 3.8
+ >>> inventory.click('confirm')
+
+Add quantity of consumable product::
+
+ >>> inventory = Inventory()
+ >>> inventory.location = storage_loc
+ >>> inventory.empty_quantity = 'keep'
+ >>> line = inventory.lines.new()
+ >>> line.product = consumable
+ >>> line.quantity = 5.0
+ >>> inventory.click('complete_lines')
+ >>> len(inventory.lines)
+ 1
+ >>> inventory.click('confirm')
+ >>> line, = inventory.lines
+ >>> move, = line.moves
+ >>> move.quantity
+ 5.0
+ >>> move.from_location == lost_found_loc
+ True
+ >>> move.to_location == inventory.location
+ True
+
+Create an inventory that should be empty after completion::
+
+ >>> Inventory = Model.get('stock.inventory')
+ >>> inventory = Inventory()
+ >>> inventory.location = storage_loc
+ >>> inventory.empty_quantity = 'keep'
+ >>> inventory.click('complete_lines')
+ >>> len(inventory.lines)
+ 0
diff --git a/modules/stock/tests/scenario_stock_inventory_count.rst b/modules/stock/tests/scenario_stock_inventory_count.rst
new file mode 100644
index 0000000000..ef0dcf6fda
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_inventory_count.rst
@@ -0,0 +1,120 @@
+==============================
+Stock Inventory Count 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('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+
+Create products::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> 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
+ >>> product.cost_price = Decimal('80')
+ >>> template.save()
+ >>> product, = template.products
+
+ >>> kg, = ProductUom.find([('name', '=', 'Kilogram')])
+ >>> template2 = ProductTemplate()
+ >>> template2.name = 'Product'
+ >>> template2.default_uom = kg
+ >>> template2.type = 'goods'
+ >>> template2.list_price = Decimal('140')
+ >>> template2.cost_price_method = 'average'
+ >>> product2, = template2.products
+ >>> product2.cost_price = Decimal('60')
+ >>> template2.save()
+ >>> product2, = template2.products
+
+Create an inventory::
+
+ >>> Inventory = Model.get('stock.inventory')
+ >>> inventory = Inventory()
+ >>> inventory.location = storage_loc
+ >>> inventory.empty_quantity = 'keep'
+ >>> inventory.save()
+
+Count inventory::
+
+ >>> _ = inventory.click('do_count')
+ >>> count = Wizard('stock.inventory.count', [inventory])
+
+ >>> count.form.search = product
+
+ >>> count.execute('quantity') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ InventoryCountWarning: ...
+
+ >>> Model.get('res.user.warning')(user=config.user,
+ ... name='stock.inventory,%s.product.product,%s.count_create' % (
+ ... inventory.id, product.id)).save()
+ >>> count.execute('quantity')
+ >>> count.form.quantity
+ 1.0
+ >>> count.form.total_quantity
+ 1.0
+ >>> count.execute('add')
+
+ >>> count.form.search = product
+ >>> count.execute('quantity')
+ >>> count.form.total_quantity
+ 2.0
+ >>> count.execute('add')
+
+ >>> count.form.search = product2
+ >>> Model.get('res.user.warning')(user=config.user,
+ ... name='stock.inventory,%s.product.product,%s.count_create' % (
+ ... inventory.id, product2.id)).save()
+ >>> count.execute('quantity')
+ >>> count.form.quantity
+ >>> count.form.total_quantity
+ >>> count.form.quantity = 10
+ >>> count.form.total_quantity
+ 10.0
+ >>> count.execute('add')
+
+ >>> count.execute('end')
+
+Check inventory::
+
+ >>> len(inventory.lines)
+ 2
+ >>> line1, = [l for l in inventory.lines if l.product == product]
+ >>> line1.quantity
+ 2.0
+ >>> line2, = [l for l in inventory.lines if l.product == product2]
+ >>> line2.quantity
+ 10.0
diff --git a/modules/stock/tests/scenario_stock_inventory_empty_quantity.rst b/modules/stock/tests/scenario_stock_inventory_empty_quantity.rst
new file mode 100644
index 0000000000..d06f986778
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_inventory_empty_quantity.rst
@@ -0,0 +1,88 @@
+=======================================
+Stock Inventory Scenario Empty Quantity
+=======================================
+
+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('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> lost_found_loc, = Location.find([('type', '=', 'lost_found')])
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+
+ >>> 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
+ >>> product.cost_price = Decimal('80')
+ >>> template.save()
+ >>> product, = template.products
+
+Fill storage::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('100')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.click('do')
+
+Creating an inventory with empty quantities creates and empty move::
+
+ >>> Inventory = Model.get('stock.inventory')
+ >>> inventory = Inventory()
+ >>> inventory.location = storage_loc
+ >>> inventory.empty_quantity = 'empty'
+ >>> inventory.save()
+ >>> inventory.click('complete_lines')
+ >>> line, = inventory.lines
+ >>> line.expected_quantity
+ 1.0
+ >>> line.quantity
+ >>> inventory.click('confirm')
+ >>> line.reload()
+ >>> line.expected_quantity
+ 1.0
+ >>> move, = line.moves
+ >>> move.quantity
+ 1.0
+ >>> move.from_location == inventory.location
+ True
+ >>> move.to_location == lost_found_loc
+ True
diff --git a/modules/stock/tests/scenario_stock_move_in_future.rst b/modules/stock/tests/scenario_stock_move_in_future.rst
new file mode 100644
index 0000000000..a1ebb70265
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_move_in_future.rst
@@ -0,0 +1,71 @@
+=============================
+Stock Move In Future Scenario
+=============================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import Model
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import (
+ ... create_company, get_company)
+ >>> today = datetime.date.today()
+ >>> tomorrow = today + relativedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+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('20')
+ >>> template.save()
+ >>> product, = template.products
+ >>> product.cost_price = Decimal('1')
+ >>> product.save()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+
+A warning is raised when doing a move in the future::
+
+ >>> Move = Model.get('stock.move')
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = storage_loc
+ >>> move.currency = company.currency
+ >>> move.effective_date = tomorrow
+ >>> move.quantity = 2
+ >>> move.unit_price = Decimal('1')
+ >>> move.save()
+ >>> move.click('do') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ MoveFutureWarning: ...
+
+But it can be done for today::
+
+ >>> move.effective_date = today
+ >>> move.click('do')
+ >>> move.state
+ 'done'
diff --git a/modules/stock/tests/scenario_stock_product_quantities_by_warehouse.rst b/modules/stock/tests/scenario_stock_product_quantities_by_warehouse.rst
new file mode 100644
index 0000000000..33326b9a9f
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_product_quantities_by_warehouse.rst
@@ -0,0 +1,126 @@
+=====================================
+Stock Product Quantities by Warehouse
+=====================================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard, Report
+ >>> from trytond import backend
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> today = datetime.date.today()
+ >>> yesterday = today - relativedelta(days=1)
+ >>> tomorrow = today + relativedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+
+Fill warehouse::
+
+ >>> Move = Model.get('stock.move')
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = storage_loc
+ >>> move.uom = unit
+ >>> move.quantity = 10
+ >>> move.effective_date = yesterday
+ >>> move.unit_price = Decimal('10')
+ >>> move.currency = company.currency
+ >>> move.click('do')
+
+Forecast some moves::
+
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.from_location = storage_loc
+ >>> move.to_location = customer_loc
+ >>> move.uom = unit
+ >>> move.quantity = 6
+ >>> move.planned_date = tomorrow
+ >>> move.unit_price = Decimal('20')
+ >>> move.currency = company.currency
+ >>> move.save()
+
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = storage_loc
+ >>> move.uom = unit
+ >>> move.quantity = 5
+ >>> move.planned_date = tomorrow
+ >>> move.unit_price = Decimal('10')
+ >>> move.currency = company.currency
+ >>> move.save()
+
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.from_location = storage_loc
+ >>> move.to_location = customer_loc
+ >>> move.uom = unit
+ >>> move.quantity = 3
+ >>> move.planned_date = tomorrow
+ >>> move.unit_price = Decimal('20')
+ >>> move.currency = company.currency
+ >>> move.save()
+
+
+Check Product Quantities by Warehouse::
+
+ >>> ProductQuantitiesByWarehouse = Model.get('stock.product_quantities_warehouse')
+ >>> with config.set_context(
+ ... product_template=template.id, warehouse=warehouse_loc.id):
+ ... records = ProductQuantitiesByWarehouse.find([])
+ >>> len(records)
+ 3
+ >>> [(r.date, r.quantity) for r in records] == [
+ ... (yesterday, 10), (today, 10), (tomorrow, 6)]
+ True
+
+Check Product Quantities by Warehouse Moves::
+
+ >>> ProductQuantitiesByWarehouseMove = Model.get(
+ ... 'stock.product_quantities_warehouse.move')
+ >>> with config.set_context(
+ ... product_template=template.id, warehouse=warehouse_loc.id):
+ ... records = ProductQuantitiesByWarehouseMove.find([])
+ >>> len(records)
+ 4
+ >>> [(r.date, r.cumulative_quantity_start, r.quantity, r.cumulative_quantity_end)
+ ... for r in records] == [
+ ... (yesterday, 0, 10, 10),
+ ... (tomorrow, 10, -6, 4),
+ ... (tomorrow, 4, 5, 9),
+ ... (tomorrow, 9, -3, 6)]
+ True
diff --git a/modules/stock/tests/scenario_stock_recompute_average_cost_price.rst b/modules/stock/tests/scenario_stock_recompute_average_cost_price.rst
new file mode 100644
index 0000000000..3decaf6337
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_recompute_average_cost_price.rst
@@ -0,0 +1,164 @@
+==================================
+Stock Recompute Average Cost Price
+==================================
+
+Imports::
+
+ >>> import datetime as dt
+ >>> 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 = dt.date.today()
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> 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
+ >>> product.cost_price = Decimal('80')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+
+Create some moves::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> StockMove(
+ ... product=product,
+ ... quantity=1,
+ ... from_location=supplier_loc,
+ ... to_location=storage_loc,
+ ... unit_price=Decimal('100'),
+ ... currency=company.currency,
+ ... effective_date=today - dt.timedelta(days=2)).click('do')
+ >>> StockMove(
+ ... product=product,
+ ... quantity=2,
+ ... from_location=storage_loc,
+ ... to_location=customer_loc,
+ ... unit_price=Decimal('300'),
+ ... currency=company.currency,
+ ... effective_date=today - dt.timedelta(days=1)).click('do')
+ >>> StockMove(
+ ... product=product,
+ ... quantity=2,
+ ... from_location=supplier_loc,
+ ... to_location=storage_loc,
+ ... unit_price=Decimal('120'),
+ ... currency=company.currency,
+ ... effective_date=today - dt.timedelta(days=1)).click('do')
+ >>> StockMove(
+ ... product=product,
+ ... quantity=3,
+ ... from_location=supplier_loc,
+ ... to_location=storage_loc,
+ ... unit_price=Decimal('100'),
+ ... currency=company.currency,
+ ... effective_date=today).click('do')
+
+ >>> [m.cost_price for m in StockMove.find([])]
+ [Decimal('105.0000'), Decimal('120.0000'), Decimal('100.0000'), Decimal('100.0000')]
+
+ >>> product.reload()
+ >>> product.cost_price
+ Decimal('105.0000')
+
+Recompute cost price::
+
+ >>> recompute = Wizard('product.recompute_cost_price', [product])
+ >>> recompute.execute('recompute')
+
+ >>> [m.cost_price for m in StockMove.find([])]
+ [Decimal('105.0000'), Decimal('120.0000'), Decimal('120.0000'), Decimal('100.0000')]
+
+ >>> product.reload()
+ >>> product.cost_price
+ Decimal('105.0000')
+
+Recompute cost price from a date::
+
+ >>> recompute = Wizard('product.recompute_cost_price', [product])
+ >>> recompute.form.from_ = today - dt.timedelta(days=1)
+ >>> recompute.execute('recompute')
+
+ >>> [m.cost_price for m in StockMove.find([])]
+ [Decimal('105.0000'), Decimal('120.0000'), Decimal('120.0000'), Decimal('100.0000')]
+
+ >>> product.reload()
+ >>> product.cost_price
+ Decimal('105.0000')
+
+Update unit price of a move::
+
+ >>> move, = StockMove.find([
+ ... ('from_location', '=', supplier_loc.id),
+ ... ('effective_date', '=', today - dt.timedelta(days=1)),
+ ... ])
+ >>> bool(move.unit_price_updated)
+ False
+ >>> move.unit_price = Decimal('130')
+ >>> move.save()
+ >>> bool(move.unit_price_updated)
+ True
+
+ >>> recompute = Wizard('product.recompute_cost_price', [product])
+ >>> recompute.form.from_ = move.effective_date + dt.timedelta(days=1)
+ >>> recompute.execute('recompute')
+ >>> move.reload()
+ >>> bool(move.unit_price_updated)
+ True
+
+ >>> recompute = Wizard('product.recompute_cost_price', [product])
+ >>> recompute.form.from_ == move.effective_date
+ True
+ >>> recompute.execute('recompute')
+ >>> move.reload()
+ >>> bool(move.unit_price_updated)
+ False
+ >>> [m.cost_price for m in StockMove.find([])]
+ [Decimal('107.5000'), Decimal('130.0000'), Decimal('130.0000'), Decimal('100.0000')]
+
+Launch cron task::
+
+ >>> move.unit_price = Decimal('120')
+ >>> move.save()
+
+ >>> Cron = Model.get('ir.cron')
+ >>> Company = Model.get('company.company')
+ >>> cron_recompute, = Cron.find([
+ ... ('method', '=', 'product.product|recompute_cost_price_from_moves'),
+ ... ])
+ >>> cron_recompute.companies.append(Company(company.id))
+ >>> cron_recompute.click('run_once')
+
+ >>> move.reload()
+ >>> bool(move.unit_price_updated)
+ False
+ >>> [m.cost_price for m in StockMove.find([])]
+ [Decimal('105.0000'), Decimal('120.0000'), Decimal('120.0000'), Decimal('100.0000')]
diff --git a/modules/stock/tests/scenario_stock_recompute_average_cost_price_production.rst b/modules/stock/tests/scenario_stock_recompute_average_cost_price_production.rst
new file mode 100644
index 0000000000..85465742d7
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_recompute_average_cost_price_production.rst
@@ -0,0 +1,107 @@
+=============================================
+Stock Recompute Average Cost Price Production
+=============================================
+
+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)
+
+ >>> today = dt.date.today()
+ >>> yesterday = today - dt.timedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+ >>> Location = Model.get('stock.location')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> ProductUom = Model.get('product.uom')
+ >>> StockMove = Model.get('stock.move')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('50.0000')
+ >>> template.cost_price_method = 'average'
+ >>> product, = template.products
+ >>> product.cost_price = Decimal('40.0000')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> production_loc = Location(name="Production", type='production')
+ >>> production_loc.save()
+
+Consume product for production and reverse some::
+
+ >>> StockMove(
+ ... product=product,
+ ... quantity=10,
+ ... from_location=storage_loc,
+ ... to_location=production_loc,
+ ... effective_date=today).click('do')
+ >>> StockMove(
+ ... product=product,
+ ... quantity=2,
+ ... from_location=production_loc,
+ ... to_location=storage_loc,
+ ... unit_price=Decimal('40.0000'),
+ ... currency=company.currency,
+ ... effective_date=today).click('do')
+
+ >>> [m.cost_price for m in StockMove.find([])]
+ [Decimal('40.0000'), Decimal('40.0000')]
+
+Recompute cost price::
+
+ >>> recompute = Wizard('product.recompute_cost_price', [product])
+ >>> recompute.execute('recompute')
+
+ >>> [m.cost_price for m in StockMove.find([])]
+ [Decimal('0.0000'), Decimal('0.0000')]
+
+ >>> product.reload()
+ >>> product.cost_price
+ Decimal('0.0000')
+
+Receive product yesterday at new cost::
+
+ >>> StockMove(
+ ... product=product,
+ ... quantity=16,
+ ... from_location=supplier_loc,
+ ... to_location=storage_loc,
+ ... unit_price=Decimal('20.0000'),
+ ... currency=company.currency,
+ ... effective_date=yesterday).click('do')
+
+Recompute cost price::
+
+ >>> recompute = Wizard('product.recompute_cost_price', [product])
+ >>> recompute.execute('recompute')
+
+ >>> [m.cost_price for m in StockMove.find([])]
+ [Decimal('20.0000'), Decimal('20.0000'), Decimal('20.0000')]
+
+ >>> product.reload()
+ >>> product.cost_price
+ Decimal('20.0000')
diff --git a/modules/stock/tests/scenario_stock_reporting.rst b/modules/stock/tests/scenario_stock_reporting.rst
new file mode 100644
index 0000000000..e0470cd5cb
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_reporting.rst
@@ -0,0 +1,167 @@
+=================================
+Stock Shipment Reporting Scenario
+=================================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import Model, Wizard, Report
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> today = datetime.date.today()
+ >>> yesterday = today - relativedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer & supplier::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+ >>> supplier = Party(name='Supplier')
+ >>> supplier.save()
+
+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('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> input_loc, = Location.find([('code', '=', 'IN')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> lost_loc, = Location.find([('type', '=', 'lost_found')])
+
+Create Shipment In::
+
+ >>> ShipmentIn = Model.get('stock.shipment.in')
+ >>> shipment_in = ShipmentIn()
+ >>> shipment_in.planned_date = today
+ >>> shipment_in.supplier = supplier
+ >>> shipment_in.warehouse = warehouse_loc
+ >>> shipment_in.company = company
+
+Receive a bunch of products::
+
+ >>> move = shipment_in.incoming_moves.new()
+ >>> move.product = product
+ >>> move.uom = unit
+ >>> move.quantity = 100
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = input_loc
+ >>> move.company = company
+ >>> move.unit_price = Decimal('1')
+ >>> move.currency = company.currency
+ >>> shipment_in.save()
+ >>> shipment_in.click('receive')
+ >>> shipment_in.click('done')
+
+Testing the report::
+
+ >>> supplier_restocking_list = Report('stock.shipment.in.restocking_list')
+ >>> ext, _, _, name = supplier_restocking_list.execute([shipment_in], {})
+ >>> ext
+ 'odt'
+ >>> name
+ 'Restocking List-1'
+
+Create Shipment Out::
+
+ >>> ShipmentOut = Model.get('stock.shipment.out')
+ >>> shipment_out = ShipmentOut()
+ >>> shipment_out.planned_date = today
+ >>> shipment_out.customer = customer
+ >>> shipment_out.warehouse = warehouse_loc
+ >>> shipment_out.company = company
+
+Add two shipment lines of same product and go through the workflow::
+
+ >>> move = shipment_out.outgoing_moves.new()
+ >>> move.product = product
+ >>> move.uom = unit
+ >>> move.quantity = 1
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> move.company = company
+ >>> move.unit_price = Decimal('1')
+ >>> move.currency = company.currency
+ >>> shipment_out.save()
+ >>> shipment_out.click('wait')
+ >>> shipment_out.click('assign_try')
+ True
+ >>> shipment_out.click('pick')
+ >>> shipment_out.click('pack')
+ >>> shipment_out.click('done')
+
+Testing the reports::
+
+ >>> delivery_note = Report('stock.shipment.out.delivery_note')
+ >>> ext, _, _, name = delivery_note.execute([shipment_out], {})
+ >>> ext
+ 'odt'
+ >>> name
+ 'Delivery Note-1'
+
+ >>> picking_list = Report('stock.shipment.out.picking_list')
+ >>> ext, _, _, name = picking_list.execute([shipment_out], {})
+ >>> ext
+ 'odt'
+ >>> name
+ 'Picking List-1'
+
+Create an internal shipment::
+
+ >>> ShipmentInternal = Model.get('stock.shipment.internal')
+ >>> shipment_internal = ShipmentInternal()
+ >>> shipment_internal.planned_date = today
+ >>> shipment_internal.company = company
+ >>> shipment_internal.from_location = storage_loc
+ >>> shipment_internal.to_location = lost_loc
+ >>> move = shipment_internal.moves.new()
+ >>> move.product = product
+ >>> move.uom = unit
+ >>> move.quantity = 1
+ >>> move.from_location = storage_loc
+ >>> move.to_location = lost_loc
+ >>> move.company = company
+ >>> move.unit_price = Decimal('1')
+ >>> move.currency = company.currency
+ >>> shipment_internal.save()
+ >>> shipment_internal.click('wait')
+ >>> shipment_internal.click('assign_try')
+ True
+ >>> shipment_internal.click('done')
+
+Testing the report::
+
+ >>> internal_report = Report('stock.shipment.internal.report')
+ >>> ext, _, _, name = internal_report.execute([shipment_internal], {})
+ >>> ext
+ 'odt'
+ >>> name
+ 'Internal Shipment-1'
+
diff --git a/modules/stock/tests/scenario_stock_reporting_margin.rst b/modules/stock/tests/scenario_stock_reporting_margin.rst
new file mode 100644
index 0000000000..41ccfa47a2
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_reporting_margin.rst
@@ -0,0 +1,220 @@
+===============================
+Stock Reporting Margin Scenario
+===============================
+
+Imports::
+
+ >>> import datetime as dt
+ >>> from decimal import Decimal
+ >>> from proteus import Model
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import (
+ ... create_company, get_company)
+ >>> today = dt.date.today()
+ >>> yesterday = today - dt.timedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('40')
+ >>> template.save()
+ >>> product, = template.products
+ >>> product.cost_price = Decimal('20')
+ >>> product.save()
+ >>> template2, = template.duplicate()
+ >>> product2, = template2.products
+
+ >>> Category = Model.get('product.category')
+ >>> category_root = Category(name="Root")
+ >>> category_root.save()
+ >>> category1 = Category(name="Child1", parent=category_root)
+ >>> category1.save()
+ >>> category2 = Category(name="Child2", parent=category_root)
+ >>> category2.save()
+
+ >>> template.categories.append(Category(category1.id))
+ >>> template.save()
+ >>> template2.categories.append(Category(category2.id))
+ >>> template2.save()
+
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> lost_loc, = Location.find([('type', '=', 'lost_found')])
+
+Create some moves::
+
+ >>> Move = Model.get('stock.move')
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = storage_loc
+ >>> move.quantity = 8
+ >>> move.unit_price = Decimal('20')
+ >>> move.currency = company.currency
+ >>> move.effective_date = yesterday
+ >>> move.click('do')
+
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.from_location = storage_loc
+ >>> move.to_location = customer_loc
+ >>> move.quantity = 2
+ >>> move.unit_price = Decimal('40')
+ >>> move.currency = company.currency
+ >>> move.effective_date = yesterday
+ >>> move.click('do')
+
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.from_location = storage_loc
+ >>> move.to_location = customer_loc
+ >>> move.quantity = 4
+ >>> move.unit_price = Decimal('30')
+ >>> move.currency = company.currency
+ >>> move.effective_date = today
+ >>> move.click('do')
+
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.from_location = customer_loc
+ >>> move.to_location = storage_loc
+ >>> move.quantity = 1
+ >>> move.unit_price = Decimal('30')
+ >>> move.currency = company.currency
+ >>> move.effective_date = today
+ >>> move.click('do')
+
+ >>> move = Move()
+ >>> move.product = product2
+ >>> move.from_location = storage_loc
+ >>> move.to_location = customer_loc
+ >>> move.quantity = 2
+ >>> move.unit_price = Decimal('50')
+ >>> move.currency = company.currency
+ >>> move.effective_date = today
+ >>> move.click('do')
+
+ >>> move = Move()
+ >>> move.product = product
+ >>> move.from_location = storage_loc
+ >>> move.to_location = lost_loc
+ >>> move.quantity = 1
+ >>> move.effective_date = today
+ >>> move.click('do')
+
+Check reporting margin per product::
+
+ >>> MarginProduct = Model.get('stock.reporting.margin.product')
+ >>> MarginProductTimeseries = Model.get(
+ ... 'stock.reporting.margin.product.time_series')
+ >>> context = {
+ ... 'from_date': yesterday,
+ ... 'to_date': today,
+ ... 'period': 'day',
+ ... }
+ >>> with config.set_context(context=context):
+ ... reports = MarginProduct.find([])
+ ... time_series = MarginProductTimeseries.find([])
+ >>> len(reports)
+ 2
+ >>> report, = [r for r in reports if r.product == product]
+ >>> (report.quantity, report.cost, report.revenue,
+ ... report.profit, report.margin) == (
+ ... 5, Decimal('100.00'), Decimal('170.00'),
+ ... Decimal('70.00'), Decimal('0.4118'))
+ True
+ >>> len(time_series)
+ 3
+ >>> with config.set_context(context=context):
+ ... sorted((
+ ... r.product.id, str(r.date), r.quantity, r.cost, r.revenue,
+ ... r.profit, r.margin)
+ ... for r in time_series) == sorted([
+ ... (product.id, str(yesterday), 2, Decimal('40.00'), Decimal('80.00'),
+ ... Decimal('40.00'), Decimal('0.5000')),
+ ... (product.id, str(today), 3, Decimal('60.00'), Decimal('90.00'),
+ ... Decimal('30.00'), Decimal('0.3333')),
+ ... (product2.id, str(today), 2, Decimal('40.00'), Decimal('100.00'),
+ ... Decimal('60.00'), Decimal('0.6000'))])
+ True
+
+Check reporting margin per categories::
+
+ >>> MarginCategory = Model.get('stock.reporting.margin.category')
+ >>> MarginCategoryTimeseries = Model.get(
+ ... 'stock.reporting.margin.category.time_series')
+ >>> MarginCategoryTree = Model.get(
+ ... 'stock.reporting.margin.category.tree')
+ >>> with config.set_context(context=context):
+ ... reports = MarginCategory.find([])
+ ... time_series = MarginCategoryTimeseries.find([])
+ ... tree = MarginCategoryTree.find([])
+ >>> len(reports)
+ 2
+ >>> with config.set_context(context=context):
+ ... sorted((r.category.id, r.cost, r.revenue, r.profit, r.margin)
+ ... for r in reports) == sorted([
+ ... (category1.id, Decimal('100.00'), Decimal('170.00'),
+ ... Decimal('70.00'), Decimal('0.4118')),
+ ... (category2.id, Decimal('40.00'), Decimal('100.00'),
+ ... Decimal('60.00'), Decimal('0.6000'))])
+ True
+ >>> len(time_series)
+ 3
+ >>> with config.set_context(context=context):
+ ... sorted((r.category.id, str(r.date), r.cost, r.revenue, r.profit, r.margin)
+ ... for r in time_series) == sorted([
+ ... (category1.id, str(yesterday), Decimal('40.00'), Decimal('80.00'),
+ ... Decimal('40.00'), Decimal('0.5000')),
+ ... (category1.id, str(today), Decimal('60.00'), Decimal('90.00'),
+ ... Decimal('30.00'), Decimal('0.3333')),
+ ... (category2.id, str(today), Decimal('40.00'), Decimal('100.00'),
+ ... Decimal('60.00'), Decimal('0.6000'))])
+ True
+ >>> len(tree)
+ 3
+ >>> with config.set_context(context=context):
+ ... sorted((r.name, r.cost, r.revenue, r.profit, r.margin)
+ ... for r in tree) == sorted([
+ ... ("Root", Decimal('140.00'), Decimal('270.00'),
+ ... Decimal('130.00'), Decimal('0.4815')),
+ ... ("Child1", Decimal('100.00'), Decimal('170.00'),
+ ... Decimal('70.00'), Decimal('0.4118')),
+ ... ('Child2', Decimal('40.00'), Decimal('100.00'),
+ ... Decimal('60.00'), Decimal('0.6000'))])
+ True
+
+Check reporting margin including lost::
+
+ >>> context['include_lost'] = True
+
+ >>> with config.set_context(context=context):
+ ... reports = MarginProduct.find([])
+ >>> len(reports)
+ 2
+ >>> report, = [r for r in reports if r.product == product]
+ >>> (report.quantity, report.cost, report.revenue,
+ ... report.profit, report.margin) == (
+ ... 6, Decimal('120.00'), Decimal('170.00'),
+ ... Decimal('50.00'), Decimal('0.2941'))
+ True
diff --git a/modules/stock/tests/scenario_stock_shipment_in_return.rst b/modules/stock/tests/scenario_stock_shipment_in_return.rst
new file mode 100644
index 0000000000..46a078544c
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_shipment_in_return.rst
@@ -0,0 +1,81 @@
+=================================
+Stock Shipment In Return Scenario
+=================================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import Model
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> today = datetime.date.today()
+ >>> yesterday = today - relativedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create supplier::
+
+ >>> Party = Model.get('party.party')
+ >>> supplier = Party(name='Supplier')
+ >>> supplier.save()
+
+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('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+
+Create Shipment In::
+
+ >>> ShipmentInReturn = Model.get('stock.shipment.in.return')
+ >>> shipment_return = ShipmentInReturn()
+ >>> shipment_return.planned_date = yesterday
+ >>> shipment_return.supplier = supplier
+ >>> shipment_return.from_location = storage_loc
+ >>> move = shipment_return.moves.new()
+ >>> move.product = product
+ >>> move.uom =unit
+ >>> move.quantity = 1
+ >>> move.from_location = storage_loc
+ >>> move.to_location = supplier_loc
+ >>> move.company = company
+ >>> move.unit_price = Decimal('1')
+ >>> move.currency = company.currency
+ >>> shipment_return.click('wait')
+ >>> shipment_return.state
+ 'waiting'
+
+Reschedule shipment::
+
+ >>> Cron = Model.get('ir.cron')
+ >>> cron = Cron(method='stock.shipment.in.return|reschedule')
+ >>> cron.interval_number = 1
+ >>> cron.interval_type = 'months'
+ >>> cron.click('run_once')
+ >>> shipment_return.reload()
+ >>> shipment_return.planned_date == today
+ True
diff --git a/modules/stock/tests/scenario_stock_shipment_in_same_storage_input.rst b/modules/stock/tests/scenario_stock_shipment_in_same_storage_input.rst
new file mode 100644
index 0000000000..8beb503b86
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_shipment_in_same_storage_input.rst
@@ -0,0 +1,86 @@
+=================================================
+Stock Shipment In Same Storage and Input Scenario
+=================================================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create supplier::
+
+ >>> Party = Model.get('party.party')
+ >>> supplier = Party(name='Supplier')
+ >>> supplier.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> storage1 = Location(name="Storage 1", parent=storage_loc)
+ >>> storage1.save()
+
+Use storage location as input location::
+
+ >>> warehouse_loc.input_location = storage_loc
+ >>> warehouse_loc.save()
+
+Create Shipment In::
+
+ >>> ShipmentIn = Model.get('stock.shipment.in')
+ >>> shipment_in = ShipmentIn()
+ >>> shipment_in.supplier = supplier
+ >>> shipment_in.warehouse = warehouse_loc
+ >>> shipment_in.company = company
+ >>> move = shipment_in.incoming_moves.new()
+ >>> move.product = product
+ >>> move.uom = unit
+ >>> move.quantity = 1
+ >>> move.unit_price = Decimal('5')
+ >>> move.currency = company.currency
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = storage1
+ >>> shipment_in.save()
+
+ >>> len(shipment_in.incoming_moves)
+ 1
+ >>> len(shipment_in.inventory_moves)
+ 0
+
+Incoming moves are done when receiving the shipment::
+
+ >>> shipment_in.click('receive')
+ >>> shipment_in.state
+ 'done'
+ >>> move, = shipment_in.incoming_moves
+ >>> move.state
+ 'done'
+ >>> len(shipment_in.inventory_moves)
+ 0
diff --git a/modules/stock/tests/scenario_stock_shipment_internal.rst b/modules/stock/tests/scenario_stock_shipment_internal.rst
new file mode 100644
index 0000000000..fe8e262924
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_shipment_internal.rst
@@ -0,0 +1,152 @@
+================================
+Stock Shipment Internal 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
+ >>> today = datetime.date.today()
+ >>> yesterday = today - relativedelta(days=1)
+ >>> tomorrow = today + relativedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+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('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> lost_found_loc, = Location.find([('type', '=', 'lost_found')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> internal_loc = Location(
+ ... name="Internal", type='storage', parent=storage_loc.parent)
+ >>> internal_loc.save()
+
+Create stock user::
+
+ >>> User = Model.get('res.user')
+ >>> Group = Model.get('res.group')
+ >>> Party = Model.get('party.party')
+ >>> Employee = Model.get('company.employee')
+ >>> stock_user = User()
+ >>> stock_user.name = 'Stock'
+ >>> stock_user.login = 'stock'
+ >>> stock_group, = Group.find([('name', '=', 'Stock')])
+ >>> stock_user.groups.append(stock_group)
+ >>> employee_party = Party(name="Employee")
+ >>> employee_party.save()
+ >>> employee = Employee(party=employee_party)
+ >>> employee.save()
+ >>> stock_user.employees.append(employee)
+ >>> stock_user.employee = employee
+ >>> stock_user.save()
+
+Create Internal Shipment::
+
+ >>> set_user(stock_user)
+ >>> Shipment = Model.get('stock.shipment.internal')
+ >>> StockMove = Model.get('stock.move')
+ >>> shipment = Shipment()
+ >>> shipment.planned_date = today
+ >>> shipment.from_location = internal_loc
+ >>> shipment.to_location = storage_loc
+ >>> move = shipment.moves.new()
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.from_location = internal_loc
+ >>> move.to_location = storage_loc
+ >>> move.currency = company.currency
+ >>> shipment.save()
+ >>> shipment.assigned_by
+ >>> shipment.done_by
+
+ >>> shipment.click('wait')
+ >>> shipment.state
+ 'waiting'
+ >>> shipment.click('assign_try')
+ False
+ >>> shipment.assigned_by
+ >>> shipment.done_by
+
+Create Internal Shipment from lost_found location::
+
+ >>> lost_found_shipment = Shipment()
+ >>> lost_found_shipment.planned_date = today
+ >>> lost_found_shipment.company = company
+ >>> lost_found_shipment.from_location = lost_found_loc
+ >>> lost_found_shipment.to_location = internal_loc
+ >>> move = StockMove()
+ >>> move = lost_found_shipment.moves.new()
+ >>> move.product = product
+ >>> move.uom = unit
+ >>> move.quantity = 2
+ >>> move.from_location = lost_found_loc
+ >>> move.to_location = internal_loc
+ >>> move.currency = company.currency
+ >>> lost_found_shipment.click('wait')
+ >>> lost_found_shipment.click('assign_try')
+ True
+ >>> lost_found_shipment.state
+ 'assigned'
+ >>> lost_found_shipment.click('done')
+ >>> lost_found_shipment.state
+ 'done'
+
+Check that now we can finish the older shipment::
+
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.assigned_by == employee
+ True
+ >>> shipment.done_by
+
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+ >>> shipment.done_by == employee
+ True
+
+Duplicate Internal Shipment::
+
+ >>> shipment_copy, = shipment.duplicate()
+ >>> len(shipment_copy.moves)
+ 1
+
+Reschedule shipment::
+
+ >>> shipment_copy.planned_date = yesterday
+ >>> shipment_copy.click('wait')
+ >>> set_user(1)
+ >>> Cron = Model.get('ir.cron')
+ >>> cron = Cron(method='stock.shipment.internal|reschedule')
+ >>> cron.interval_number = 1
+ >>> cron.interval_type = 'months'
+ >>> cron.click('run_once')
+ >>> shipment_copy.reload()
+ >>> shipment_copy.planned_date == today
+ True
diff --git a/modules/stock/tests/scenario_stock_shipment_internal_transit.rst b/modules/stock/tests/scenario_stock_shipment_internal_transit.rst
new file mode 100644
index 0000000000..37cd08118f
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_shipment_internal_transit.rst
@@ -0,0 +1,112 @@
+=============================================
+Stock Shipment Internal with Transit 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)
+
+ >>> today = dt.date.today()
+ >>> yesterday = today - dt.timedelta(days=1)
+ >>> tomorrow = today + dt.timedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+ >>> ProductTemplate = Model.get('product.template')
+ >>> ProductUom = Model.get('product.uom')
+ >>> Shipment = Model.get('stock.shipment.internal')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> template = ProductTemplate()
+ >>> template.name = "Product"
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse1, = Location.find([('type', '=', 'warehouse')])
+ >>> warehouse2, = warehouse1.duplicate()
+
+Add lead time between warehouses::
+
+ >>> LeadTime = Model.get('stock.location.lead_time')
+ >>> lead_time = LeadTime()
+ >>> lead_time.warehouse_from = warehouse1
+ >>> lead_time.warehouse_to = warehouse2
+ >>> lead_time.lead_time = dt.timedelta(1)
+ >>> lead_time.save()
+
+Create Internal Shipment with lead time::
+
+ >>> shipment = Shipment()
+ >>> shipment.planned_date = tomorrow
+ >>> shipment.from_location = warehouse1.storage_location
+ >>> shipment.to_location = warehouse2.storage_location
+ >>> bool(shipment.transit_location)
+ True
+ >>> shipment.planned_start_date == today
+ True
+ >>> move = shipment.moves.new()
+ >>> move.product = product
+ >>> move.quantity = 2
+ >>> move.from_location = shipment.from_location
+ >>> move.to_location = shipment.to_location
+ >>> shipment.click('wait')
+ >>> len(shipment.moves)
+ 2
+ >>> outgoing_move, = shipment.outgoing_moves
+ >>> outgoing_move.quantity
+ 2.0
+ >>> outgoing_move.from_location == shipment.from_location
+ True
+ >>> outgoing_move.to_location == shipment.transit_location
+ True
+ >>> outgoing_move.planned_date == today
+ True
+ >>> incoming_move, = shipment.incoming_moves
+ >>> incoming_move.quantity
+ 2.0
+ >>> incoming_move.from_location == shipment.transit_location
+ True
+ >>> incoming_move.to_location == shipment.to_location
+ True
+ >>> incoming_move.planned_date == tomorrow
+ True
+
+ >>> outgoing_move.quantity = 1
+ >>> outgoing_move.save()
+
+ >>> shipment.click('assign_force')
+ >>> shipment.effective_start_date = yesterday
+ >>> shipment.click('ship')
+ >>> incoming_move, = shipment.incoming_moves
+ >>> incoming_move.quantity
+ 1.0
+ >>> shipment.outgoing_moves[0].state
+ 'done'
+ >>> shipment.outgoing_moves[0].effective_date == yesterday
+ True
+ >>> shipment.click('done')
+ >>> shipment.incoming_moves[0].state
+ 'done'
+ >>> shipment.incoming_moves[0].effective_date == today
+ True
diff --git a/modules/stock/tests/scenario_stock_shipment_out.rst b/modules/stock/tests/scenario_stock_shipment_out.rst
new file mode 100644
index 0000000000..b5d8e8eaff
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_shipment_out.rst
@@ -0,0 +1,277 @@
+===========================
+Stock Shipment Out 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
+ >>> today = datetime.date.today()
+ >>> yesterday = today - relativedelta(days=1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+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('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Create stock user::
+
+ >>> User = Model.get('res.user')
+ >>> Group = Model.get('res.group')
+ >>> Employee = Model.get('company.employee')
+ >>> stock_user = User()
+ >>> stock_user.name = "Stock"
+ >>> stock_user.login = 'stock'
+ >>> stock_user.groups.extend(Group.find([
+ ... ('name', '=', 'Stock'),
+ ... ]))
+ >>> employee_party = Party(name="Employee")
+ >>> employee_party.save()
+ >>> employee = Employee(party=employee_party)
+ >>> employee.save()
+ >>> stock_user.employees.append(employee)
+ >>> stock_user.employee = employee
+ >>> stock_user.save()
+
+ >>> set_user(stock_user)
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+
+Create Shipment Out::
+
+ >>> ShipmentOut = Model.get('stock.shipment.out')
+ >>> shipment_out = ShipmentOut()
+ >>> shipment_out.planned_date = today
+ >>> shipment_out.customer = customer
+ >>> shipment_out.warehouse = warehouse_loc
+ >>> shipment_out.company = company
+
+Add two shipment lines of same product::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> shipment_out.outgoing_moves.extend([StockMove(), StockMove()])
+ >>> for move in shipment_out.outgoing_moves:
+ ... move.product = product
+ ... move.uom =unit
+ ... move.quantity = 1
+ ... move.from_location = output_loc
+ ... move.to_location = customer_loc
+ ... move.company = company
+ ... move.unit_price = Decimal('1')
+ ... move.currency = company.currency
+ >>> shipment_out.save()
+ >>> shipment_out.picked_by
+ >>> shipment_out.packed_by
+ >>> shipment_out.done_by
+
+Set the shipment state to waiting::
+
+ >>> shipment_out.click('wait')
+ >>> len(shipment_out.outgoing_moves)
+ 2
+ >>> len(shipment_out.inventory_moves)
+ 2
+ >>> sorted(
+ ... [m.origin for m in shipment_out.inventory_moves],
+ ... key=lambda m: m.id) == \
+ ... sorted(
+ ... [m for m in shipment_out.outgoing_moves], key=lambda m: m.id)
+ True
+
+Make 1 unit of the product available::
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = today
+ >>> incoming_move.effective_date = today
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('1')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.click('do')
+
+Assign the shipment now::
+
+ >>> shipment_assign = Wizard('stock.shipment.assign', [shipment_out])
+ >>> len(shipment_assign.form.moves)
+ 1
+ >>> shipment_assign.execute('end')
+ >>> shipment_out.reload()
+ >>> len(shipment_out.outgoing_moves)
+ 2
+ >>> len(shipment_out.inventory_moves)
+ 2
+ >>> states = [m.state for m in shipment_out.inventory_moves]
+ >>> states.sort()
+ >>> states
+ ['assigned', 'draft']
+ >>> effective_dates = [m.effective_date for m in
+ ... shipment_out.inventory_moves]
+ >>> len(set(effective_dates))
+ 1
+ >>> planned_dates = [m.planned_date for m in
+ ... shipment_out.outgoing_moves]
+ >>> len(set(planned_dates))
+ 1
+
+Ignore non assigned moves and pack shipment::
+
+ >>> shipment_assign = Wizard('stock.shipment.assign', [shipment_out])
+ >>> shipment_assign.execute('ignore')
+ >>> sorted([m.quantity for m in shipment_out.inventory_moves])
+ [0.0, 1.0]
+ >>> shipment_out.picked_by
+ >>> shipment_out.packed_by
+ >>> shipment_out.done_by
+
+ >>> shipment_out.click('pick')
+ >>> shipment_out.picked_by == employee
+ True
+ >>> shipment_out.packed_by
+ >>> shipment_out.done_by
+
+ >>> shipment_out.click('pack')
+ >>> shipment_out.packed_by == employee
+ True
+ >>> shipment_out.done_by
+ >>> all(m.state == 'assigned' for m in shipment_out.outgoing_moves)
+ True
+ >>> len(shipment_out.outgoing_moves)
+ 1
+ >>> len(shipment_out.inventory_moves)
+ 2
+ >>> shipment_out.inventory_moves[0].state
+ 'done'
+ >>> sum([m.quantity for m in shipment_out.inventory_moves]) == \
+ ... sum([m.quantity for m in shipment_out.outgoing_moves])
+ True
+
+Set the state as Done::
+
+ >>> shipment_out.click('done')
+ >>> shipment_out.done_by == employee
+ True
+ >>> all(m.state == 'done' for m in shipment_out.outgoing_moves)
+ True
+ >>> planned_dates = [m.planned_date for m in
+ ... shipment_out.outgoing_moves]
+ >>> planned_dates == [today]
+ True
+ >>> effective_dates = [m.effective_date for m in
+ ... shipment_out.outgoing_moves]
+ >>> len(set(effective_dates))
+ 1
+ >>> len(shipment_out.outgoing_moves)
+ 1
+ >>> len(shipment_out.inventory_moves)
+ 2
+ >>> shipment_out.inventory_moves[0].state
+ 'done'
+ >>> sum([m.quantity for m in shipment_out.inventory_moves]) == \
+ ... sum([m.quantity for m in shipment_out.outgoing_moves])
+ True
+
+Create Shipment Out with effective date::
+
+ >>> ShipmentOut = Model.get('stock.shipment.out')
+ >>> shipment_out = ShipmentOut()
+ >>> shipment_out.planned_date = yesterday
+ >>> shipment_out.effective_date = yesterday
+ >>> shipment_out.customer = customer
+ >>> shipment_out.warehouse = warehouse_loc
+ >>> shipment_out.company = company
+ >>> move = shipment_out.outgoing_moves.new()
+ >>> move.product = product
+ >>> move.uom =unit
+ >>> move.quantity = 1
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> move.company = company
+ >>> move.unit_price = Decimal('1')
+ >>> move.currency = company.currency
+ >>> shipment_out.click('wait')
+
+Make 1 unit of the product available::
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product
+ >>> incoming_move.uom = unit
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage_loc
+ >>> incoming_move.planned_date = yesterday
+ >>> incoming_move.effective_date = yesterday
+ >>> incoming_move.company = company
+ >>> incoming_move.unit_price = Decimal('1')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.click('do')
+
+Finish the shipment::
+
+ >>> shipment_out.click('assign_try')
+ True
+ >>> shipment_out.click('pick')
+ >>> shipment_out.click('pack')
+ >>> shipment_out.click('done')
+ >>> shipment_out.state
+ 'done'
+ >>> outgoing_move, = shipment_out.outgoing_moves
+ >>> outgoing_move.effective_date == yesterday
+ True
+ >>> inventory_move, = shipment_out.inventory_moves
+ >>> inventory_move.effective_date == yesterday
+ True
+
+Reschedule shipment::
+
+ >>> shipment_copy, = shipment_out.duplicate()
+ >>> shipment_copy.planned_date = yesterday
+ >>> shipment_copy.click('wait')
+ >>> set_user(1)
+ >>> Cron = Model.get('ir.cron')
+ >>> cron = Cron(method='stock.shipment.out|reschedule')
+ >>> cron.interval_number = 1
+ >>> cron.interval_type = 'months'
+ >>> cron.click('run_once')
+ >>> shipment_copy.reload()
+ >>> shipment_copy.planned_date == today
+ True
diff --git a/modules/stock/tests/scenario_stock_shipment_out_return_same_storage_input.rst b/modules/stock/tests/scenario_stock_shipment_out_return_same_storage_input.rst
new file mode 100644
index 0000000000..a06869a651
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_shipment_out_return_same_storage_input.rst
@@ -0,0 +1,87 @@
+=========================================================
+Stock Shipment Out Return Same Storage and Input Scenario
+=========================================================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+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('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> storage1 = Location(name="Storage 1", parent=storage_loc)
+ >>> storage1.save()
+
+Use storage location as input location::
+
+ >>> warehouse_loc.input_location = storage_loc
+ >>> warehouse_loc.save()
+
+Create Shipment Out Return::
+
+ >>> ShipmentOutReturn = Model.get('stock.shipment.out.return')
+ >>> shipment = ShipmentOutReturn()
+ >>> shipment.customer = customer
+ >>> shipment.warehouse = warehouse_loc
+ >>> shipment.company = company
+ >>> move = shipment.incoming_moves.new()
+ >>> move.product = product
+ >>> move.uom = unit
+ >>> move.quantity = 1
+ >>> move.from_location = customer_loc
+ >>> move.to_location = storage1
+ >>> move.unit_price = Decimal('20')
+ >>> move.currency = company.currency
+ >>> shipment.save()
+
+ >>> len(shipment.incoming_moves)
+ 1
+ >>> len(shipment.inventory_moves)
+ 0
+
+Shipment is done when receiving::
+
+ >>> shipment.click('receive')
+ >>> shipment.state
+ 'done'
+ >>> move, = shipment.incoming_moves
+ >>> move.state
+ 'done'
+ >>> len(shipment.inventory_moves)
+ 0
diff --git a/modules/stock/tests/scenario_stock_shipment_out_same_storage_output.rst b/modules/stock/tests/scenario_stock_shipment_out_same_storage_output.rst
new file mode 100644
index 0000000000..7a9254d75b
--- /dev/null
+++ b/modules/stock/tests/scenario_stock_shipment_out_same_storage_output.rst
@@ -0,0 +1,91 @@
+===================================================
+Stock Shipment Out Same Storage and Output Scenario
+===================================================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+
+Activate modules::
+
+ >>> config = activate_modules('stock')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+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('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> warehouse_loc.output_location = storage_loc
+ >>> warehouse_loc.save()
+
+Create Shipment Out::
+
+ >>> ShipmentOut = Model.get('stock.shipment.out')
+ >>> shipment_out = ShipmentOut()
+ >>> shipment_out.customer = customer
+ >>> shipment_out.warehouse = warehouse_loc
+ >>> shipment_out.company = company
+ >>> move = shipment_out.outgoing_moves.new()
+ >>> move.product = product
+ >>> move.uom = unit
+ >>> move.quantity = 1
+ >>> move.unit_price = Decimal('5')
+ >>> move.currency = company.currency
+ >>> move.from_location = storage_loc
+ >>> move.to_location = customer_loc
+ >>> shipment_out.save()
+
+ >>> len(shipment_out.outgoing_moves)
+ 1
+ >>> len(shipment_out.inventory_moves)
+ 0
+
+Set the shipment state to waiting::
+
+ >>> shipment_out.click('wait')
+ >>> shipment_out.state
+ 'waiting'
+ >>> len(shipment_out.outgoing_moves)
+ 1
+ >>> len(shipment_out.inventory_moves)
+ 0
+
+Pack the shipment::
+
+ >>> shipment_out.click('pack')
+ >>> shipment_out.state
+ 'packed'
+ >>> len(shipment_out.outgoing_moves)
+ 1
+ >>> len(shipment_out.inventory_moves)
+ 0
diff --git a/modules/stock/tests/test_module.py b/modules/stock/tests/test_module.py
new file mode 100644
index 0000000000..ec8d9095f4
--- /dev/null
+++ b/modules/stock/tests/test_module.py
@@ -0,0 +1,1703 @@
+# 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 defaultdict
+from decimal import Decimal
+from functools import partial
+
+from dateutil.relativedelta import relativedelta
+
+from trytond.exceptions import UserError, UserWarning
+from trytond.modules.company.tests import (
+ CompanyTestMixin, PartyCompanyCheckEraseMixin, create_company, set_company)
+from trytond.pool import Pool
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.transaction import Transaction
+
+
+class StockTestCase(
+ PartyCompanyCheckEraseMixin, CompanyTestMixin, ModuleTestCase):
+ 'Test Stock module'
+ module = 'stock'
+ longMessage = True
+
+ @with_transaction()
+ def test_move_internal_quantity(self):
+ 'Test Move.internal_quantity'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+
+ kg, = Uom.search([('name', '=', 'Kilogram')])
+ g, = Uom.search([('name', '=', 'Gram')])
+ template, = Template.create([{
+ 'name': 'Test Move.internal_quantity',
+ 'type': 'goods',
+ 'default_uom': kg.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'STO')])
+ company = create_company()
+ currency = company.currency
+ with set_company(company):
+ tests = [
+ (kg, 10, 10, 0),
+ (g, 100, 0.1, 1),
+ (g, 1, 0, 0), # rounded
+ (kg, 35.23, 35.23, 2), # check infinite loop
+ ]
+ for uom, quantity, internal_quantity, ndigits in tests:
+ move, = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': quantity,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }])
+ self.assertEqual(round(move.internal_quantity, ndigits),
+ internal_quantity)
+
+ for uom, quantity, internal_quantity, ndigits in tests:
+ Move.write([move], {
+ 'uom': uom.id,
+ 'quantity': quantity,
+ })
+ self.assertEqual(round(move.internal_quantity, ndigits),
+ internal_quantity)
+
+ @with_transaction()
+ def test_products_by_location(self):
+ 'Test products_by_location'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Period = pool.get('stock.period')
+ transaction = Transaction()
+
+ kg, = Uom.search([('name', '=', 'Kilogram')])
+ g, = Uom.search([('name', '=', 'Gram')])
+ template, = Template.create([{
+ 'name': 'Test products_by_location',
+ 'type': 'goods',
+ 'default_uom': kg.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ supplier, = Location.search([('code', '=', 'SUP')])
+ customer, = Location.search([('code', '=', 'CUS')])
+ storage, = Location.search([('code', '=', 'STO')])
+ storage_empty, = Location.copy([storage])
+ company = create_company()
+ currency = company.currency
+ with set_company(company):
+ today = datetime.date.today()
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': kg.id,
+ 'quantity': 5,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today + relativedelta(days=-5),
+ 'effective_date': today + relativedelta(days=-5),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'uom': kg.id,
+ 'quantity': 1,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today + relativedelta(days=-4),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'uom': kg.id,
+ 'quantity': 1,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'planned_date': today,
+ 'effective_date': today,
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'uom': kg.id,
+ 'quantity': 1,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'planned_date': today,
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'uom': kg.id,
+ 'quantity': 2,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'planned_date': today + relativedelta(days=5),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'uom': kg.id,
+ 'quantity': 5,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today + relativedelta(days=7),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }])
+ Move.do([moves[0], moves[2]])
+
+ products_by_location = partial(Product.products_by_location,
+ [storage.id], grouping_filter=([product.id],))
+
+ tests = [
+ ({'stock_date_end': today + relativedelta(days=-6),
+ }, 0),
+ ({'stock_date_end': today + relativedelta(days=-5),
+ }, 5),
+ ({'stock_date_end': today + relativedelta(days=-4),
+ }, 5),
+ ({'stock_date_end': today + relativedelta(days=-3),
+ }, 5),
+ ({'stock_date_end': today,
+ }, 4),
+ ({'stock_date_end': today + relativedelta(days=1),
+ }, 3),
+ ({'stock_date_end': today + relativedelta(days=5),
+ }, 1),
+ ({'stock_date_end': today + relativedelta(days=6),
+ }, 1),
+ ({'stock_date_end': today + relativedelta(days=7),
+ }, 6),
+ ({'stock_date_end': today + relativedelta(days=8),
+ }, 6),
+ ({'stock_date_end': False,
+ }, 6),
+ ({'stock_date_end': today + relativedelta(days=-6),
+ 'forecast': True,
+ }, 0),
+ ({'stock_date_end': today + relativedelta(days=-5),
+ 'forecast': True,
+ }, 5),
+ ({'stock_date_end': today + relativedelta(days=-4),
+ 'forecast': True,
+ }, 5),
+ ({'stock_date_end': today + relativedelta(days=-3),
+ 'forecast': True,
+ }, 5),
+ ({'stock_date_end': today,
+ 'forecast': True,
+ }, 3),
+ ({'stock_date_end': today + relativedelta(days=1),
+ 'forecast': True,
+ }, 3),
+ ({'stock_date_end': today + relativedelta(days=5),
+ 'forecast': True,
+ }, 1),
+ ({'stock_date_end': today + relativedelta(days=6),
+ 'forecast': True,
+ }, 1),
+ ({'stock_date_end': today + relativedelta(days=7),
+ 'forecast': True,
+ }, 6),
+ ({'stock_date_end': False,
+ 'forecast': True,
+ }, 6),
+ ]
+ today_quantity = 4
+
+ def tests_product_quantity(context, quantity):
+ product_reloaded = Product(product.id)
+ if (not context.get('stock_date_end')
+ or context['stock_date_end'] > today):
+ self.assertEqual(
+ product_reloaded.forecast_quantity, quantity,
+ msg='context %r' % context)
+ self.assertEqual(
+ product_reloaded.quantity, today_quantity,
+ msg='context %r' % context)
+ elif context.get('forecast'):
+ self.assertEqual(
+ product_reloaded.forecast_quantity, quantity,
+ msg='context %r' % context)
+ elif context.get('stock_date_end') == today:
+ self.assertEqual(product_reloaded.quantity, quantity,
+ msg='context %r' % context)
+ else:
+ self.assertEqual(
+ product_reloaded.forecast_quantity, quantity,
+ msg='context %r' % context)
+ self.assertEqual(product_reloaded.quantity, quantity,
+ msg='context %r' % context)
+
+ def tests_product_search_quantity(context, quantity):
+ if (not context.get('stock_date_end')
+ or context['stock_date_end'] > today
+ or context.get('forecast')):
+ fname = 'forecast_quantity'
+ else:
+ fname = 'quantity'
+ found_products = Product.search([
+ (fname, '=', quantity),
+ ])
+ self.assertIn(product, found_products)
+
+ found_products = Product.search([
+ (fname, '!=', quantity),
+ ])
+ self.assertNotIn(product, found_products)
+
+ found_products = Product.search([
+ (fname, 'in', (quantity, quantity + 1)),
+ ])
+ self.assertIn(product, found_products)
+
+ found_products = Product.search([
+ (fname, 'not in', (quantity, quantity + 1)),
+ ])
+ self.assertNotIn(product, found_products)
+
+ found_products = Product.search([
+ (fname, '<', quantity),
+ ])
+ self.assertNotIn(product, found_products)
+ found_products = Product.search([
+ (fname, '<', quantity + 1),
+ ])
+ self.assertIn(product, found_products)
+
+ found_products = Product.search([
+ (fname, '>', quantity),
+ ])
+ self.assertNotIn(product, found_products)
+ found_products = Product.search([
+ (fname, '>', quantity - 1),
+ ])
+ self.assertIn(product, found_products)
+
+ found_products = Product.search([
+ (fname, '>=', quantity),
+ ])
+ self.assertIn(product, found_products)
+
+ found_products = Product.search([
+ (fname, '<=', quantity),
+ ])
+ self.assertIn(product, found_products)
+
+ def test_products_by_location():
+ for context, quantity in tests:
+ with transaction.set_context(context):
+ if not quantity:
+ self.assertEqual(products_by_location(), {})
+ else:
+ self.assertEqual(products_by_location(),
+ {(storage.id, product.id): quantity})
+ with transaction.set_context(
+ locations=[storage.id]):
+ tests_product_quantity(context, quantity)
+ tests_product_search_quantity(
+ context, quantity)
+ with transaction.set_context(
+ locations=[storage.id, storage_empty.id]):
+ tests_product_quantity(context, quantity)
+ tests_product_search_quantity(
+ context, quantity)
+
+ test_products_by_location()
+
+ periods = [
+ today + relativedelta(days=-6),
+ today + relativedelta(days=-5),
+ today + relativedelta(days=-4),
+ today + relativedelta(days=-3),
+ today + relativedelta(days=-2),
+ ]
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': g.id,
+ 'quantity': 1,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today + relativedelta(days=-5),
+ 'effective_date': (today
+ + relativedelta(days=-5)),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }])
+ Move.do(moves)
+ # Nothing should change when adding a small quantity
+ test_products_by_location()
+
+ for period_date in periods:
+ period, = Period.create([{
+ 'date': period_date,
+ 'company': company.id,
+ }])
+ Period.close([period])
+ test_products_by_location()
+
+ @with_transaction()
+ def test_products_by_location_with_childs(self):
+ 'Test products_by_location with_childs and stock_skip_warehouse'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': 'Test products_by_location',
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+
+ lost_found, = Location.search([('type', '=', 'lost_found')])
+ warehouse, = Location.search([('type', '=', 'warehouse')])
+ storage, = Location.search([('code', '=', 'STO')])
+ input_, = Location.search([('code', '=', 'IN')])
+ storage1, = Location.create([{
+ 'name': 'Storage 1',
+ 'type': 'view',
+ 'parent': storage.id,
+ }])
+ storage2, = Location.create([{
+ 'name': 'Storage 1.1',
+ 'type': 'view',
+ 'parent': storage1.id,
+ }])
+ storage3, = Location.create([{
+ 'name': 'Storage 2',
+ 'type': 'view',
+ 'parent': storage.id,
+ }])
+ company = create_company()
+ with set_company(company):
+ today = datetime.date.today()
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': lost_found.id,
+ 'to_location': storage.id,
+ 'planned_date': today,
+ 'effective_date': today,
+ 'company': company.id,
+ }, {
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': input_.id,
+ 'to_location': storage.id,
+ 'planned_date': today,
+ 'effective_date': today,
+ 'company': company.id,
+ }])
+ Move.do(moves)
+
+ products_by_location = Product.products_by_location(
+ [warehouse.id],
+ grouping_filter=([product.id],),
+ with_childs=True)
+ self.assertEqual(products_by_location[(warehouse.id, product.id)],
+ 1)
+ products_by_location = Product.products_by_location(
+ [warehouse.id, storage.id],
+ grouping_filter=([product.id],),
+ with_childs=True)
+ self.assertEqual(
+ products_by_location[(warehouse.id, product.id)], 1)
+ self.assertEqual(products_by_location[(storage.id, product.id)], 2)
+
+ with Transaction().set_context(locations=[warehouse.id]):
+ found_products = Product.search([
+ ('quantity', '=', 1),
+ ])
+ self.assertListEqual([product], found_products)
+
+ with Transaction().set_context(stock_skip_warehouse=True):
+ products_by_location = Product.products_by_location(
+ [warehouse.id],
+ grouping_filter=([product.id],),
+ with_childs=True)
+ products_by_location_all = Product.products_by_location(
+ [warehouse.id], with_childs=True)
+ self.assertEqual(
+ products_by_location[(warehouse.id, product.id)], 2)
+ self.assertEqual(
+ products_by_location_all[(warehouse.id, product.id)], 2)
+
+ with Transaction().set_context(locations=[warehouse.id]):
+ found_products = Product.search([
+ ('quantity', '=', 2),
+ ])
+ self.assertListEqual([product], found_products)
+
+ @with_transaction()
+ def test_products_by_location_flat_childs(self, period_closed=False):
+ "Test products_by_location on flat_childs"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+ Period = pool.get('stock.period')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': "Product",
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+
+ lost_found, = Location.search([('type', '=', 'lost_found')])
+ storage, = Location.search([('code', '=', 'STO')])
+ storage.flat_childs = True
+ storage.save()
+ storage1, = Location.create([{
+ 'name': 'Storage 1',
+ 'type': 'storage',
+ 'parent': storage.id,
+ }])
+ storage2, = Location.create([{
+ 'name': 'Storage 2',
+ 'type': 'storage',
+ 'parent': storage.id,
+ }])
+
+ company = create_company()
+ with set_company(company):
+ date = Date.today() - relativedelta(days=1)
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': lost_found.id,
+ 'to_location': storage.id,
+ 'planned_date': date,
+ 'effective_date': date,
+ 'company': company.id,
+ }, {
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': lost_found.id,
+ 'to_location': storage1.id,
+ 'planned_date': date,
+ 'effective_date': date,
+ 'company': company.id,
+ }, {
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': storage1.id,
+ 'to_location': storage2.id,
+ 'planned_date': date,
+ 'effective_date': date,
+ 'company': company.id,
+ }])
+ Move.do(moves)
+
+ if period_closed:
+ period, = Period.create([{
+ 'date': date,
+ 'company': company.id,
+ }])
+ Period.close([period])
+
+ # Test flat location
+ products_by_location = Product.products_by_location(
+ [storage.id],
+ grouping_filter=([product.id],),
+ with_childs=True)
+ self.assertEqual(
+ products_by_location[(storage.id, product.id)], 2)
+
+ # Test mixed flat and nested location
+ products_by_location = Product.products_by_location(
+ [storage.parent.id, storage.id, storage1.id, storage2.id],
+ grouping_filter=([product.id],),
+ with_childs=True)
+ self.assertEqual(
+ products_by_location[(storage.parent.id, product.id)], 2)
+ self.assertEqual(
+ products_by_location[(storage.id, product.id)], 2)
+ self.assertEqual(
+ products_by_location[(storage1.id, product.id)], 0)
+ self.assertEqual(
+ products_by_location[(storage2.id, product.id)], 1)
+
+ # Test non flat
+ products_by_location = Product.products_by_location(
+ [lost_found.id],
+ grouping_filter=([product.id],),
+ with_childs=True)
+ self.assertEqual(
+ products_by_location[(lost_found.id, product.id)], -2)
+
+ def test_products_by_location_flat_childs_period_closed(self):
+ "Test products_by_location on flat_childs with period closed"
+ self.test_products_by_location_flat_childs(period_closed=True)
+
+ @with_transaction()
+ def test_products_by_location_2nd_level_flat_childs(self):
+ "Test products_by_location on 2nd level flat_childs"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': "Product",
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'STO')])
+ storage1, = Location.create([{
+ 'name': 'Storage 1',
+ 'type': 'storage',
+ 'flat_childs': True,
+ 'parent': storage.id,
+ }])
+ storage2, = Location.create([{
+ 'name': 'Storage 2',
+ 'type': 'storage',
+ 'parent': storage1.id,
+ }])
+
+ company = create_company()
+ with set_company(company):
+ date = Date.today() - relativedelta(days=1)
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 80,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'effective_date': date,
+ 'company': company.id,
+ 'unit_price': 10.0,
+ 'currency': company.currency.id,
+ }, {
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 60,
+ 'from_location': storage.id,
+ 'to_location': storage2.id,
+ 'effective_date': date,
+ 'company': company.id,
+ }])
+ Move.do(moves)
+
+ # Test 2nd level location
+ products_by_location = Product.products_by_location(
+ [storage.id],
+ grouping_filter=([product.id],),
+ with_childs=True)
+ self.assertEqual(
+ products_by_location[(storage.id, product.id)], 80)
+
+ # Test 1st level and 2nd level nested locations
+ products_by_location = Product.products_by_location(
+ [storage.id, storage1.id],
+ grouping_filter=([product.id],),
+ with_childs=True)
+ self.assertEqual(
+ products_by_location[(storage.id, product.id)], 80)
+ self.assertEqual(
+ products_by_location[(storage1.id, product.id)], 60)
+
+ # Test mixed flat and 2nd level nested locations
+ products_by_location = Product.products_by_location(
+ [storage.id, storage2.id],
+ grouping_filter=([product.id],),
+ with_childs=True)
+ self.assertEqual(
+ products_by_location[(storage.id, product.id)], 80)
+ self.assertEqual(
+ products_by_location[(storage2.id, product.id)], 60)
+
+ @with_transaction()
+ def test_products_by_location_grouped_by_date(self):
+ "Test products_by_location grouped by date"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Date = pool.get('ir.date')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': "Template",
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ lost_found, = Location.search([('type', '=', 'lost_found')])
+ storage, = Location.search([('code', '=', 'STO')])
+ output, = Location.search([('code', '=', 'OUT')])
+ company = create_company()
+ with set_company(company):
+ today = Date.today()
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 10,
+ 'from_location': lost_found.id,
+ 'to_location': storage.id,
+ 'effective_date': today,
+ 'company': company.id,
+ }, {
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 2,
+ 'from_location': storage.id,
+ 'to_location': output.id,
+ 'effective_date': today + relativedelta(days=1),
+ 'company': company.id,
+ }, {
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 3,
+ 'from_location': storage.id,
+ 'to_location': output.id,
+ 'effective_date': today + relativedelta(days=5),
+ 'company': company.id,
+ }])
+ with Transaction().set_context(_skip_warnings=True):
+ Move.do(moves)
+
+ with Transaction().set_context(stock_date_start=today):
+ products_by_location = Product.products_by_location(
+ [storage.id],
+ grouping=('date', 'product'),
+ grouping_filter=(None, [product.id]))
+
+ self.assertDictEqual(products_by_location, {
+ (storage.id,
+ today, product.id): 10,
+ (storage.id,
+ today + relativedelta(days=1), product.id): -2,
+ (storage.id,
+ today + relativedelta(days=5), product.id): -3,
+ })
+
+ @with_transaction()
+ def test_templates_by_location(self, period_closed=False):
+ "Test products_by_location grouped by template"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Period = pool.get('stock.period')
+ Date = pool.get('ir.date')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': 'Template',
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product1, product2 = Product.create([{
+ 'template': template.id,
+ }] * 2)
+
+ lost_found, = Location.search([('type', '=', 'lost_found')])
+ storage, = Location.search([('code', '=', 'STO')])
+ input_, = Location.search([('code', '=', 'IN')])
+ company = create_company()
+ with set_company(company):
+ date = Date.today() - relativedelta(days=1)
+
+ moves = Move.create([{
+ 'product': product1.id,
+ 'uom': unit.id,
+ 'quantity': 2,
+ 'from_location': lost_found.id,
+ 'to_location': storage.id,
+ 'planned_date': date,
+ 'effective_date': date,
+ 'company': company.id,
+ }, {
+ 'product': product2.id,
+ 'uom': unit.id,
+ 'quantity': 3,
+ 'from_location': input_.id,
+ 'to_location': storage.id,
+ 'planned_date': date,
+ 'effective_date': date,
+ 'company': company.id,
+ }])
+ Move.do(moves)
+
+ if period_closed:
+ period, = Period.create([{
+ 'date': date,
+ 'company': company.id,
+ }])
+ Period.close([period])
+
+ templates_by_location = Product.products_by_location(
+ [storage.id],
+ grouping=('product.template',),
+ grouping_filter=([template.id],))
+
+ self.assertDictEqual(templates_by_location, {
+ (storage.id, template.id): 5,
+ })
+
+ def test_templates_by_location_period_closed(self):
+ "Test products_by_location grouped by template with period closed"
+ self.test_templates_by_location(period_closed=True)
+
+ @with_transaction()
+ def test_period(self):
+ 'Test period'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Period = pool.get('stock.period')
+ transaction = Transaction()
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': 'Test period',
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ supplier, = Location.search([('code', '=', 'SUP')])
+ customer, = Location.search([('code', '=', 'CUS')])
+ storage, = Location.search([('code', '=', 'STO')])
+ company = create_company()
+ currency = company.currency
+ with set_company(company):
+ today = datetime.date.today()
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 10,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today + relativedelta(days=-5),
+ 'effective_date': today + relativedelta(days=-5),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 15,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today + relativedelta(days=-4),
+ 'effective_date': today + relativedelta(days=-4),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 5,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'planned_date': today + relativedelta(days=-3),
+ 'effective_date': today + relativedelta(days=-3),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }])
+ Move.do(moves)
+ Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 3,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': None,
+ 'effective_date': None,
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }])
+
+ tests = [
+ (-5, {
+ supplier.id: -10,
+ storage.id: 10,
+ }),
+ (-3, {
+ supplier.id: -25,
+ storage.id: 20,
+ customer.id: 5,
+ })
+ ]
+
+ products_by_location = partial(Product.products_by_location,
+ [storage.id], grouping_filter=([product.id],))
+
+ tests_pbl = [
+ ({'stock_date_end': today + relativedelta(days=-6)}, 0),
+ ({'stock_date_end': today + relativedelta(days=-5)}, 10),
+ ({'stock_date_end': today + relativedelta(days=-4)}, 25),
+ ({'stock_date_end': today + relativedelta(days=-3)}, 20),
+ ({'stock_date_end': today + relativedelta(days=-2)}, 20),
+ ({'stock_date_end': today + relativedelta(days=-1)}, 20),
+ ({'stock_date_end': today}, 20),
+ ({'stock_date_end': datetime.date.max}, 23),
+ ]
+
+ def test_products_by_location():
+ for context, quantity in tests_pbl:
+ with transaction.set_context(context):
+ if not quantity:
+ self.assertEqual(products_by_location(), {})
+ else:
+ self.assertEqual(products_by_location(),
+ {(storage.id, product.id): quantity})
+
+ test_products_by_location()
+ for days, quantities in tests:
+ period, = Period.create([{
+ 'date': today + relativedelta(days=days),
+ 'company': company.id,
+ }])
+ Period.close([period])
+
+ self.assertEqual(period.state, 'closed')
+
+ caches = period.caches
+ for cache in caches:
+ self.assertEqual(cache.product, product)
+ self.assertEqual(cache.internal_quantity,
+ quantities[cache.location.id])
+
+ test_products_by_location()
+
+ # Test check_period_closed
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 10,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today,
+ 'effective_date': today,
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }])
+ Move.do(moves)
+
+ self.assertRaises(Exception, Move.create, [{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 10,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today + relativedelta(days=-5),
+ 'effective_date': today + relativedelta(days=-5),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }])
+ self.assertRaises(Exception, Move.create, [{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 10,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today + relativedelta(days=-3),
+ 'effective_date': today + relativedelta(days=-3),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }])
+
+ # Test close period check
+ period, = Period.create([{
+ 'date': today,
+ 'company': company.id,
+ }])
+ self.assertRaises(Exception, Period.close, [period])
+
+ period, = Period.create([{
+ 'date': today + relativedelta(days=1),
+ 'company': company.id,
+ }])
+ self.assertRaises(Exception, Period.close, [period])
+
+ @with_transaction()
+ def test_check_origin(self):
+ 'Test Move check_origin'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+
+ uom, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': 'Test Move.check_origin',
+ 'type': 'goods',
+ 'default_uom': uom.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ storage, = Location.search([('code', '=', 'STO')])
+ customer, = Location.search([('code', '=', 'CUS')])
+ company = create_company()
+ with set_company(company):
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 1,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+
+ Move.check_origin(moves, set())
+ Move.check_origin(moves, {'supplier'})
+ self.assertRaises(UserWarning, Move.check_origin, moves,
+ {'customer'})
+
+ def test_assign_try(self):
+ 'Test Move assign_try'
+ for quantity, quantities, success, result in [
+ (10, [2], True, {'assigned': [2]}),
+ (5, [10], False, {'assigned': [5], 'draft': [5]}),
+ (0, [3], False, {'draft': [3]}),
+ (6.8, [2.1, 1.7, 1.2, 1.8], True,
+ {'assigned': sorted([2.1, 1.7, 1.2, 1.8])}),
+ ]:
+ self._test_assign_try(quantity, quantities, success, result)
+
+ @with_transaction()
+ def _test_assign_try(self, quantity, quantities, success, result):
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+
+ uom, = Uom.search([('name', '=', 'Meter')])
+ template = Template(
+ name='Test Move.assign_try',
+ type='goods',
+ default_uom=uom,
+ )
+ template.save()
+ product = Product(template=template.id)
+ product.save()
+
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'STO')])
+ customer, = Location.search([('code', '=', 'CUS')])
+
+ company = create_company()
+ with set_company(company):
+ move, = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': quantity,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+ Move.do([move])
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': qty,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ } for qty in quantities])
+
+ msg = 'quantity: %s, quantities: %s' % (quantity, quantities)
+ self.assertEqual(Move.assign_try(moves), success, msg=msg)
+ moves = Move.search([
+ ('product', '=', product.id),
+ ('from_location', '=', storage.id),
+ ('to_location', '=', customer.id),
+ ('company', '=', company.id),
+ ])
+ states = defaultdict(list)
+ for move in moves:
+ states[move.state].append(move.quantity)
+ for state in states:
+ states[state].sort()
+ self.assertEqual(states, result, msg=msg)
+
+ @with_transaction()
+ def test_assign_try_chained(self):
+ "Test Move assign_try chained"
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+
+ uom, = Uom.search([('name', '=', 'Meter')])
+ template = Template(
+ name='Test Move.assign_try',
+ type='goods',
+ default_uom=uom,
+ )
+ template.save()
+ product = Product(template=template.id)
+ product.save()
+
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'STO')])
+ storage2, = Location.copy([storage])
+ storage3, = Location.copy([storage])
+
+ company = create_company()
+ with set_company(company):
+ move, = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 1,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+ Move.do([move])
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 1,
+ 'from_location': from_.id,
+ 'to_location': to.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ } for from_, to in [
+ (storage, storage2),
+ (storage2, storage3)]])
+
+ self.assertFalse(Move.assign_try(moves))
+ self.assertEqual([m.state for m in moves], ['assigned', 'draft'])
+
+ @with_transaction()
+ def test_assign_try_skip_to_location(self):
+ "Test Move assign_try skip to_location"
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+
+ uom, = Uom.search([('name', '=', 'Meter')])
+ template = Template(
+ name='Test Move.assign_try',
+ type='goods',
+ default_uom=uom,
+ )
+ template.save()
+ product = Product(template=template.id)
+ product.save()
+
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'STO')])
+ child, = Location.copy([storage], default={'parent': storage.id})
+
+ company = create_company()
+ with set_company(company):
+ move, = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 1,
+ 'from_location': supplier.id,
+ 'to_location': child.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+ Move.do([move])
+
+ move, = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 1,
+ 'from_location': storage.id,
+ 'to_location': child.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+
+ self.assertFalse(Move.assign_try([move]))
+ self.assertEqual(move.state, 'draft')
+
+ @with_transaction()
+ def test_assign_try_prefer_from_location(self):
+ "Test Move assign_try prefer from location"
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+
+ uom, = Uom.search([('name', '=', 'Meter')])
+ template = Template(
+ name='Test Move.assign_try',
+ type='goods',
+ default_uom=uom,
+ )
+ template.save()
+ product = Product(template=template.id)
+ product.save()
+
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'STO')])
+ # Ensure storage2 comes first when ordering locations by name
+ storage2, = Location.copy(
+ [storage], default={'name': "AAA", 'parent': storage.id})
+ customer, = Location.search([('code', '=', 'CUS')])
+
+ company = create_company()
+ with set_company(company):
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 1,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }, {
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 1,
+ 'from_location': supplier.id,
+ 'to_location': storage2.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+ Move.do(moves)
+
+ move, = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 1,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+
+ Move.assign_try([move])
+
+ self.assertEqual(move.state, 'assigned')
+ self.assertEqual(move.from_location, storage)
+
+ @with_transaction()
+ def test_assign_without_moves(self):
+ "Test Move assign_try with empty moves"
+ pool = Pool()
+ Move = pool.get('stock.move')
+
+ self.assertTrue(Move.assign_try([]))
+
+ @with_transaction()
+ def test_assign_try_modified_move(self):
+ "Test Move assign_try with modified move"
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+
+ uom, = Uom.search([('name', '=', 'Meter')])
+ template = Template(
+ name='Test Move.assign_try',
+ type='goods',
+ default_uom=uom,
+ )
+ template.save()
+ product = Product(template=template.id)
+ product.save()
+
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'STO')])
+ storage2, = Location.copy([storage])
+ customer, = Location.search([('code', '=', 'CUS')])
+
+ company = create_company()
+ with set_company(company):
+ move, = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 1,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+ Move.do([move])
+
+ move, = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 2,
+ 'from_location': storage2.id,
+ 'to_location': customer.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+
+ # Assign from a different location
+ move.from_location = storage
+ self.assertFalse(Move.assign_try([move]))
+
+ move, = Move.search([
+ ('to_location', '=', customer.id),
+ ('state', '=', 'assigned'),
+ ])
+ self.assertEqual(move.from_location, storage)
+ self.assertEqual(move.quantity, 1)
+
+ move, = Move.search([
+ ('to_location', '=', customer.id),
+ ('state', '=', 'draft'),
+ ])
+ # Remaining move has the original location
+ self.assertEqual(move.from_location, storage2)
+ self.assertEqual(move.quantity, 1)
+
+ @with_transaction()
+ def test_products_by_location_assign(self):
+ "Test products by location for assignation"
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ today = datetime.date.today()
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template = Template(
+ name="Product",
+ type='goods',
+ default_uom=unit,
+ )
+ template.save()
+ product, = Product.create([{'template': template.id}])
+
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'STO')])
+ customer, = Location.search([('code', '=', 'CUS')])
+
+ company = create_company()
+ with set_company(company):
+ move_supplier, = Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 10,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today,
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': company.currency.id,
+ }])
+ move_customer, = Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 5,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'planned_date': today + relativedelta(days=1),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': company.currency.id,
+ }])
+
+ Move.assign([move_supplier])
+ with Transaction().set_context(
+ stock_date_end=today,
+ stock_assign=True):
+ pbl = Product.products_by_location(
+ [storage.id], grouping_filter=([product.id],))
+ self.assertDictEqual(pbl, {})
+
+ Move.assign([move_customer])
+ with Transaction().set_context(
+ stock_date_end=today,
+ stock_assign=True):
+ pbl = Product.products_by_location(
+ [storage.id], grouping_filter=([product.id],))
+ self.assertDictEqual(pbl, {(storage.id, product.id): -5})
+
+ Move.do([move_supplier])
+ with Transaction().set_context(
+ stock_date_end=today,
+ stock_assign=True):
+ pbl = Product.products_by_location(
+ [storage.id], grouping_filter=([product.id],))
+ self.assertDictEqual(pbl, {(storage.id, product.id): 5})
+
+ with Transaction().set_context(
+ stock_date_end=today + relativedelta(days=1),
+ stock_assign=True):
+ pbl = Product.products_by_location(
+ [storage.id], grouping_filter=([product.id],))
+ self.assertDictEqual(pbl, {(storage.id, product.id): 5})
+
+ with Transaction().set_context(
+ stock_date_start=today,
+ stock_date_end=today,
+ stock_assign=True):
+ pbl = Product.products_by_location(
+ [storage.id], grouping_filter=([product.id],))
+ self.assertDictEqual(pbl, {(storage.id, product.id): 10})
+
+ with Transaction().set_context(
+ stock_date_start=today + relativedelta(days=1),
+ stock_date_end=today + relativedelta(days=1),
+ stock_assign=True):
+ pbl = Product.products_by_location(
+ [storage.id], grouping_filter=([product.id],))
+ self.assertDictEqual(pbl, {(storage.id, product.id): -5})
+
+ @with_transaction()
+ def test_location_inactive_without_move(self):
+ "Test inactivate location without move"
+ pool = Pool()
+ Location = pool.get('stock.location')
+ storage, = Location.search([('code', '=', 'STO')])
+ location, = Location.create([{
+ 'name': "Location",
+ 'parent': storage.id,
+ }])
+
+ location.active = False
+ location.save()
+
+ @with_transaction()
+ def test_location_inactive_with_quantity(self):
+ "Test inactivate location with quantity"
+ pool = Pool()
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+
+ storage, = Location.search([('code', '=', 'STO')])
+ location, = Location.create([{
+ 'name': "Location",
+ 'parent': storage.id,
+ }])
+ unit, = Uom.search([('name', '=', "Unit")])
+ template, = Template.create([{
+ 'name': "Product",
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{'template': template.id}])
+
+ company = create_company()
+ with set_company(company):
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': storage.id,
+ 'to_location': location.id,
+ 'company': company.id,
+ }])
+ Move.do(moves)
+ with self.assertRaises(UserError):
+ location.active = False
+ location.save()
+
+ @with_transaction()
+ def test_location_inactive_with_draft_moves(self):
+ "Test inactivate location with draft moves"
+ pool = Pool()
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+
+ storage, = Location.search([('code', '=', 'STO')])
+ location, = Location.create([{
+ 'name': "Location",
+ 'parent': storage.id,
+ }])
+ unit, = Uom.search([('name', '=', "Unit")])
+ template, = Template.create([{
+ 'name': "Product",
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{'template': template.id}])
+
+ company = create_company()
+ with set_company(company):
+ Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': storage.id,
+ 'to_location': location.id,
+ 'company': company.id,
+ }, {
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': location.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ }])
+ with self.assertRaises(UserError):
+ location.active = False
+ location.save()
+
+ @with_transaction()
+ def test_inactive_products_with_stock(self):
+ "Test inactivate products with stock"
+ pool = Pool()
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+
+ storage, = Location.search([('code', '=', 'STO')])
+ supplier, = Location.search([('code', '=', 'SUP')])
+ unit, = Uom.search([('name', '=', "Unit")])
+ template, = Template.create([{
+ 'name': "Product",
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ products = Product.create([{'template': template.id}] * 2)
+ product, product2 = products
+
+ company = create_company()
+ with set_company(company):
+ Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'unit_price': Decimal('5'),
+ 'currency': company.currency.id,
+ 'company': company.id,
+ }, {
+ 'product': product2.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'unit_price': Decimal('5'),
+ 'currency': company.currency.id,
+ 'company': company.id,
+ }])
+ with self.assertRaises(UserWarning):
+ Product.write(products, {'active': False})
+
+ Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': storage.id,
+ 'to_location': supplier.id,
+ 'unit_price': Decimal('5'),
+ 'currency': company.currency.id,
+ 'company': company.id,
+ }, {
+ 'product': product2.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': storage.id,
+ 'to_location': supplier.id,
+ 'unit_price': Decimal('5'),
+ 'currency': company.currency.id,
+ 'company': company.id,
+ }])
+ Product.write(products, {'active': False})
+
+ @with_transaction()
+ def test_inactive_products_one_with_stock(self):
+ "Test inactivate products one with stock"
+ pool = Pool()
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+
+ storage, = Location.search([('code', '=', 'STO')])
+ supplier, = Location.search([('code', '=', 'SUP')])
+ unit, = Uom.search([('name', '=', "Unit")])
+ template, = Template.create([{
+ 'name': "Product",
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ products = Product.create([{'template': template.id}] * 2)
+ product, product2 = products
+
+ company = create_company()
+ with set_company(company):
+ Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'unit_price': Decimal('5'),
+ 'currency': company.currency.id,
+ 'company': company.id,
+ }])
+ with self.assertRaises(UserWarning):
+ Product.write(products, {'active': False})
+
+ Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': storage.id,
+ 'to_location': supplier.id,
+ 'unit_price': Decimal('5'),
+ 'currency': company.currency.id,
+ 'company': company.id,
+ }])
+ Product.write(products, {'active': False})
+
+ @with_transaction()
+ def test_location_inactive_with_consumable_product(self):
+ "Test inactive location with consumable products"
+ pool = Pool()
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+
+ warehouse, = Location.search([('type', '=', 'warehouse')])
+ storage, = Location.search([('code', '=', 'STO')])
+ lost_found, = Location.search([('type', '=', 'lost_found')])
+
+ unit, = Uom.search([('name', '=', "Unit")])
+ template, = Template.create([{
+ 'name': "Product",
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ 'consumable': True,
+ }])
+ product, = Product.create([{'template': template.id}])
+
+ company = create_company()
+ with set_company(company):
+ today = datetime.date.today()
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 1,
+ 'from_location': lost_found.id,
+ 'to_location': storage.id,
+ 'planned_date': today,
+ 'effective_date': today,
+ 'company': company.id,
+ }])
+ Move.do(moves)
+ warehouse.active = False
+ warehouse.save()
+
+
+del ModuleTestCase
diff --git a/modules/stock/tests/test_scenario.py b/modules/stock/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/stock/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock/tox.ini b/modules/stock/tox.ini
new file mode 100644
index 0000000000..621e52aed8
--- /dev/null
+++ b/modules/stock/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock/* -m unittest discover -s tests
+ coverage report --include=./**/stock/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock/tryton.cfg b/modules/stock/tryton.cfg
new file mode 100644
index 0000000000..1b64252ffc
--- /dev/null
+++ b/modules/stock/tryton.cfg
@@ -0,0 +1,22 @@
+[tryton]
+version=6.7.0
+depends:
+ company
+ currency
+ ir
+ party
+ product
+ res
+xml:
+ stock.xml
+ product.xml
+ location.xml
+ shipment.xml
+ move.xml
+ inventory.xml
+ party.xml
+ configuration.xml
+ period.xml
+ message.xml
+ res.xml
+ stock_reporting_margin.xml
diff --git a/modules/stock/view/configuration_form.xml b/modules/stock/view/configuration_form.xml
new file mode 100644
index 0000000000..4f3bdd76ad
--- /dev/null
+++ b/modules/stock/view/configuration_form.xml
@@ -0,0 +1,21 @@
+
+
+
diff --git a/modules/stock/view/inventory_count_quantity_form.xml b/modules/stock/view/inventory_count_quantity_form.xml
new file mode 100644
index 0000000000..7df3362597
--- /dev/null
+++ b/modules/stock/view/inventory_count_quantity_form.xml
@@ -0,0 +1,12 @@
+
+
+
diff --git a/modules/stock/view/inventory_count_search_form.xml b/modules/stock/view/inventory_count_search_form.xml
new file mode 100644
index 0000000000..7b24f5d291
--- /dev/null
+++ b/modules/stock/view/inventory_count_search_form.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/modules/stock/view/inventory_form.xml b/modules/stock/view/inventory_form.xml
new file mode 100644
index 0000000000..d29649bf9d
--- /dev/null
+++ b/modules/stock/view/inventory_form.xml
@@ -0,0 +1,28 @@
+
+
+
diff --git a/modules/stock/view/inventory_line_form.xml b/modules/stock/view/inventory_line_form.xml
new file mode 100644
index 0000000000..b091b886f5
--- /dev/null
+++ b/modules/stock/view/inventory_line_form.xml
@@ -0,0 +1,18 @@
+
+
+
diff --git a/modules/stock/view/inventory_line_list_simple.xml b/modules/stock/view/inventory_line_list_simple.xml
new file mode 100644
index 0000000000..8d6fb81f6b
--- /dev/null
+++ b/modules/stock/view/inventory_line_list_simple.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/inventory_line_tree.xml b/modules/stock/view/inventory_line_tree.xml
new file mode 100644
index 0000000000..3624e82dee
--- /dev/null
+++ b/modules/stock/view/inventory_line_tree.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/inventory_tree.xml b/modules/stock/view/inventory_tree.xml
new file mode 100644
index 0000000000..3af903609b
--- /dev/null
+++ b/modules/stock/view/inventory_tree.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/location_form.xml b/modules/stock/view/location_form.xml
new file mode 100644
index 0000000000..7fe2d77209
--- /dev/null
+++ b/modules/stock/view/location_form.xml
@@ -0,0 +1,39 @@
+
+
+
diff --git a/modules/stock/view/location_lead_time_form.xml b/modules/stock/view/location_lead_time_form.xml
new file mode 100644
index 0000000000..222fb429c6
--- /dev/null
+++ b/modules/stock/view/location_lead_time_form.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/modules/stock/view/location_lead_time_list.xml b/modules/stock/view/location_lead_time_list.xml
new file mode 100644
index 0000000000..5fe835edab
--- /dev/null
+++ b/modules/stock/view/location_lead_time_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/location_list.xml b/modules/stock/view/location_list.xml
new file mode 100644
index 0000000000..0ab5b680dd
--- /dev/null
+++ b/modules/stock/view/location_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/location_quantity_form.xml b/modules/stock/view/location_quantity_form.xml
new file mode 100644
index 0000000000..c1d90900ac
--- /dev/null
+++ b/modules/stock/view/location_quantity_form.xml
@@ -0,0 +1,14 @@
+
+
+
diff --git a/modules/stock/view/location_quantity_tree.xml b/modules/stock/view/location_quantity_tree.xml
new file mode 100644
index 0000000000..8e3b6812cf
--- /dev/null
+++ b/modules/stock/view/location_quantity_tree.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/location_tree.xml b/modules/stock/view/location_tree.xml
new file mode 100644
index 0000000000..c671eefd51
--- /dev/null
+++ b/modules/stock/view/location_tree.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/move_form.xml b/modules/stock/view/move_form.xml
new file mode 100644
index 0000000000..13bf10ff6a
--- /dev/null
+++ b/modules/stock/view/move_form.xml
@@ -0,0 +1,50 @@
+
+
+
diff --git a/modules/stock/view/move_list_shipment.xml b/modules/stock/view/move_list_shipment.xml
new file mode 100644
index 0000000000..660bf4b2e4
--- /dev/null
+++ b/modules/stock/view/move_list_shipment.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/move_list_shipment_in.xml b/modules/stock/view/move_list_shipment_in.xml
new file mode 100644
index 0000000000..660bf4b2e4
--- /dev/null
+++ b/modules/stock/view/move_list_shipment_in.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/move_tree.xml b/modules/stock/view/move_tree.xml
new file mode 100644
index 0000000000..14ab665139
--- /dev/null
+++ b/modules/stock/view/move_tree.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/move_tree_simple.xml b/modules/stock/view/move_tree_simple.xml
new file mode 100644
index 0000000000..a0a4dd1dec
--- /dev/null
+++ b/modules/stock/view/move_tree_simple.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/modules/stock/view/party_address_form.xml b/modules/stock/view/party_address_form.xml
new file mode 100644
index 0000000000..3cab326e27
--- /dev/null
+++ b/modules/stock/view/party_address_form.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/party_address_tree.xml b/modules/stock/view/party_address_tree.xml
new file mode 100644
index 0000000000..e4e91bb002
--- /dev/null
+++ b/modules/stock/view/party_address_tree.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/party_contact_mechanism_form.xml b/modules/stock/view/party_contact_mechanism_form.xml
new file mode 100644
index 0000000000..765ad432cf
--- /dev/null
+++ b/modules/stock/view/party_contact_mechanism_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/party_contact_mechanism_tree.xml b/modules/stock/view/party_contact_mechanism_tree.xml
new file mode 100644
index 0000000000..3c9c87a0dd
--- /dev/null
+++ b/modules/stock/view/party_contact_mechanism_tree.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/party_form.xml b/modules/stock/view/party_form.xml
new file mode 100644
index 0000000000..104b7bf230
--- /dev/null
+++ b/modules/stock/view/party_form.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/period_cache_form.xml b/modules/stock/view/period_cache_form.xml
new file mode 100644
index 0000000000..f80167df62
--- /dev/null
+++ b/modules/stock/view/period_cache_form.xml
@@ -0,0 +1,13 @@
+
+
+
diff --git a/modules/stock/view/period_cache_list.xml b/modules/stock/view/period_cache_list.xml
new file mode 100644
index 0000000000..c25b7670e4
--- /dev/null
+++ b/modules/stock/view/period_cache_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/period_form.xml b/modules/stock/view/period_form.xml
new file mode 100644
index 0000000000..df7ab25528
--- /dev/null
+++ b/modules/stock/view/period_form.xml
@@ -0,0 +1,15 @@
+
+
+
diff --git a/modules/stock/view/period_list.xml b/modules/stock/view/period_list.xml
new file mode 100644
index 0000000000..6db13f5b83
--- /dev/null
+++ b/modules/stock/view/period_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/product_by_location_context_form.xml b/modules/stock/view/product_by_location_context_form.xml
new file mode 100644
index 0000000000..09aede248e
--- /dev/null
+++ b/modules/stock/view/product_by_location_context_form.xml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/modules/stock/view/product_cost_price_revision_form.xml b/modules/stock/view/product_cost_price_revision_form.xml
new file mode 100644
index 0000000000..4055ae66c2
--- /dev/null
+++ b/modules/stock/view/product_cost_price_revision_form.xml
@@ -0,0 +1,15 @@
+
+
+
diff --git a/modules/stock/view/product_cost_price_revision_list.xml b/modules/stock/view/product_cost_price_revision_list.xml
new file mode 100644
index 0000000000..436622dcd9
--- /dev/null
+++ b/modules/stock/view/product_cost_price_revision_list.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/product_modify_cost_price_start_form.xml b/modules/stock/view/product_modify_cost_price_start_form.xml
new file mode 100644
index 0000000000..c427e50b20
--- /dev/null
+++ b/modules/stock/view/product_modify_cost_price_start_form.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/modules/stock/view/product_quantities_warehouse_context_form.xml b/modules/stock/view/product_quantities_warehouse_context_form.xml
new file mode 100644
index 0000000000..ec773c860c
--- /dev/null
+++ b/modules/stock/view/product_quantities_warehouse_context_form.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/modules/stock/view/product_quantities_warehouse_graph.xml b/modules/stock/view/product_quantities_warehouse_graph.xml
new file mode 100644
index 0000000000..2461d3a6d6
--- /dev/null
+++ b/modules/stock/view/product_quantities_warehouse_graph.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/product_quantities_warehouse_list.xml b/modules/stock/view/product_quantities_warehouse_list.xml
new file mode 100644
index 0000000000..791e58e7c4
--- /dev/null
+++ b/modules/stock/view/product_quantities_warehouse_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/product_quantities_warehouse_move_list.xml b/modules/stock/view/product_quantities_warehouse_move_list.xml
new file mode 100644
index 0000000000..3223e95e5e
--- /dev/null
+++ b/modules/stock/view/product_quantities_warehouse_move_list.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/products_by_locations_context_form.xml b/modules/stock/view/products_by_locations_context_form.xml
new file mode 100644
index 0000000000..09aede248e
--- /dev/null
+++ b/modules/stock/view/products_by_locations_context_form.xml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/modules/stock/view/products_by_locations_list.xml b/modules/stock/view/products_by_locations_list.xml
new file mode 100644
index 0000000000..0c937b675a
--- /dev/null
+++ b/modules/stock/view/products_by_locations_list.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/recompute_cost_price_start_form.xml b/modules/stock/view/recompute_cost_price_start_form.xml
new file mode 100644
index 0000000000..70f258fb9c
--- /dev/null
+++ b/modules/stock/view/recompute_cost_price_start_form.xml
@@ -0,0 +1,7 @@
+
+
+
diff --git a/modules/stock/view/reporting_margin_category_graph_amount.xml b/modules/stock/view/reporting_margin_category_graph_amount.xml
new file mode 100644
index 0000000000..fe71236cfc
--- /dev/null
+++ b/modules/stock/view/reporting_margin_category_graph_amount.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_category_graph_margin.xml b/modules/stock/view/reporting_margin_category_graph_margin.xml
new file mode 100644
index 0000000000..fe71236cfc
--- /dev/null
+++ b/modules/stock/view/reporting_margin_category_graph_margin.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_category_graph_profit.xml b/modules/stock/view/reporting_margin_category_graph_profit.xml
new file mode 100644
index 0000000000..fe71236cfc
--- /dev/null
+++ b/modules/stock/view/reporting_margin_category_graph_profit.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_category_list.xml b/modules/stock/view/reporting_margin_category_list.xml
new file mode 100644
index 0000000000..5b9723be5f
--- /dev/null
+++ b/modules/stock/view/reporting_margin_category_list.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_category_tree.xml b/modules/stock/view/reporting_margin_category_tree.xml
new file mode 100644
index 0000000000..121a0073ed
--- /dev/null
+++ b/modules/stock/view/reporting_margin_category_tree.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_context_form.xml b/modules/stock/view/reporting_margin_context_form.xml
new file mode 100644
index 0000000000..8b8d055da4
--- /dev/null
+++ b/modules/stock/view/reporting_margin_context_form.xml
@@ -0,0 +1,20 @@
+
+
+
diff --git a/modules/stock/view/reporting_margin_main_graph_amount.xml b/modules/stock/view/reporting_margin_main_graph_amount.xml
new file mode 100644
index 0000000000..f4d15232fd
--- /dev/null
+++ b/modules/stock/view/reporting_margin_main_graph_amount.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_main_graph_margin.xml b/modules/stock/view/reporting_margin_main_graph_margin.xml
new file mode 100644
index 0000000000..1ab5e71a5c
--- /dev/null
+++ b/modules/stock/view/reporting_margin_main_graph_margin.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_main_graph_profit.xml b/modules/stock/view/reporting_margin_main_graph_profit.xml
new file mode 100644
index 0000000000..d251412a77
--- /dev/null
+++ b/modules/stock/view/reporting_margin_main_graph_profit.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_main_list.xml b/modules/stock/view/reporting_margin_main_list.xml
new file mode 100644
index 0000000000..4b78107c2e
--- /dev/null
+++ b/modules/stock/view/reporting_margin_main_list.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_main_time_series_graph_amount.xml b/modules/stock/view/reporting_margin_main_time_series_graph_amount.xml
new file mode 100644
index 0000000000..2f8746e2ea
--- /dev/null
+++ b/modules/stock/view/reporting_margin_main_time_series_graph_amount.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_main_time_series_graph_margin.xml b/modules/stock/view/reporting_margin_main_time_series_graph_margin.xml
new file mode 100644
index 0000000000..eb7c79959f
--- /dev/null
+++ b/modules/stock/view/reporting_margin_main_time_series_graph_margin.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_main_time_series_graph_profit.xml b/modules/stock/view/reporting_margin_main_time_series_graph_profit.xml
new file mode 100644
index 0000000000..b3dfec06fd
--- /dev/null
+++ b/modules/stock/view/reporting_margin_main_time_series_graph_profit.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_main_time_series_list.xml b/modules/stock/view/reporting_margin_main_time_series_list.xml
new file mode 100644
index 0000000000..5620432506
--- /dev/null
+++ b/modules/stock/view/reporting_margin_main_time_series_list.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_product_graph_amount.xml b/modules/stock/view/reporting_margin_product_graph_amount.xml
new file mode 100644
index 0000000000..41cb3fd6a1
--- /dev/null
+++ b/modules/stock/view/reporting_margin_product_graph_amount.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_product_graph_margin.xml b/modules/stock/view/reporting_margin_product_graph_margin.xml
new file mode 100644
index 0000000000..41cb3fd6a1
--- /dev/null
+++ b/modules/stock/view/reporting_margin_product_graph_margin.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_product_graph_profit.xml b/modules/stock/view/reporting_margin_product_graph_profit.xml
new file mode 100644
index 0000000000..41cb3fd6a1
--- /dev/null
+++ b/modules/stock/view/reporting_margin_product_graph_profit.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_product_list.xml b/modules/stock/view/reporting_margin_product_list.xml
new file mode 100644
index 0000000000..69ffc49aef
--- /dev/null
+++ b/modules/stock/view/reporting_margin_product_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/reporting_margin_product_time_series_list.xml b/modules/stock/view/reporting_margin_product_time_series_list.xml
new file mode 100644
index 0000000000..3edeee6293
--- /dev/null
+++ b/modules/stock/view/reporting_margin_product_time_series_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock/view/shipment_assign_partial_form.xml b/modules/stock/view/shipment_assign_partial_form.xml
new file mode 100644
index 0000000000..992fc1e0e8
--- /dev/null
+++ b/modules/stock/view/shipment_assign_partial_form.xml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/modules/stock/view/shipment_in_form.xml b/modules/stock/view/shipment_in_form.xml
new file mode 100644
index 0000000000..5446720297
--- /dev/null
+++ b/modules/stock/view/shipment_in_form.xml
@@ -0,0 +1,44 @@
+
+
+
diff --git a/modules/stock/view/shipment_in_return_form.xml b/modules/stock/view/shipment_in_return_form.xml
new file mode 100644
index 0000000000..87a7e66b50
--- /dev/null
+++ b/modules/stock/view/shipment_in_return_form.xml
@@ -0,0 +1,41 @@
+
+
+
diff --git a/modules/stock/view/shipment_in_return_tree.xml b/modules/stock/view/shipment_in_return_tree.xml
new file mode 100644
index 0000000000..37aed7589a
--- /dev/null
+++ b/modules/stock/view/shipment_in_return_tree.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/shipment_in_tree.xml b/modules/stock/view/shipment_in_tree.xml
new file mode 100644
index 0000000000..1aa783de4a
--- /dev/null
+++ b/modules/stock/view/shipment_in_tree.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/shipment_internal_form.xml b/modules/stock/view/shipment_internal_form.xml
new file mode 100644
index 0000000000..79eb12bc2d
--- /dev/null
+++ b/modules/stock/view/shipment_internal_form.xml
@@ -0,0 +1,52 @@
+
+
+
diff --git a/modules/stock/view/shipment_internal_tree.xml b/modules/stock/view/shipment_internal_tree.xml
new file mode 100644
index 0000000000..7d469d21bd
--- /dev/null
+++ b/modules/stock/view/shipment_internal_tree.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/shipment_out_form.xml b/modules/stock/view/shipment_out_form.xml
new file mode 100644
index 0000000000..5c1f09e9eb
--- /dev/null
+++ b/modules/stock/view/shipment_out_form.xml
@@ -0,0 +1,48 @@
+
+
+
diff --git a/modules/stock/view/shipment_out_return_form.xml b/modules/stock/view/shipment_out_return_form.xml
new file mode 100644
index 0000000000..6dadcfb7bd
--- /dev/null
+++ b/modules/stock/view/shipment_out_return_form.xml
@@ -0,0 +1,43 @@
+
+
+
diff --git a/modules/stock/view/shipment_out_return_tree.xml b/modules/stock/view/shipment_out_return_tree.xml
new file mode 100644
index 0000000000..398af675bf
--- /dev/null
+++ b/modules/stock/view/shipment_out_return_tree.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/shipment_out_tree.xml b/modules/stock/view/shipment_out_tree.xml
new file mode 100644
index 0000000000..0f5875dbb7
--- /dev/null
+++ b/modules/stock/view/shipment_out_tree.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/user_form.xml b/modules/stock/view/user_form.xml
new file mode 100644
index 0000000000..bedf434a70
--- /dev/null
+++ b/modules/stock/view/user_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock/view/user_form_preferences.xml b/modules/stock/view/user_form_preferences.xml
new file mode 100644
index 0000000000..860e37e7e9
--- /dev/null
+++ b/modules/stock/view/user_form_preferences.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_assign_manual/.drone.yml b/modules/stock_assign_manual/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/stock_assign_manual/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_assign_manual/.flake8 b/modules/stock_assign_manual/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_assign_manual/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_assign_manual/.isort.cfg b/modules/stock_assign_manual/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_assign_manual/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_assign_manual/CHANGELOG b/modules/stock_assign_manual/CHANGELOG
new file mode 100644
index 0000000000..a646b9b6ef
--- /dev/null
+++ b/modules/stock_assign_manual/CHANGELOG
@@ -0,0 +1,18 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+* Add manual unassign wizard on shipment
+
+Version 5.8.0 - 2020-11-02
+* Initial release
diff --git a/modules/stock_assign_manual/COPYRIGHT b/modules/stock_assign_manual/COPYRIGHT
new file mode 100644
index 0000000000..c2ab832cbd
--- /dev/null
+++ b/modules/stock_assign_manual/COPYRIGHT
@@ -0,0 +1,14 @@
+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/stock_assign_manual/LICENSE b/modules/stock_assign_manual/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_assign_manual/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/stock_assign_manual/MANIFEST.in b/modules/stock_assign_manual/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_assign_manual/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_assign_manual/README.rst b/modules/stock_assign_manual/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_assign_manual/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_assign_manual/__init__.py b/modules/stock_assign_manual/__init__.py
new file mode 100644
index 0000000000..58852a5380
--- /dev/null
+++ b/modules/stock_assign_manual/__init__.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 Pool
+
+from . import production, stock
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ stock.ShipmentInReturn,
+ stock.ShipmentOut,
+ stock.ShipmentInternal,
+ stock.ShipmentAssignedMove,
+ stock.ShipmentAssignManualShow,
+ stock.ShipmentUnassignManualShow,
+ module='stock_assign_manual', type_='model')
+ Pool.register(
+ stock.ShipmentAssignManual,
+ stock.ShipmentUnassignManual,
+ module='stock_assign_manual', type_='wizard')
+ Pool.register(
+ production.Production,
+ module='stock_assign_manual', type_='model', depends=['production'])
diff --git a/modules/stock_assign_manual/doc/index.rst b/modules/stock_assign_manual/doc/index.rst
new file mode 100644
index 0000000000..85c7b8def1
--- /dev/null
+++ b/modules/stock_assign_manual/doc/index.rst
@@ -0,0 +1,8 @@
+Stock Assign Manual Module
+##########################
+
+The Stock Assign Manual module adds a wizard on shipments and production that
+allows you to decide from which precise location to pick products.
+
+Another wizard allows either the whole amount, or a specific quantity, to be
+unassigned of each move.
diff --git a/modules/stock_assign_manual/locale/bg.po b/modules/stock_assign_manual/locale/bg.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/bg.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/ca.po b/modules/stock_assign_manual/locale/ca.po
new file mode 100644
index 0000000000..e52b2d3beb
--- /dev/null
+++ b/modules/stock_assign_manual/locale/ca.po
@@ -0,0 +1,160 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr "Quantitat del moviment"
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr "Lloc"
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr "Ignorat"
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr "Quantitat reservada"
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr "Quantitat del moviment"
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr "Quantitat sense reservar"
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr "Moviments reservats"
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+"La quantita màxima reservar de la ubicació.\n"
+"Deixeu-ho en blanc per utilitzar la quantitat total del moviment."
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr "La quantitat que queda per reservar"
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr "La quantitat per desassignar"
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr "Els moviments a desassignar."
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr "Reserva manual de producció"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr "Reserva manual de l'albarà de devolució de proveïdor"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr "Reserva manual de l'albarà intern"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr "Reserva manual del albarà de client"
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr "Anul·la la reserva manual de l'albarà"
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+"No s'ha pogut reservar el moviment %(move)s de %(place)s, si us plau torneu-"
+"ho a provar."
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr "La quantitat ha d'estar entre 0 i %(quantity)s."
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Reserva manual"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Reserva manual"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Reserva manual"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Reserva manual"
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr "Reserva manual de l'abarà"
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr "Moviments de l'albarà reservats"
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr "Desfes la reserva de l'albarà manualment"
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr "Introduïu les quantitats a desfer la reserva:"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr "Reserva"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr "Salta"
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr "Desfes la reserva"
diff --git a/modules/stock_assign_manual/locale/cs.po b/modules/stock_assign_manual/locale/cs.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/cs.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/de.po b/modules/stock_assign_manual/locale/de.po
new file mode 100644
index 0000000000..5b7aebcd64
--- /dev/null
+++ b/modules/stock_assign_manual/locale/de.po
@@ -0,0 +1,160 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr "Warenbewegung"
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr "Menge Wargenbewegung"
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr "Platz"
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr "Übersprungen"
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr "Reservierte Menge"
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr "Warenbewegung"
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr "Menge Warenbewegung"
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr "Nicht Reservierte Menge"
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr "Reservierte Warenbewegungen"
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+"Die maximale Menge, die von diesem Platz reserviert werden kann.\n"
+"Leer lassen für die gesamte Menge der Warenbewegung."
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr "Die Menge, die reserviert bleibt."
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr "Die Menge, deren Reservierung aufgehoben werden soll."
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr "Die Warenbewegungen, deren Reservierung aufgehoben werden soll."
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr "Manuelle Reservierung Produktion"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr "Manuelle Reservierung Warenrückgabe (an Lieferanten)"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr "Manuelle Reservierung Interne Lieferung"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr "Manuelle Reservierung Warenausgangslieferungen"
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr "Manuelle Aufhebung Reservierung Lieferung"
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+"Die Reservierung für Warenbewegung %(move)s von Platz %(place)s ist "
+"fehlgeschlagen. Bitte nochmal versuchen."
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr "Die Menge muss zwischen 0 und %(quantity)s liegen."
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Manuelle Reservierung"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Manuelle Reservierung"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Manuelle Reservierung"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Manuelle Reservierung"
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr "Manuelle Reservierung Lieferung"
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr "Lieferung Reservierte Warenbewegungen"
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr "Manuelle Aufhebung Reservierung Lieferung"
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr "Mengen zur Aufhebung der Reservierung erfassen:"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr "Reservieren"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr "Überspringen"
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr "Reservierung aufheben"
diff --git a/modules/stock_assign_manual/locale/es.po b/modules/stock_assign_manual/locale/es.po
new file mode 100644
index 0000000000..b44fe62bcb
--- /dev/null
+++ b/modules/stock_assign_manual/locale/es.po
@@ -0,0 +1,160 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr "Cantidad del movimiento"
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr "Lugar"
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr "Ignorado"
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr "Cantidad reservada"
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr "Cantidad del movimiento"
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr "Cantidad sin asignar"
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr "Movimientos asignados"
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+"La cantidad máxima a reservar desde la ubicación.\n"
+"Dejar en blanco para utilizar toda la cantidad del movimiento."
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr "La cantidad que queda para reservar"
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr "La cantidad por desasignar"
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr "Los movimientos a desasignar."
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr "Reserva manual de la producción"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr "Reserva manual del albarán de devolución del proveedor"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr "Reserva manual del albarán interno"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr "Reserva manual del albarán de cliente"
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr "Desasignar manualmente el albarán"
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+"No se ha podido reservar el movimiento %(move)s desde %(place)s, por favor, "
+"inténtelo de nuevo."
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr "La cantidad debe estar entre 0 y %(quantity)s."
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Reserva manual"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Reserva manual"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Reserva manual"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Reserva manual"
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr "Reserva manual del albarán"
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr "Movimientos del albaran reservados"
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr "Deshacer la reserva del albaran manualmente"
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr "Introduce las cantidades a deshacer la reserva:"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr "Reservar"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr "Saltar"
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr "Deshacer la reserva"
diff --git a/modules/stock_assign_manual/locale/es_419.po b/modules/stock_assign_manual/locale/es_419.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/es_419.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/et.po b/modules/stock_assign_manual/locale/et.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/et.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/fa.po b/modules/stock_assign_manual/locale/fa.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/fa.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/fi.po b/modules/stock_assign_manual/locale/fi.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/fi.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/fr.po b/modules/stock_assign_manual/locale/fr.po
new file mode 100644
index 0000000000..8af329cfa0
--- /dev/null
+++ b/modules/stock_assign_manual/locale/fr.po
@@ -0,0 +1,158 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr "Quantité du mouvement"
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr "Endroit"
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr "Ignorés"
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr "Quantité assignée"
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr "Quantité du mouvement"
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr "Quantité non-assignée"
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr "Mouvements assignés"
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+"La quantité maximale à assigner à partir du l'endroit.\n"
+"Laissez vide pour la quantité totale du mouvement."
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr "La quantité assignée laissée"
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr "La quantité à dés-assigner"
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr "Les mouvements à dés-assigner."
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr "Assigner manuellement la production"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr "Assigner manuellement le retour d'expédition fournisseur"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr "Assigner manuellement l'expédition interne"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr "Assigner manuellement l'expédition cliente"
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr "Dés-assigner manuellement l'expédition"
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr "Échec d’assignation de %(move)s depuis %(place)s, veuillez réessayer."
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr "La quantité doit être comprise entre 0 et %(quantity)s."
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Assigner manuellement"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Assigner manuellement"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Assigner manuellement"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Assigner manuellement"
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr "Assigner manuellement l'expédition"
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr "Mouvement assigné de l'expédition"
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr "Dés-assigner manuellement l'expédition"
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr "Entrez les quantités à dés-assigner :"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr "Assigner"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr "Passer"
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr "Dés-assigner"
diff --git a/modules/stock_assign_manual/locale/hu.po b/modules/stock_assign_manual/locale/hu.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/hu.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/id.po b/modules/stock_assign_manual/locale/id.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/id.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/it.po b/modules/stock_assign_manual/locale/it.po
new file mode 100644
index 0000000000..4a4446eac4
--- /dev/null
+++ b/modules/stock_assign_manual/locale/it.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/lo.po b/modules/stock_assign_manual/locale/lo.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/lo.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/lt.po b/modules/stock_assign_manual/locale/lt.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/lt.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/nl.po b/modules/stock_assign_manual/locale/nl.po
new file mode 100644
index 0000000000..7686b44206
--- /dev/null
+++ b/modules/stock_assign_manual/locale/nl.po
@@ -0,0 +1,158 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr "Mutaties"
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr "Verplaats hoeveelheid"
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr "Plaats"
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr "Overgeslagen"
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr "Toegewezen hoeveelheid"
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr "Mutaties"
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr "Verplaats hoeveelheid"
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr "Niet-toegewezen hoeveelheid"
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr "Toegewezen bewegingen"
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr "Mutaties"
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+"Het maximale aantal dat vanaf de plaats kan worden toegewezen.\n"
+"Laat leeg voor de volledige hoeveelheid van de beweging."
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr "De hoeveelheid die gereserveerd blijft"
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr "De hoeveelheid om de toewijzing ongedaan te maken"
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr "De stock bewegingen die ongedaan gemaakt worden."
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr "Handmatige toewijzing van productie"
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr "Handmatig leverancier retourzending toewijzen"
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr "Handmatig interne zending toewijzen"
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr "Handmatig klantzending toewijzen"
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr "Handmatig zending toewijzen"
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr "Kan %(move)s van %(place)s niet toewijzen, probeer het opnieuw."
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr "De hoeveelheid moet tussen 0 en %(quantity)s liggen."
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Handmatig toewijzen"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Handmatig toewijzen"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Handmatig toewijzen"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr "Handmatig toewijzen"
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr "Handmatig zending toewijzen"
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr "Levering Gereserveerde voorraadbewegingen"
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr "Handmatig zending toewijzen"
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr "Voer de hoeveelheden in om de toewijzing ongedaan te maken:"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr "Toewijzen"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr "Overslaan"
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr "Annuleer"
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr "Toewijzing ongedaan maken"
diff --git a/modules/stock_assign_manual/locale/pl.po b/modules/stock_assign_manual/locale/pl.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/pl.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/pt.po b/modules/stock_assign_manual/locale/pt.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/pt.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/ro.po b/modules/stock_assign_manual/locale/ro.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/ro.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/ru.po b/modules/stock_assign_manual/locale/ru.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/ru.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/sl.po b/modules/stock_assign_manual/locale/sl.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/sl.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/tr.po b/modules/stock_assign_manual/locale/tr.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/tr.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/uk.po b/modules/stock_assign_manual/locale/uk.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/uk.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/locale/zh_CN.po b/modules/stock_assign_manual/locale/zh_CN.po
new file mode 100644
index 0000000000..373b93a44d
--- /dev/null
+++ b/modules/stock_assign_manual/locale/zh_CN.po
@@ -0,0 +1,156 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.shipment.assign.manual.show,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,place:"
+msgid "Place"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,skipped:"
+msgid "Skipped"
+msgstr ""
+
+msgctxt "field:stock.shipment.assign.manual.show,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,assigned_quantity:"
+msgid "Assigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,move_quantity:"
+msgid "Move Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "Unassigned Quantity"
+msgstr ""
+
+msgctxt "field:stock.shipment.assigned.move,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,assigned_moves:"
+msgid "Assigned Moves"
+msgstr ""
+
+msgctxt "field:stock.shipment.unassign.manual.show,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "help:stock.shipment.assign.manual.show,quantity:"
+msgid ""
+"The maximum quantity to assign from the place.\n"
+"Leave empty for the full quantity of the move."
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,assigned_quantity:"
+msgid "The quantity left assigned"
+msgstr ""
+
+msgctxt "help:stock.shipment.assigned.move,unassigned_quantity:"
+msgid "The quantity to unassign"
+msgstr ""
+
+msgctxt "help:stock.shipment.unassign.manual.show,moves:"
+msgid "The moves to unassign."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_production_assign_manual"
+msgid "Manual Assign Production"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_in_return_assign_manual"
+msgid "Manual Assign Supplier Return Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_internal_assign_manual"
+msgid "Manual Assign Internal Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_out_assign_manual"
+msgid "Manual Assign Customer Shipment"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_shipment_unassign_manual"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_assign_failed"
+msgid "Failed to assign of %(move)s from %(place)s, please retry."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_invalid_quantity"
+msgid "The quantity must be between 0 and %(quantity)s."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:production_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_internal_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_out_assign_manual_wizard_button"
+msgid "Manual Assign"
+msgstr ""
+
+msgctxt "model:stock.shipment.assign.manual.show,name:"
+msgid "Manual Assign Shipment"
+msgstr ""
+
+msgctxt "model:stock.shipment.assigned.move,name:"
+msgid "Shipment Assigned Move"
+msgstr ""
+
+msgctxt "model:stock.shipment.unassign.manual.show,name:"
+msgid "Manually Unassign Shipment"
+msgstr ""
+
+msgctxt "view:stock.shipment.unassign.manual.show:"
+msgid "Enter the quantities to unassign:"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,assign:"
+msgid "Assign"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.assign.manual,show,skip:"
+msgid "Skip"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.shipment.unassign.manual,show,unassign:"
+msgid "Unassign"
+msgstr ""
diff --git a/modules/stock_assign_manual/message.xml b/modules/stock_assign_manual/message.xml
new file mode 100644
index 0000000000..7b622c8517
--- /dev/null
+++ b/modules/stock_assign_manual/message.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Failed to assign of %(move)s from %(place)s, please retry.
+
+
+ The quantity must be between 0 and %(quantity)s.
+
+
+
diff --git a/modules/stock_assign_manual/production.py b/modules/stock_assign_manual/production.py
new file mode 100644
index 0000000000..e9df0aeef6
--- /dev/null
+++ b/modules/stock_assign_manual/production.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.model import ModelView
+from trytond.pool import PoolMeta
+from trytond.pyson import Eval
+
+
+class Production(metaclass=PoolMeta):
+ __name__ = 'production'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._buttons.update({
+ 'assign_manual_wizard': {
+ 'invisible': Eval('state') != 'waiting',
+ 'depends': ['state'],
+ },
+ })
+
+ @classmethod
+ @ModelView.button_action(
+ 'stock_assign_manual.wizard_production_assign_manual')
+ def assign_manual_wizard(cls, shipments):
+ pass
diff --git a/modules/stock_assign_manual/production.xml b/modules/stock_assign_manual/production.xml
new file mode 100644
index 0000000000..a8b9219a2d
--- /dev/null
+++ b/modules/stock_assign_manual/production.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+ production
+
+ shipment_form
+
+
+
+ assign_manual_wizard
+ Manual Assign
+
+
+
+
+
+
+
+
+ Manual Assign Production
+ stock.shipment.assign.manual
+ production
+
+
+
diff --git a/modules/stock_assign_manual/setup.py b/modules/stock_assign_manual/setup.py
new file mode 100755
index 0000000000..44aec6f95c
--- /dev/null
+++ b/modules/stock_assign_manual/setup.py
@@ -0,0 +1,157 @@
+#!/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 find_packages, setup
+
+
+def read(fname, slice=None):
+ content = io.open(
+ os.path.join(os.path.dirname(__file__), fname),
+ 'r', encoding='utf-8').read()
+ if slice:
+ content = '\n'.join(content.splitlines()[slice])
+ 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_stock_assign_manual'
+
+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_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 to assign manually stock move',
+ 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/stock_assign_manual',
+ },
+ keywords='tryton stock assign',
+ package_dir={'trytond.modules.stock_assign_manual': '.'},
+ packages=(
+ ['trytond.modules.stock_assign_manual']
+ + ['trytond.modules.stock_assign_manual.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_assign_manual': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_assign_manual = trytond.modules.stock_assign_manual
+ """, # noqa: E501
+ )
diff --git a/modules/stock_assign_manual/stock.py b/modules/stock_assign_manual/stock.py
new file mode 100644
index 0000000000..0ee8cd1a4b
--- /dev/null
+++ b/modules/stock_assign_manual/stock.py
@@ -0,0 +1,429 @@
+# 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 json
+
+from trytond.exceptions import UserError
+from trytond.i18n import gettext
+from trytond.model import Model, ModelStorage, ModelView, dualmethod, fields
+from trytond.model.exceptions import ValidationError
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Eval
+from trytond.transaction import Transaction
+from trytond.wizard import Button, StateTransition, StateView, Wizard
+
+
+class ShipmentUnassignMixin:
+ '''Mixin to unassign quantity from assigned shipment moves'''
+ __slots__ = ()
+
+ @dualmethod
+ def unassign(cls, shipments, moves, quantities):
+ '''
+ Unassign the quantity from the corresponding move of the shipments.
+ '''
+ pool = Pool()
+ Move = pool.get('stock.move')
+ to_unassign = []
+ if not all(m.state == 'assigned' for m in moves):
+ raise ValueError("Not assigned move")
+ Move.draft(moves)
+ for move, unassign_quantity in zip(moves, quantities):
+ if not unassign_quantity:
+ continue
+ if unassign_quantity > move.quantity:
+ raise ValueError(
+ "Unassigned quantity greater than move quantity")
+ if unassign_quantity == move.quantity:
+ to_unassign.append(move)
+ else:
+ with Transaction().set_context(_stock_move_split=True):
+ to_unassign.extend(Move.copy(
+ [move],
+ {'quantity': unassign_quantity}))
+ move.quantity -= unassign_quantity
+ Move.save(moves)
+ Move.assign(moves)
+ if to_unassign:
+ cls.wait(shipments, to_unassign)
+
+
+class ShipmentInReturn(ShipmentUnassignMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in.return'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._buttons.update({
+ 'assign_manual_wizard': {
+ 'invisible': Eval('state') != 'waiting',
+ 'depends': ['state'],
+ },
+ })
+
+ @classmethod
+ @ModelView.button_action(
+ 'stock_assign_manual.wizard_shipment_in_return_assign_manual')
+ def assign_manual_wizard(cls, shipments):
+ pass
+
+
+class ShipmentOut(ShipmentUnassignMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._buttons.update({
+ 'assign_manual_wizard': {
+ 'invisible': ((Eval('state') != 'waiting')
+ | (Eval('warehouse_storage')
+ == Eval('warehouse_output'))),
+ 'depends': [
+ 'state', 'warehouse_storage', 'warehouse_output'],
+ },
+ })
+
+ @classmethod
+ @ModelView.button_action(
+ 'stock_assign_manual.wizard_shipment_out_assign_manual')
+ def assign_manual_wizard(cls, shipments):
+ pass
+
+
+class ShipmentInternal(ShipmentUnassignMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.internal'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._buttons.update({
+ 'assign_manual_wizard': {
+ 'invisible': Eval('state') != 'waiting',
+ 'depends': ['state'],
+ },
+ })
+
+ @classmethod
+ @ModelView.button_action(
+ 'stock_assign_manual.wizard_shipment_internal_assign_manual')
+ def assign_manual_wizard(cls, shipments):
+ pass
+
+
+class ShipmentAssignManual(Wizard):
+ "Manual Assign Shipment"
+ __name__ = 'stock.shipment.assign.manual'
+ start_state = 'next_'
+ next_ = StateTransition()
+ show = StateView('stock.shipment.assign.manual.show',
+ 'stock_assign_manual.shipment_assign_manual_show_view_form', [
+ Button("Cancel", 'end', 'tryton-cancel'),
+ Button("Skip", 'skip', 'tryton-forward', validate=False),
+ Button("Assign", 'assign', 'tryton-ok', default=True),
+ ])
+ skip = StateTransition()
+ assign = StateTransition()
+
+ def transition_next_(self):
+
+ def next_move():
+ for move in self.record.assign_moves:
+ if move.state == 'draft' and move not in self.show.skipped:
+ self.show.move = move
+ return move
+
+ if getattr(self.show, 'skipped', None) is None:
+ self.show.skipped = []
+
+ if not next_move():
+ if all(m.state == 'assigned' for m in self.record.assign_moves):
+ self.model.assign([self.record])
+ return 'end'
+ return 'show'
+
+ def default_show(self, fields):
+ defaults = {}
+ if 'skipped' in fields:
+ defaults['skipped'] = [m.id for m in self.show.skipped]
+ if 'move' in fields:
+ defaults['move'] = self.show.move.id
+ if 'unit' in fields:
+ defaults['unit'] = self.show.move.uom.id
+ if 'move_quantity' in fields:
+ defaults['move_quantity'] = self.show.move.quantity
+ return defaults
+
+ def transition_skip(self):
+ moves = list(self.show.skipped)
+ moves.append(self.show.move)
+ self.show.skipped = moves
+ return 'next_'
+
+ def transition_assign(self):
+ self.show.assign()
+ return 'next_'
+
+
+class ShipmentAssignManualShow(ModelView):
+ "Manual Assign Shipment"
+ __name__ = 'stock.shipment.assign.manual.show'
+
+ skipped = fields.Many2Many(
+ 'stock.move', None, None, "Skipped", readonly=True)
+ move = fields.Many2One('stock.move', "Move", readonly=True)
+ quantity = fields.Float(
+ "Quantity", digits='unit',
+ domain=['OR',
+ ('quantity', '=', None),
+ [
+ ('quantity', '>', 0),
+ ('quantity', '<=', Eval('move_quantity', 0)),
+ ],
+ ],
+ help="The maximum quantity to assign from the place.\n"
+ "Leave empty for the full quantity of the move.")
+ unit = fields.Many2One('product.uom', "Unit", readonly=True)
+ move_quantity = fields.Float("Move Quantity", readonly=True)
+ place = fields.Selection('get_places', "Place", required=True, sort=False)
+ place_string = place.translated('place')
+
+ @fields.depends('move')
+ def get_places(self, with_childs=True, grouping=('product',)):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Product = pool.get('product.product')
+ Lang = pool.get('ir.lang')
+ lang = Lang.get()
+
+ if not self.move:
+ return []
+
+ if with_childs:
+ locations = Location.search([
+ ('parent', 'child_of', [self.move.from_location.id]),
+ ])
+ else:
+ locations = [self.move.from_location]
+
+ location_ids = [loc.id for loc in locations]
+ product_ids = [self.move.product.id]
+ with Transaction().set_context(company=self.move.company.id):
+ stock_date_end = Date.today()
+ with Transaction().set_context(
+ stock_date_end=stock_date_end,
+ stock_assign=True,
+ forecast=False,
+ company=self.move.company.id):
+ pbl = Product.products_by_location(
+ location_ids, with_childs=False,
+ grouping=grouping, grouping_filter=(product_ids,))
+
+ def get_key(move, location_id):
+ key = (location_id,)
+ for field in grouping:
+ value = getattr(move, field)
+ if isinstance(value, Model):
+ value = value.id
+ key += (value,)
+ return key
+
+ def match(key, pattern):
+ for k, p in zip(key, pattern):
+ if p is None or k == p:
+ continue
+ else:
+ return False
+ else:
+ return True
+
+ def get_name(key):
+ move = Move()
+ parts = [Location(key[0]).rec_name]
+ for field, value in zip(grouping, key[1:]):
+ setattr(move, field, value)
+ value = getattr(move, field)
+ if isinstance(value, ModelStorage):
+ parts.append(value.rec_name)
+ elif value:
+ parts.append(str(value))
+ return ' - '.join(parts)
+
+ # Prevent picking from the destination location
+ try:
+ locations.remove(self.move.to_location)
+ except ValueError:
+ pass
+ # Try first to pick from source location
+ locations.remove(self.move.from_location)
+ locations.insert(0, self.move.from_location)
+ places = [(None, '')]
+ quantities = self.move.sort_quantities(
+ pbl.items(), locations, grouping)
+ for key, qty in quantities:
+ move_key = get_key(self.move, key[0])
+ if qty > 0 and match(key, move_key):
+ uom = self.move.product.default_uom
+ quantity = lang.format_number_symbol(
+ pbl[key], uom, digits=uom.digits)
+ name = '%(name)s (%(quantity)s)' % {
+ 'name': get_name(key),
+ 'quantity': quantity
+ }
+ places.append((json.dumps(key), name))
+ return places
+
+ def assign(self, grouping=('product',)):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Lang = pool.get('ir.lang')
+ lang = Lang.get()
+ if self.quantity is not None:
+ if not (0 <= self.quantity <= self.move.quantity):
+ uom = self.move.product.default_uom
+ raise ValidationError(gettext(
+ 'stock_assign_manual.msg_invalid_quantity',
+ quantity=lang.format_number(
+ self.move_quantity, uom.digits)))
+ quantity = self.move.uom.round(self.quantity)
+ remainder = self.move.uom.round(self.move.quantity - quantity)
+ self.move.quantity = quantity
+ self.move.save()
+ if remainder:
+ Move.copy([self.move], {'quantity': remainder})
+ key = json.loads(self.place)
+ values = self._apply(key, grouping)
+ quantity = self.move.quantity
+ Move.assign_try([self.move], with_childs=False, grouping=grouping)
+ if self.move.state != 'assigned':
+ # Restore initial values as assign_try may have saved the move
+ for field, value in values.items():
+ setattr(self.move, field, value)
+ self.move.save()
+ if self.move.quantity == quantity:
+ raise UserError(gettext(
+ 'stock_assign_manual.msg_assign_failed',
+ move=self.move.rec_name,
+ place=self.place_string))
+
+ def _apply(self, key, grouping):
+ """Update the move according to the key
+ and return a dictionary with the initial values."""
+ values = {'from_location': self.move.from_location.id}
+ location_id = key[0]
+ self.move.from_location = location_id
+ for field, value in zip(grouping, key[1:]):
+ if value is not None and '.' not in field:
+ values[field] = getattr(self.move, field)
+ setattr(self.move, field, value)
+ return values
+
+
+class ShipmentUnassignManual(Wizard):
+ "Manual Unassign Shipment"
+ __name__ = 'stock.shipment.unassign.manual'
+ start = StateTransition()
+ show = StateView('stock.shipment.unassign.manual.show',
+ 'stock_assign_manual.shipment_unassign_manual_show_view_form', [
+ Button("Cancel", 'end', 'tryton-cancel'),
+ Button("Unassign", 'unassign', 'tryton-ok', default=True),
+ ])
+ unassign = StateTransition()
+
+ def transition_start(self):
+ moves = self.record.assign_moves
+ if any(m.state == 'assigned' for m in moves):
+ return 'show'
+ return 'end'
+
+ def default_show(self, fields):
+ moves = self.record.assign_moves
+ move_ids = [m.id for m in moves if m.state == 'assigned']
+ return {
+ 'assigned_moves': move_ids,
+ }
+
+ def transition_unassign(self):
+ moves = []
+ quantities = []
+ for m in self.show.moves:
+ moves.append(m.move)
+ quantities.append(m.unassigned_quantity)
+ self.record.unassign(moves, quantities)
+ return 'end'
+
+
+class ShipmentAssignedMove(ModelView):
+ "Shipment Assigned Move"
+ __name__ = 'stock.shipment.assigned.move'
+
+ move = fields.Many2One('stock.move', "Move", required=True)
+ unassigned_quantity = fields.Float(
+ "Unassigned Quantity", digits='unit',
+ domain=['OR',
+ ('unassigned_quantity', '=', None),
+ [
+ ('unassigned_quantity', '>=', 0),
+ ('unassigned_quantity', '<=', Eval('move_quantity', 0)),
+ ],
+ ],
+ help="The quantity to unassign")
+ assigned_quantity = fields.Float(
+ "Assigned Quantity", digits='unit',
+ domain=['OR',
+ ('assigned_quantity', '=', None),
+ [
+ ('assigned_quantity', '>=', 0),
+ ('assigned_quantity', '<=', Eval('move_quantity', 0)),
+ ],
+ ],
+ help="The quantity left assigned")
+ unit = fields.Function(
+ fields.Many2One('product.uom', "Unit"), 'on_change_with_unit')
+ move_quantity = fields.Function(
+ fields.Float("Move Quantity"), 'on_change_with_move_quantity')
+
+ @staticmethod
+ def default_unassigned_quantity():
+ return 0.0
+
+ @fields.depends('move', 'unassigned_quantity', 'assigned_quantity')
+ def on_change_move(self, name=None):
+ if self.move:
+ self.assigned_quantity = self.move.quantity
+ self.unassigned_quantity = 0.0
+
+ @fields.depends('assigned_quantity', 'move', 'unassigned_quantity', 'unit')
+ def on_change_unassigned_quantity(self, name=None):
+ if self.move and self.unassigned_quantity:
+ self.assigned_quantity = self.unit.round(
+ self.move.quantity - self.unassigned_quantity)
+
+ @fields.depends('unassigned_quantity', 'move', 'assigned_quantity', 'unit')
+ def on_change_assigned_quantity(self, name=None):
+ if self.move and self.assigned_quantity:
+ self.unassigned_quantity = self.unit.round(
+ self.move.quantity - self.assigned_quantity)
+
+ @fields.depends('move')
+ def on_change_with_unit(self, name=None):
+ if self.move:
+ return self.move.uom.id
+
+ @fields.depends('move')
+ def on_change_with_move_quantity(self, name=None):
+ if self.move:
+ return self.move.quantity
+
+
+class ShipmentUnassignManualShow(ModelView):
+ "Manually Unassign Shipment"
+ __name__ = 'stock.shipment.unassign.manual.show'
+
+ moves = fields.One2Many(
+ 'stock.shipment.assigned.move', None, "Moves",
+ domain=[('move.id', 'in', Eval('assigned_moves'))],
+ help="The moves to unassign.")
+ assigned_moves = fields.Many2Many(
+ 'stock.move', None, None, "Assigned Moves")
diff --git a/modules/stock_assign_manual/stock.xml b/modules/stock_assign_manual/stock.xml
new file mode 100644
index 0000000000..a35b5c6316
--- /dev/null
+++ b/modules/stock_assign_manual/stock.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+ stock.shipment.in.return
+
+ shipment_form
+
+
+
+ assign_manual_wizard
+ Manual Assign
+
+
+
+
+
+
+
+
+ stock.shipment.out
+
+ shipment_form
+
+
+
+ assign_manual_wizard
+ Manual Assign
+
+
+
+
+
+
+
+
+ stock.shipment.internal
+
+ shipment_form
+
+
+
+ assign_manual_wizard
+ Manual Assign
+
+
+
+
+
+
+
+
+ Manual Assign Supplier Return Shipment
+ stock.shipment.assign.manual
+ stock.shipment.in.return
+
+
+ Manual Assign Customer Shipment
+ stock.shipment.assign.manual
+ stock.shipment.out
+
+
+ Manual Assign Internal Shipment
+ stock.shipment.assign.manual
+ stock.shipment.internal
+
+
+
+ stock.shipment.assign.manual.show
+ form
+ shipment_assign_manual_show_form
+
+
+
+ Manually Unassign Shipment
+ stock.shipment.unassign.manual
+
+
+ form_action
+ stock.shipment.in.return,-1
+
+
+
+ form_action
+ stock.shipment.out,-1
+
+
+
+ form_action
+ stock.shipment.internal,-1
+
+
+
+
+ stock.shipment.unassign.manual.show
+ form
+ shipment_unassign_manual_show_form
+
+
+
+ stock.shipment.assigned.move
+ form
+ shipment_assigned_move_form
+
+
+ stock.shipment.assigned.move
+ tree
+ shipment_assigned_move_list
+
+
+
diff --git a/modules/stock_assign_manual/tests/__init__.py b/modules/stock_assign_manual/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_assign_manual/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_assign_manual/tests/scenario_stock_assign_manual.rst b/modules/stock_assign_manual/tests/scenario_stock_assign_manual.rst
new file mode 100644
index 0000000000..facedfee6f
--- /dev/null
+++ b/modules/stock_assign_manual/tests/scenario_stock_assign_manual.rst
@@ -0,0 +1,186 @@
+============================
+Stock Assign Manual Scenario
+============================
+
+Imports::
+
+ >>> import datetime as dt
+ >>> import json
+ >>> 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 = dt.date.today()
+
+Activate stock_assign_manual::
+
+ >>> config = activate_modules('stock_assign_manual')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+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('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> storage_loc2, = storage_loc.duplicate(
+ ... default={'parent': storage_loc.id})
+
+Fill locations::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> move = StockMove()
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = storage_loc
+ >>> move.unit_price = Decimal('5')
+ >>> move.currency = company.currency
+ >>> move.click('do')
+
+ >>> move = StockMove()
+ >>> move.product = product
+ >>> move.quantity = 4
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = storage_loc2
+ >>> move.unit_price = Decimal('5')
+ >>> move.currency = company.currency
+ >>> move.click('do')
+
+Make a customer shipment::
+
+ >>> Shipment = Model.get('stock.shipment.out')
+ >>> shipment = Shipment()
+ >>> shipment.customer = customer
+ >>> move = shipment.outgoing_moves.new()
+ >>> move.product = product
+ >>> move.uom = unit
+ >>> move.quantity = 2
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> move.unit_price = Decimal('20')
+ >>> move.currency = company.currency
+ >>> move = shipment.outgoing_moves.new()
+ >>> move.product = product
+ >>> move.uom = unit
+ >>> move.quantity = 3
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> move.unit_price = Decimal('20')
+ >>> move.currency = company.currency
+ >>> shipment.click('wait')
+ >>> shipment.state
+ 'waiting'
+
+Assign manually the first move::
+
+ >>> assign_manual = Wizard('stock.shipment.assign.manual', [shipment])
+ >>> assign_manual.form.move == shipment.inventory_moves[0]
+ True
+ >>> assign_manual.form.move_quantity
+ 2.0
+ >>> assign_manual.form.place = json.dumps([storage_loc.id, product.id])
+ >>> assign_manual.execute('assign')
+ >>> assign_manual.form.move_quantity
+ 1.0
+ >>> assign_manual.form.place = json.dumps([storage_loc2.id, product.id])
+ >>> assign_manual.execute('assign')
+ >>> assign_manual.form.move_quantity
+ 3.0
+ >>> assign_manual.execute('skip')
+ >>> assign_manual.state
+ 'end'
+
+Shipment is not yet assigned::
+
+ >>> shipment.state
+ 'waiting'
+ >>> sorted([m.state for m in shipment.inventory_moves])
+ ['assigned', 'assigned', 'draft']
+ >>> [m.quantity for m in shipment.inventory_moves if m.state == 'assigned']
+ [1.0, 1.0]
+ >>> [m.from_location for m in shipment.inventory_moves
+ ... if m.state == 'assigned'] == [storage_loc, storage_loc2]
+ True
+
+Assign manually remaining move::
+
+ >>> assign_manual = Wizard('stock.shipment.assign.manual', [shipment])
+ >>> assign_manual.form.place = json.dumps([storage_loc2.id, product.id])
+ >>> assign_manual.execute('assign')
+
+ >>> shipment.state
+ 'assigned'
+
+Unassign move::
+
+ >>> AssignedMove = Model.get('stock.shipment.assigned.move')
+ >>> sorted([m.state for m in shipment.inventory_moves])
+ ['assigned', 'assigned', 'assigned']
+ >>> move1, _, _ = shipment.inventory_moves
+ >>> unassign_manual = Wizard('stock.shipment.unassign.manual', [shipment])
+ >>> move_to_unassign = AssignedMove()
+ >>> move_to_unassign.move = StockMove(move1.id)
+ >>> move_to_unassign.unassigned_quantity = 1.0
+ >>> unassign_manual.form.moves.append(move_to_unassign)
+ >>> unassign_manual.execute('unassign')
+ >>> shipment.state
+ 'waiting'
+ >>> sorted([(m.state, m.quantity) for m in shipment.inventory_moves])
+ [('assigned', 1.0), ('assigned', 3.0), ('draft', 1.0)]
+
+Unassign a second move to be merged::
+
+ >>> move2, = [i for i in shipment.inventory_moves if (
+ ... i.quantity == 1.0 and i.state == 'assigned')]
+ >>> unassign_manual = Wizard('stock.shipment.unassign.manual', [shipment])
+ >>> move_to_unassign = AssignedMove()
+ >>> move_to_unassign.move = StockMove(move2.id)
+ >>> move_to_unassign.unassigned_quantity = 1.0
+ >>> unassign_manual.form.moves.append(move_to_unassign)
+ >>> unassign_manual.execute('unassign')
+ >>> shipment.state
+ 'waiting'
+ >>> sorted([(m.state, m.quantity) for m in shipment.inventory_moves])
+ [('assigned', 3.0), ('draft', 2.0)]
+
+Unassign partially third move::
+
+ >>> move3, = [i for i in shipment.inventory_moves
+ ... if i.quantity == 3.0 and i.state == 'assigned']
+ >>> unassign_manual = Wizard('stock.shipment.unassign.manual', [shipment])
+ >>> move_to_unassign = AssignedMove()
+ >>> move_to_unassign.move = StockMove(move3.id)
+ >>> move_to_unassign.unassigned_quantity = 2.0
+ >>> unassign_manual.form.moves.append(move_to_unassign)
+ >>> unassign_manual.execute('unassign')
+ >>> shipment.state
+ 'waiting'
+ >>> sorted([(m.state, m.quantity) for m in shipment.inventory_moves])
+ [('assigned', 1.0), ('draft', 2.0), ('draft', 2.0)]
diff --git a/modules/stock_assign_manual/tests/test_module.py b/modules/stock_assign_manual/tests/test_module.py
new file mode 100644
index 0000000000..0c7eac07df
--- /dev/null
+++ b/modules/stock_assign_manual/tests/test_module.py
@@ -0,0 +1,13 @@
+# 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.tests.test_tryton import ModuleTestCase
+
+
+class StockAssignManualTestCase(ModuleTestCase):
+ 'Test Stock Assign Manual module'
+ module = 'stock_assign_manual'
+ extras = ['production']
+
+
+del ModuleTestCase
diff --git a/modules/stock_assign_manual/tests/test_scenario.py b/modules/stock_assign_manual/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/stock_assign_manual/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock_assign_manual/tox.ini b/modules/stock_assign_manual/tox.ini
new file mode 100644
index 0000000000..c71483d985
--- /dev/null
+++ b/modules/stock_assign_manual/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_assign_manual/* -m unittest discover -s tests
+ coverage report --include=./**/stock_assign_manual/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_assign_manual/tryton.cfg b/modules/stock_assign_manual/tryton.cfg
new file mode 100644
index 0000000000..014ff06497
--- /dev/null
+++ b/modules/stock_assign_manual/tryton.cfg
@@ -0,0 +1,11 @@
+[tryton]
+version=6.7.0
+depends:
+ ir
+ stock
+extras_depend:
+ production
+xml:
+ stock.xml
+ production.xml
+ message.xml
diff --git a/modules/stock_assign_manual/view/shipment_assign_manual_show_form.xml b/modules/stock_assign_manual/view/shipment_assign_manual_show_form.xml
new file mode 100644
index 0000000000..c58d5d521f
--- /dev/null
+++ b/modules/stock_assign_manual/view/shipment_assign_manual_show_form.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/modules/stock_assign_manual/view/shipment_assigned_move_form.xml b/modules/stock_assign_manual/view/shipment_assigned_move_form.xml
new file mode 100644
index 0000000000..772d9dbd42
--- /dev/null
+++ b/modules/stock_assign_manual/view/shipment_assigned_move_form.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/modules/stock_assign_manual/view/shipment_assigned_move_list.xml b/modules/stock_assign_manual/view/shipment_assigned_move_list.xml
new file mode 100644
index 0000000000..a56b566f22
--- /dev/null
+++ b/modules/stock_assign_manual/view/shipment_assigned_move_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock_assign_manual/view/shipment_form.xml b/modules/stock_assign_manual/view/shipment_form.xml
new file mode 100644
index 0000000000..cffe7d6ee0
--- /dev/null
+++ b/modules/stock_assign_manual/view/shipment_form.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock_assign_manual/view/shipment_unassign_manual_show_form.xml b/modules/stock_assign_manual/view/shipment_unassign_manual_show_form.xml
new file mode 100644
index 0000000000..5cea1842af
--- /dev/null
+++ b/modules/stock_assign_manual/view/shipment_unassign_manual_show_form.xml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/modules/stock_consignment/.drone.yml b/modules/stock_consignment/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/stock_consignment/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_consignment/.flake8 b/modules/stock_consignment/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_consignment/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_consignment/.isort.cfg b/modules/stock_consignment/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_consignment/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_consignment/CHANGELOG b/modules/stock_consignment/CHANGELOG
new file mode 100644
index 0000000000..ba4a629e26
--- /dev/null
+++ b/modules/stock_consignment/CHANGELOG
@@ -0,0 +1,39 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-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)
+* Add lost and found per supplier and customer location
+
+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)
+* Manage move from supplier to customer
+
+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
+* Initial release
diff --git a/modules/stock_consignment/COPYRIGHT b/modules/stock_consignment/COPYRIGHT
new file mode 100644
index 0000000000..585f9c6f67
--- /dev/null
+++ b/modules/stock_consignment/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/stock_consignment/LICENSE b/modules/stock_consignment/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_consignment/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/stock_consignment/MANIFEST.in b/modules/stock_consignment/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_consignment/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_consignment/README.rst b/modules/stock_consignment/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_consignment/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_consignment/__init__.py b/modules/stock_consignment/__init__.py
new file mode 100644
index 0000000000..da59c8f037
--- /dev/null
+++ b/modules/stock_consignment/__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 account, stock
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ stock.Location,
+ stock.LocationLeadTime,
+ stock.Move,
+ stock.ShipmentInternal,
+ stock.Inventory,
+ account.InvoiceLine,
+ module='stock_consignment', type_='model')
+ Pool.register(
+ stock.OrderPoint,
+ module='stock_consignment', type_='model',
+ depends=['stock_supply'])
diff --git a/modules/stock_consignment/account.py b/modules/stock_consignment/account.py
new file mode 100644
index 0000000000..4aaf66907d
--- /dev/null
+++ b/modules/stock_consignment/account.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, PoolMeta
+
+
+class InvoiceLine(metaclass=PoolMeta):
+ __name__ = 'account.invoice.line'
+
+ @property
+ def origin_name(self):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ name = super(InvoiceLine, self).origin_name
+ if (isinstance(self.origin, Move)
+ and self.origin.shipment):
+ name = self.origin.shipment.rec_name
+ return name
+
+ @classmethod
+ def _get_origin(cls):
+ return super(InvoiceLine, cls)._get_origin() + ['stock.move']
diff --git a/modules/stock_consignment/doc/index.rst b/modules/stock_consignment/doc/index.rst
new file mode 100644
index 0000000000..6877b98dcd
--- /dev/null
+++ b/modules/stock_consignment/doc/index.rst
@@ -0,0 +1,26 @@
+Stock Consignment Module
+########################
+
+The stock consignment modules allow to manage consignment stock from supplier
+or at customer warehouse.
+
+The consignment stock from supplier is managed by creating a supplier location
+under the company's warehouse storage. The location can be filled using an
+Internal Shipment from the external supplier location. The products are used
+also by using an Internal Shipment from the consignment location to a storage
+location. In this case, a supplier invoice line is created for the supplier
+defined on the location.
+
+The consignment stock at customer warehouse is managed by creating a storage
+location under the customer location. The location can be filled using an
+Internal Shipment from a warehouse. It is possible to define a lead time
+between the warehouse and the storage location. The products are used also by
+using an Internal Shipment from the consignment location to a customer
+location. In this case, a customer invoice line is created for the customer
+defined on the location.
+
+It is allowed to make inventory for those consignment locations.
+
+A new field is added to Location:
+
+- Consignment Party: The party invoiced when consignment is used.
diff --git a/modules/stock_consignment/locale/bg.po b/modules/stock_consignment/locale/bg.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/bg.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/ca.po b/modules/stock_consignment/locale/ca.po
new file mode 100644
index 0000000000..371674e55c
--- /dev/null
+++ b/modules/stock_consignment/locale/ca.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "Tercer consignació"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr "Línies de factura de consignació"
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
+"El tercer al que es facturarà quan es s'utilitzin els moviments de "
+"consignació."
diff --git a/modules/stock_consignment/locale/cs.po b/modules/stock_consignment/locale/cs.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/cs.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/de.po b/modules/stock_consignment/locale/de.po
new file mode 100644
index 0000000000..66433ea666
--- /dev/null
+++ b/modules/stock_consignment/locale/de.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "Konsignant"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr "Konsignationsrechnungsposition"
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
+"Die Partei an die verrechnet wird wenn das Konsignationslager verwendet "
+"wird."
diff --git a/modules/stock_consignment/locale/es.po b/modules/stock_consignment/locale/es.po
new file mode 100644
index 0000000000..f52b2d6ce9
--- /dev/null
+++ b/modules/stock_consignment/locale/es.po
@@ -0,0 +1,16 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "Tercero consignación"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr "Lineas de factura de consignación"
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
+"El tercero a facturar cuando se utiliza los movimientos de consignación."
diff --git a/modules/stock_consignment/locale/es_419.po b/modules/stock_consignment/locale/es_419.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/es_419.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/et.po b/modules/stock_consignment/locale/et.po
new file mode 100644
index 0000000000..07732384a8
--- /dev/null
+++ b/modules/stock_consignment/locale/et.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "Saadetise osapool"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr "Arve saaja kui kasutatakse partiiladu."
diff --git a/modules/stock_consignment/locale/fa.po b/modules/stock_consignment/locale/fa.po
new file mode 100644
index 0000000000..fc39753249
--- /dev/null
+++ b/modules/stock_consignment/locale/fa.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "موجودی انبار نهاد/سازمان"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr "هنگامی که موجودی انبار استفاده شود، نهاد/سازمان صورتحساب میسازد."
diff --git a/modules/stock_consignment/locale/fi.po b/modules/stock_consignment/locale/fi.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/fi.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/fr.po b/modules/stock_consignment/locale/fr.po
new file mode 100644
index 0000000000..9213853d49
--- /dev/null
+++ b/modules/stock_consignment/locale/fr.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "Tiers de consignation"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr "Lignes de facture de consignation"
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr "Le tiers facturé quand le stock de consignation est utilisé."
diff --git a/modules/stock_consignment/locale/hu.po b/modules/stock_consignment/locale/hu.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/hu.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/id.po b/modules/stock_consignment/locale/id.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/id.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/it.po b/modules/stock_consignment/locale/it.po
new file mode 100644
index 0000000000..d9c273e575
--- /dev/null
+++ b/modules/stock_consignment/locale/it.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "Controparte Spedizione"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr "Righe di fattura di conto vendita"
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr "La controparte da fatturare quando si utilizza il deposito merce."
diff --git a/modules/stock_consignment/locale/lo.po b/modules/stock_consignment/locale/lo.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/lo.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/lt.po b/modules/stock_consignment/locale/lt.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/lt.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/nl.po b/modules/stock_consignment/locale/nl.po
new file mode 100644
index 0000000000..6b9b66c6ef
--- /dev/null
+++ b/modules/stock_consignment/locale/nl.po
@@ -0,0 +1,17 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "Consignatie Relatie"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr "Consignatie factuur regels"
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
+"De relatie waar aan wordt gefactureerd wanneer de consignatie voorraad wordt"
+" gebruikt."
diff --git a/modules/stock_consignment/locale/pl.po b/modules/stock_consignment/locale/pl.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/pl.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/pt.po b/modules/stock_consignment/locale/pt.po
new file mode 100644
index 0000000000..f9b2d0f7a6
--- /dev/null
+++ b/modules/stock_consignment/locale/pt.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "Consignação da Pessoa"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr "A pessoa a faturar quando se utiliza a movimentação de consignação."
diff --git a/modules/stock_consignment/locale/ro.po b/modules/stock_consignment/locale/ro.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/ro.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/ru.po b/modules/stock_consignment/locale/ru.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/ru.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/sl.po b/modules/stock_consignment/locale/sl.po
new file mode 100644
index 0000000000..7cf1520c32
--- /dev/null
+++ b/modules/stock_consignment/locale/sl.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "Kosignacijski partner"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr "V primeru kosignacijske zaloge se zaračuna kosignacijskemu partnerju."
diff --git a/modules/stock_consignment/locale/tr.po b/modules/stock_consignment/locale/tr.po
new file mode 100644
index 0000000000..8265917f37
--- /dev/null
+++ b/modules/stock_consignment/locale/tr.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr "Gönderilen Mal Partisi"
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr "Gönderilen mal stoğu kullanıldığı zaman faturalandırılan parti."
diff --git a/modules/stock_consignment/locale/uk.po b/modules/stock_consignment/locale/uk.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/uk.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/locale/zh_CN.po b/modules/stock_consignment/locale/zh_CN.po
new file mode 100644
index 0000000000..3e843f9738
--- /dev/null
+++ b/modules/stock_consignment/locale/zh_CN.po
@@ -0,0 +1,15 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,consignment_party:"
+msgid "Consignment Party"
+msgstr ""
+
+msgctxt "field:stock.move,consignment_invoice_lines:"
+msgid "Consignment Invoice Lines"
+msgstr ""
+
+msgctxt "help:stock.location,consignment_party:"
+msgid "The party invoiced when consignment stock is used."
+msgstr ""
diff --git a/modules/stock_consignment/setup.py b/modules/stock_consignment/setup.py
new file mode 100755
index 0000000000..64b424bfb9
--- /dev/null
+++ b/modules/stock_consignment/setup.py
@@ -0,0 +1,152 @@
+#!/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 find_packages, setup
+
+
+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_stock_consignment'
+
+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_stock_supply')]
+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 consignment stock',
+ 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/stock_consignment',
+ },
+ keywords='tryton stock consignment',
+ package_dir={'trytond.modules.stock_consignment': '.'},
+ packages=(
+ ['trytond.modules.stock_consignment']
+ + ['trytond.modules.stock_consignment.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_consignment': (info.get('xml', [])
+ + ['tryton.cfg', 'view/*.xml', 'locale/*.po', '*.odt',
+ '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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_consignment = trytond.modules.stock_consignment
+ """,
+ )
diff --git a/modules/stock_consignment/stock.py b/modules/stock_consignment/stock.py
new file mode 100644
index 0000000000..7d1d9eeb6a
--- /dev/null
+++ b/modules/stock_consignment/stock.py
@@ -0,0 +1,318 @@
+# 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.model import ModelView, Workflow, fields
+from trytond.modules.product import round_price
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Eval
+from trytond.transaction import Transaction
+
+
+class Location(metaclass=PoolMeta):
+ __name__ = 'stock.location'
+
+ consignment_party = fields.Many2One(
+ 'party.party', "Consignment Party",
+ states={
+ 'invisible': ~Eval('type').in_(['supplier', 'storage']),
+ },
+ help="The party invoiced when consignment stock is used.")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.lost_found_location.states['invisible'] &= (
+ ~Eval('type').in_(['supplier', 'customer']))
+
+ @classmethod
+ def _parent_domain(cls):
+ domain = super(Location, cls)._parent_domain()
+ domain['supplier'].append('storage')
+ domain['storage'].append('customer')
+ return domain
+
+ @property
+ def lost_found_used(self):
+ lost_found = super().lost_found_used
+ if not lost_found and not self.warehouse and self.type == 'storage':
+ location = self.parent
+ while location:
+ if location.type in {'supplier', 'storage'}:
+ lost_found = location.lost_found_location
+ break
+ location = location.parent
+ return lost_found
+
+
+class LocationLeadTime(metaclass=PoolMeta):
+ __name__ = 'stock.location.lead_time'
+
+ @classmethod
+ def __setup__(cls):
+ super(LocationLeadTime, cls).__setup__()
+ cls.warehouse_to.domain = ['OR',
+ cls.warehouse_to.domain,
+ ('type', '=', 'storage'),
+ ]
+
+
+def set_origin_consignment(func):
+ @wraps(func)
+ def wrapper(cls, moves):
+ pool = Pool()
+ InvoiceLine = pool.get('account.invoice.line')
+ to_save = []
+ move2line = {}
+ for move in moves:
+ if not move.consignment_invoice_lines:
+ lines = move.get_invoice_lines_consignment()
+ if lines:
+ to_save.extend(lines)
+ move2line[move] = lines[0]
+ if to_save:
+ InvoiceLine.save(to_save)
+ for move, line in move2line.items():
+ if not move.origin:
+ move.origin = line
+ if move.unit_price is None:
+ move.unit_price = line.unit_price
+ move.currency = line.currency
+ cls.save(list(move2line.keys()))
+ return func(cls, moves)
+ return wrapper
+
+
+def unset_origin_consignment(func):
+ @wraps(func)
+ def wrapper(cls, moves):
+ pool = Pool()
+ InvoiceLine = pool.get('account.invoice.line')
+ lines, to_save = [], []
+ for move in moves:
+ for invoice_line in move.consignment_invoice_lines:
+ lines.append(invoice_line)
+ if move.origin == move:
+ move.origin = None
+ to_save.append(move)
+ if lines:
+ InvoiceLine.delete(lines)
+ cls.save(to_save)
+ return func(cls, moves)
+ return wrapper
+
+
+class Move(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+
+ consignment_invoice_lines = fields.One2Many(
+ 'account.invoice.line', 'origin', "Consignment Invoice Lines",
+ readonly=True,
+ states={
+ 'invisible': ~Eval('consignment_invoice_lines'),
+ })
+
+ @fields.depends('state', 'from_location', 'to_location')
+ def on_change_with_unit_price_required(self, name=None):
+ required = super().on_change_with_unit_price_required(name)
+ if (required
+ and self.state in {'staging', 'draft'}
+ and self.from_location
+ and self.to_location
+ and ((
+ self.from_location.type == 'supplier'
+ and self.to_location.type in {
+ 'storage', 'production', 'customer'})
+ or (self.from_location.type in {
+ 'storage', 'production', 'supplier'}
+ and self.to_location.type == 'customer'))
+ and self.from_location.consignment_party):
+ required = False
+ return required
+
+ @classmethod
+ def _get_origin(cls):
+ return super(Move, cls)._get_origin() + ['account.invoice.line']
+
+ @fields.depends('from_location')
+ def on_change_with_assignation_required(self, name=None):
+ required = super(Move, self).on_change_with_assignation_required(
+ name=name)
+ if self.from_location:
+ if (self.from_location.type == 'supplier'
+ and self.from_location.warehouse):
+ required = True
+ return required
+
+ def get_invoice_lines_consignment(self):
+ lines = []
+ if (self.from_location.type == 'supplier'
+ and self.to_location.type in {
+ 'storage', 'production', 'customer'}
+ and self.from_location.consignment_party):
+ lines.append(self._get_supplier_invoice_line_consignment())
+ if (self.from_location.type in {'storage', 'production', 'supplier'}
+ and self.to_location.type == 'customer'
+ and self.from_location.consignment_party):
+ lines.append(self._get_customer_invoice_line_consignment())
+ return lines
+
+ def _get_supplier_invoice_line_consignment(self):
+ pool = Pool()
+ InvoiceLine = pool.get('account.invoice.line')
+ Product = pool.get('product.product')
+ ProductSupplier = pool.get('purchase.product_supplier')
+
+ with Transaction().set_context(
+ supplier=self.from_location.consignment_party.id):
+ pattern = ProductSupplier.get_pattern()
+ for product_supplier in self.product.product_suppliers_used(**pattern):
+ currency = product_supplier.currency
+ break
+ else:
+ currency = self.company.currency
+
+ line = InvoiceLine()
+ line.invoice_type = 'in'
+ line.type = 'line'
+ line.company = self.company
+ line.party = self.from_location.consignment_party
+ line.currency = currency
+ line.product = self.product
+ line.quantity = self.quantity
+ line.unit = self.uom
+ line.stock_moves = [self]
+ line.origin = self
+ line.on_change_product()
+
+ with Transaction().set_context(
+ currency=line.currency.id,
+ supplier=line.party.id,
+ uom=line.unit,
+ taxes=[t.id for t in line.taxes]):
+ line.unit_price = Product.get_purchase_price(
+ [line.product], line.quantity)[line.product.id]
+ if line.unit_price is not None:
+ line.unit_price = round_price(line.unit_price)
+ return line
+
+ def _get_customer_invoice_line_consignment(self):
+ pool = Pool()
+ InvoiceLine = pool.get('account.invoice.line')
+ Product = pool.get('product.product')
+
+ line = InvoiceLine()
+ line.invoice_type = 'out'
+ line.type = 'line'
+ line.company = self.company
+ line.party = self.from_location.consignment_party
+ line.currency = self.company.currency
+ line.product = self.product
+ line.quantity = self.quantity
+ line.unit = self.uom
+ line.stock_moves = [self]
+ line.origin = self
+ line.on_change_product()
+
+ with Transaction().set_context(
+ currency=line.currency.id,
+ customer=line.party.id,
+ uom=line.unit,
+ taxes=[t.id for t in line.taxes]):
+ line.unit_price = Product.get_sale_price(
+ [line.product], line.quantity)[line.product.id]
+ if line.unit_price is not None:
+ line.unit_price = round_price(line.unit_price)
+ return line
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ @unset_origin_consignment
+ def draft(cls, moves):
+ super(Move, cls).draft(moves)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('assigned')
+ @set_origin_consignment
+ def assign(cls, moves):
+ super(Move, cls).assign(moves)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @set_origin_consignment
+ def do(cls, moves):
+ super(Move, cls).do(moves)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ @unset_origin_consignment
+ def cancel(cls, moves):
+ super(Move, cls).cancel(moves)
+
+ @classmethod
+ def copy(cls, moves, default=None):
+ pool = Pool()
+ InvoiceLine = pool.get('account.invoice.line')
+ moves = super(Move, cls).copy(moves, default=default)
+ if not Transaction().context.get('_stock_move_split'):
+ to_save = []
+ for move in moves:
+ if isinstance(move.origin, InvoiceLine):
+ move.origin = None
+ to_save.append(move)
+ if to_save:
+ cls.save(to_save)
+ return moves
+
+
+class ShipmentInternal(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.internal'
+
+ @classmethod
+ def __setup__(cls):
+ super(ShipmentInternal, cls).__setup__()
+ cls.from_location.domain = ['OR',
+ cls.from_location.domain,
+ ('type', '=', 'supplier'),
+ ]
+ cls.to_location.domain = ['OR',
+ cls.to_location.domain,
+ ('type', 'in', ['supplier', 'customer']),
+ ]
+
+ @fields.depends('to_location')
+ def on_change_with_planned_start_date(self, pattern=None):
+ if pattern is None:
+ pattern = {}
+ if self.to_location and not self.to_location.warehouse:
+ pattern.setdefault('location_to', self.to_location.id)
+ return super(ShipmentInternal, self).on_change_with_planned_start_date(
+ pattern=pattern)
+
+
+class Inventory(metaclass=PoolMeta):
+ __name__ = 'stock.inventory'
+
+ @classmethod
+ def __setup__(cls):
+ super(Inventory, cls).__setup__()
+ cls.location.domain = ['OR',
+ cls.location.domain,
+ ('type', '=', 'supplier'),
+ ]
+
+
+class OrderPoint(metaclass=PoolMeta):
+ __name__ = 'stock.order_point'
+
+ @classmethod
+ def __setup__(cls):
+ super(OrderPoint, cls).__setup__()
+ cls.provisioning_location.domain = ['OR',
+ cls.provisioning_location.domain,
+ ('type', '=', 'supplier'),
+ ]
diff --git a/modules/stock_consignment/stock.xml b/modules/stock_consignment/stock.xml
new file mode 100644
index 0000000000..4ebdbcc5c4
--- /dev/null
+++ b/modules/stock_consignment/stock.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ stock.location
+
+ location_form
+
+
+
+ stock.move
+
+ stock_move_form
+
+
+
diff --git a/modules/stock_consignment/tests/__init__.py b/modules/stock_consignment/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_consignment/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_consignment/tests/scenario_stock_consignment.rst b/modules/stock_consignment/tests/scenario_stock_consignment.rst
new file mode 100644
index 0000000000..b70c8f61a9
--- /dev/null
+++ b/modules/stock_consignment/tests/scenario_stock_consignment.rst
@@ -0,0 +1,282 @@
+==========================
+Stock Consignment 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, create_tax
+
+Activate modules::
+
+ >>> config = activate_modules('stock_consignment')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+ >>> revenue = accounts['revenue']
+ >>> expense = accounts['expense']
+
+Create tax::
+
+ >>> supplier_tax = create_tax(Decimal('.10'))
+ >>> supplier_tax.save()
+ >>> customer_tax = create_tax(Decimal('.10'))
+ >>> customer_tax.save()
+
+Create parties::
+
+ >>> Party = Model.get('party.party')
+ >>> supplier = Party(name='Supplier')
+ >>> supplier.save()
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+
+Create supplier consignment location::
+
+ >>> supplier_consignment_loc = Location()
+ >>> supplier_consignment_loc.name = "Supplier Consignment"
+ >>> supplier_consignment_loc.type = 'supplier'
+ >>> supplier_consignment_loc.parent = storage_loc
+ >>> supplier_consignment_loc.consignment_party = supplier
+ >>> supplier_consignment_loc.save()
+
+Create customer consignment location::
+
+ >>> customer_consignment_loc = Location()
+ >>> customer_consignment_loc.name = "Customer Consignment"
+ >>> customer_consignment_loc.type = 'storage'
+ >>> customer_consignment_loc.parent = customer_loc
+ >>> customer_consignment_loc.consignment_party = customer
+ >>> customer_consignment_loc.save()
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_expense = expense
+ >>> account_category.account_revenue = revenue
+ >>> account_category.supplier_taxes.append(supplier_tax)
+ >>> account_category.customer_taxes.append(customer_tax)
+ >>> account_category.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Product = Model.get('product.product')
+ >>> product = Product()
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.purchasable = True
+ >>> template.salable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> product_supplier = template.product_suppliers.new()
+ >>> product_supplier.party = supplier
+ >>> price = product_supplier.prices.new()
+ >>> price.quantity = 2
+ >>> price.unit_price = Decimal('4')
+ >>> template.save()
+ >>> product.template = template
+ >>> product.save()
+
+Fill supplier consignment location::
+
+ >>> Shipment = Model.get('stock.shipment.internal')
+ >>> shipment = Shipment()
+ >>> shipment.from_location = supplier_loc
+ >>> shipment.to_location = supplier_consignment_loc
+ >>> move = shipment.moves.new()
+ >>> move.product = product
+ >>> move.quantity = 10
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = supplier_consignment_loc
+ >>> shipment.click('wait')
+ >>> shipment.state
+ 'waiting'
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.state
+ 'assigned'
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+
+Use supplier consignment stock::
+
+ >>> shipment = Shipment()
+ >>> shipment.from_location = supplier_consignment_loc
+ >>> shipment.to_location = storage_loc
+ >>> move = shipment.moves.new()
+ >>> move.product = product
+ >>> move.quantity = 4
+ >>> move.from_location = supplier_consignment_loc
+ >>> move.to_location = storage_loc
+ >>> shipment.click('wait')
+ >>> shipment.state
+ 'waiting'
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.state
+ 'assigned'
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+
+Check supplier invoice line::
+
+ >>> InvoiceLine = Model.get('account.invoice.line')
+ >>> invoice_line, = InvoiceLine.find([('invoice_type', '=', 'in')])
+ >>> invoice_line.product == product
+ True
+ >>> invoice_line.quantity
+ 4.0
+ >>> invoice_line.unit == unit
+ True
+ >>> invoice_line.unit_price
+ Decimal('4.0000')
+ >>> invoice_line.taxes == [supplier_tax]
+ True
+ >>> move, = shipment.moves
+ >>> move.origin == invoice_line
+ True
+
+Use supplier consignment stock for shipment out::
+
+ >>> ShipmentOut = Model.get('stock.shipment.out')
+ >>> shipment_out = ShipmentOut()
+ >>> shipment_out.customer = customer
+ >>> shipment_out.warehouse = warehouse_loc
+ >>> move = shipment_out.outgoing_moves.new()
+ >>> move.product = product
+ >>> move.quantity = 3
+ >>> move.unit_price = Decimal('10')
+ >>> move.currency = company.currency
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> shipment_out.click('wait')
+ >>> move, = shipment_out.inventory_moves
+ >>> move.from_location = supplier_consignment_loc
+ >>> shipment_out.click('assign_try')
+ True
+ >>> move, = shipment_out.inventory_moves
+ >>> len(move.invoice_lines)
+ 1
+
+Fill customer consignment location::
+
+ >>> shipment = Shipment()
+ >>> shipment.from_location = storage_loc
+ >>> shipment.to_location = customer_consignment_loc
+ >>> move = shipment.moves.new()
+ >>> move.product = product
+ >>> move.quantity = 3
+ >>> move.from_location = storage_loc
+ >>> move.to_location = customer_consignment_loc
+ >>> shipment.click('wait')
+ >>> shipment.state
+ 'waiting'
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.state
+ 'assigned'
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+
+Use customer consignment stock::
+
+ >>> shipment = Shipment()
+ >>> shipment.from_location = customer_consignment_loc
+ >>> shipment.to_location = customer_loc
+ >>> move = shipment.moves.new()
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.from_location = customer_consignment_loc
+ >>> move.to_location = customer_loc
+ >>> shipment.click('wait')
+ >>> shipment.state
+ 'waiting'
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.state
+ 'assigned'
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+
+Check customer invoice line::
+
+ >>> invoice_line, = InvoiceLine.find([('invoice_type', '=', 'out')])
+ >>> invoice_line.product == product
+ True
+ >>> invoice_line.quantity
+ 1.0
+ >>> invoice_line.unit == unit
+ True
+ >>> invoice_line.unit_price
+ Decimal('10.0000')
+ >>> invoice_line.taxes == [customer_tax]
+ True
+ >>> move, = shipment.moves
+ >>> move.origin == invoice_line
+ True
+
+Duplicate shipment clear origin::
+
+ >>> duplicate, = shipment.duplicate()
+ >>> move, = duplicate.moves
+ >>> move.origin
+
+Cancel supplier consignment stock::
+
+ >>> shipment = Shipment()
+ >>> shipment.from_location = supplier_consignment_loc
+ >>> shipment.to_location = storage_loc
+ >>> move = shipment.moves.new()
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.from_location = supplier_consignment_loc
+ >>> move.to_location = storage_loc
+ >>> shipment.click('wait')
+ >>> shipment.state
+ 'waiting'
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.state
+ 'assigned'
+ >>> move, = shipment.moves
+ >>> bool(move.origin)
+ True
+ >>> shipment.click('cancel')
+ >>> shipment.state
+ 'cancelled'
+ >>> move, = shipment.moves
+ >>> bool(move.origin)
+ False
diff --git a/modules/stock_consignment/tests/scenario_stock_consignment_supplier_customer.rst b/modules/stock_consignment/tests/scenario_stock_consignment_supplier_customer.rst
new file mode 100644
index 0000000000..f6b4abc3bf
--- /dev/null
+++ b/modules/stock_consignment/tests/scenario_stock_consignment_supplier_customer.rst
@@ -0,0 +1,175 @@
+===============================================
+Stock Consignment Supplier to Customer 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, create_tax
+
+Activate modules::
+
+ >>> config = activate_modules('stock_consignment')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create chart of accounts::
+
+ >>> _ = create_chart(company)
+ >>> accounts = get_accounts(company)
+ >>> revenue = accounts['revenue']
+ >>> expense = accounts['expense']
+
+Create parties::
+
+ >>> Party = Model.get('party.party')
+ >>> supplier = Party(name='Supplier')
+ >>> supplier.save()
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+
+Create customer consignment location::
+
+ >>> customer_consignment_loc = Location()
+ >>> customer_consignment_loc.name = "Customer Consignment"
+ >>> customer_consignment_loc.type = 'storage'
+ >>> customer_consignment_loc.parent = customer_loc
+ >>> customer_consignment_loc.consignment_party = customer
+ >>> customer_consignment_loc.save()
+
+Create supplier consignment location under customer consignment location::
+
+ >>> supplier_consignment_loc = Location()
+ >>> supplier_consignment_loc.name = "Supplier Consignment"
+ >>> supplier_consignment_loc.type = 'supplier'
+ >>> supplier_consignment_loc.parent = customer_consignment_loc
+ >>> supplier_consignment_loc.consignment_party = supplier
+ >>> supplier_consignment_loc.save()
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_expense = expense
+ >>> account_category.account_revenue = revenue
+ >>> account_category.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> ProductTemplate = Model.get('product.template')
+ >>> Product = Model.get('product.product')
+ >>> product = Product()
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.purchasable = True
+ >>> template.salable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> product_supplier = template.product_suppliers.new()
+ >>> product_supplier.party = supplier
+ >>> price = product_supplier.prices.new()
+ >>> price.quantity = 1
+ >>> price.unit_price = Decimal('4')
+ >>> template.save()
+ >>> product.template = template
+ >>> product.save()
+
+Fill supplier consignment location::
+
+ >>> Shipment = Model.get('stock.shipment.internal')
+ >>> shipment = Shipment()
+ >>> shipment.from_location = supplier_loc
+ >>> shipment.to_location = supplier_consignment_loc
+ >>> move = shipment.moves.new()
+ >>> move.product = product
+ >>> move.quantity = 10
+ >>> move.from_location = supplier_loc
+ >>> move.to_location = supplier_consignment_loc
+ >>> shipment.click('wait')
+ >>> shipment.state
+ 'waiting'
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.state
+ 'assigned'
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+
+Use supplier consignment stock by customer::
+
+ >>> shipment = Shipment()
+ >>> shipment.from_location = supplier_consignment_loc
+ >>> shipment.to_location = customer_loc
+ >>> move = shipment.moves.new()
+ >>> move.product = product
+ >>> move.quantity = 4
+ >>> move.from_location = supplier_consignment_loc
+ >>> move.to_location = customer_loc
+ >>> shipment.click('wait')
+ >>> shipment.state
+ 'waiting'
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.state
+ 'assigned'
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+ >>> move, = shipment.moves
+ >>> len(move.invoice_lines)
+ 2
+ >>> move.origin in move.invoice_lines
+ True
+
+Check supplier invoice line::
+
+ >>> InvoiceLine = Model.get('account.invoice.line')
+ >>> invoice_line, = InvoiceLine.find([('invoice_type', '=', 'in')])
+ >>> invoice_line.product == product
+ True
+ >>> invoice_line.quantity
+ 4.0
+ >>> invoice_line.unit == unit
+ True
+ >>> invoice_line.unit_price
+ Decimal('4.0000')
+ >>> invoice_line.origin == move
+ True
+
+Check customer invoice line::
+
+ >>> invoice_line, = InvoiceLine.find([('invoice_type', '=', 'out')])
+ >>> invoice_line.product == product
+ True
+ >>> invoice_line.quantity
+ 4.0
+ >>> invoice_line.unit == unit
+ True
+ >>> invoice_line.unit_price
+ Decimal('10.0000')
+ >>> invoice_line.origin == move
+ True
diff --git a/modules/stock_consignment/tests/test_module.py b/modules/stock_consignment/tests/test_module.py
new file mode 100644
index 0000000000..6f3f189da7
--- /dev/null
+++ b/modules/stock_consignment/tests/test_module.py
@@ -0,0 +1,13 @@
+# 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.tests.test_tryton import ModuleTestCase
+
+
+class StockConsignmentTestCase(ModuleTestCase):
+ 'Test Stock Consignment module'
+ module = 'stock_consignment'
+ extras = ['stock_supply']
+
+
+del ModuleTestCase
diff --git a/modules/stock_consignment/tests/test_scenario.py b/modules/stock_consignment/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/stock_consignment/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock_consignment/tox.ini b/modules/stock_consignment/tox.ini
new file mode 100644
index 0000000000..367270265c
--- /dev/null
+++ b/modules/stock_consignment/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_consignment/* -m unittest discover -s tests
+ coverage report --include=./**/stock_consignment/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_consignment/tryton.cfg b/modules/stock_consignment/tryton.cfg
new file mode 100644
index 0000000000..b1890f0565
--- /dev/null
+++ b/modules/stock_consignment/tryton.cfg
@@ -0,0 +1,15 @@
+[tryton]
+version=6.7.0
+depends:
+ account_invoice
+ account_invoice_line_standalone
+ account_invoice_stock
+ ir
+ product
+ purchase
+ sale
+ stock
+extras_depend:
+ stock_supply
+xml:
+ stock.xml
diff --git a/modules/stock_consignment/view/location_form.xml b/modules/stock_consignment/view/location_form.xml
new file mode 100644
index 0000000000..df8a5024ff
--- /dev/null
+++ b/modules/stock_consignment/view/location_form.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_consignment/view/stock_move_form.xml b/modules/stock_consignment/view/stock_move_form.xml
new file mode 100644
index 0000000000..cd936b9796
--- /dev/null
+++ b/modules/stock_consignment/view/stock_move_form.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_forecast/.drone.yml b/modules/stock_forecast/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/stock_forecast/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_forecast/.flake8 b/modules/stock_forecast/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_forecast/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_forecast/.isort.cfg b/modules/stock_forecast/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_forecast/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_forecast/CHANGELOG b/modules/stock_forecast/CHANGELOG
new file mode 100644
index 0000000000..26cff50ad5
--- /dev/null
+++ b/modules/stock_forecast/CHANGELOG
@@ -0,0 +1,98 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-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
+* Rename forecast state from cancel to cancelled
+
+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)
+* Manage readonly state on Forecast Line
+
+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
+* Deactivate forecast with passed period
+
+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)
+* Forecast creates draft moves only on demand
+* Forecast works at warehouse level
+* Allow 'production' as destination
+
+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-12
+* Bug fixes (see mercurial logs for details)
+* Add default search value on forecast
+* Remove egenix-mx-base and replace it by python-dateutil
+
+Version 1.4.0 - 2009-10-19
+* Bug fixes (see mercurial logs for details)
+
+Version 1.2.0 - 2009-08-10
+* Initial release
diff --git a/modules/stock_forecast/COPYRIGHT b/modules/stock_forecast/COPYRIGHT
new file mode 100644
index 0000000000..85e100bbec
--- /dev/null
+++ b/modules/stock_forecast/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2008-2022 Cédric Krier.
+Copyright (C) 2008-2013 Bertrand Chenal.
+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/stock_forecast/LICENSE b/modules/stock_forecast/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_forecast/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/stock_forecast/MANIFEST.in b/modules/stock_forecast/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_forecast/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_forecast/README.rst b/modules/stock_forecast/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_forecast/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_forecast/__init__.py b/modules/stock_forecast/__init__.py
new file mode 100644
index 0000000000..a12316a285
--- /dev/null
+++ b/modules/stock_forecast/__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 forecast
+
+
+def register():
+ Pool.register(
+ forecast.Forecast,
+ forecast.ForecastLine,
+ forecast.ForecastLineMove,
+ forecast.ForecastCompleteAsk,
+ forecast.ForecastCompleteChoose,
+ module='stock_forecast', type_='model')
+ Pool.register(
+ forecast.ForecastComplete,
+ module='stock_forecast', type_='wizard')
diff --git a/modules/stock_forecast/doc/index.rst b/modules/stock_forecast/doc/index.rst
new file mode 100644
index 0000000000..3a6c4bcdd7
--- /dev/null
+++ b/modules/stock_forecast/doc/index.rst
@@ -0,0 +1,52 @@
+Stock Forecast Module
+#####################
+
+The stock forecast module provide a simple way to create stock moves
+toward customers with a date in the future. This allow other stock
+mecanism to anticipate customer demand.
+
+
+Forecast
+********
+
+The forecast form contains:
+
+ - A location from which the products will leave.
+ - A destination (which is a customer location).
+ - Two dates defining a period in the future.
+ - A company
+ - A list of forcast lines with:
+
+ - A product
+ - A quantity which represent the total demand for the period
+ - A minimal quantity for each move.
+ - A unit of measure.
+
+The "Complete Forecast" button allow to auto-complete forecast lines
+based on previous stock output for dates in the past.
+
+The forecasts are deactivated automatically when their period has passed.
+
+
+Forecast States
+^^^^^^^^^^^^^^^
+
+Draft
+
+ It is the initial state and the state used for edition. No moves are
+ linked to the forecast lines
+
+Done
+
+ Once in state done, moves are created for each forecast line:
+
+ - They are spread homogeneously between the two dates of the
+ forecast.
+
+ - Move quantities are bigger or equal to the minimal quantity set
+ on the forecast line.
+
+Cancelled
+
+ On a cancelled forecast all existing moves are cancelled and the form
+ is readonly.
diff --git a/modules/stock_forecast/exceptions.py b/modules/stock_forecast/exceptions.py
new file mode 100644
index 0000000000..82c4646c45
--- /dev/null
+++ b/modules/stock_forecast/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 ForecastValidationError(ValidationError):
+ pass
diff --git a/modules/stock_forecast/forecast.py b/modules/stock_forecast/forecast.py
new file mode 100644
index 0000000000..095b68b6b9
--- /dev/null
+++ b/modules/stock_forecast/forecast.py
@@ -0,0 +1,628 @@
+# 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 itertools
+
+from dateutil.relativedelta import relativedelta
+from sql import Null
+from sql.aggregate import Sum
+from sql.conditionals import Coalesce
+
+from trytond.i18n import gettext
+from trytond.model import Index, ModelSQL, ModelView, Unique, Workflow, fields
+from trytond.model.exceptions import AccessError
+from trytond.pool import Pool
+from trytond.pyson import Bool, Equal, Eval, If, Not, Or
+from trytond.tools import grouped_slice, reduce_ids
+from trytond.transaction import Transaction
+from trytond.wizard import Button, StateTransition, StateView, Wizard
+
+from .exceptions import ForecastValidationError
+
+
+class Forecast(Workflow, ModelSQL, ModelView):
+ "Stock Forecast"
+ __name__ = "stock.forecast"
+
+ _states = {
+ 'readonly': Not(Equal(Eval('state'), 'draft')),
+ }
+
+ warehouse = fields.Many2One(
+ 'stock.location', 'Location', required=True,
+ domain=[('type', '=', 'warehouse')], states={
+ 'readonly': Or(Not(Equal(Eval('state'), 'draft')),
+ Bool(Eval('lines', [0]))),
+ })
+ destination = fields.Many2One(
+ 'stock.location', 'Destination', required=True,
+ domain=[('type', 'in', ['customer', 'production'])], states=_states)
+ from_date = fields.Date(
+ "From Date", required=True,
+ domain=[('from_date', '<=', Eval('to_date'))],
+ states=_states)
+ to_date = fields.Date(
+ "To Date", required=True,
+ domain=[('to_date', '>=', Eval('from_date'))],
+ states=_states)
+ lines = fields.One2Many(
+ 'stock.forecast.line', 'forecast', 'Lines', states=_states)
+ company = fields.Many2One(
+ 'company.company', 'Company', required=True, states={
+ 'readonly': Or(Not(Equal(Eval('state'), 'draft')),
+ Bool(Eval('lines', [0]))),
+ })
+ state = fields.Selection([
+ ('draft', "Draft"),
+ ('done', "Done"),
+ ('cancelled', "Cancelled"),
+ ], "State", readonly=True, sort=False)
+ active = fields.Function(fields.Boolean('Active'),
+ 'get_active', searcher='search_active')
+
+ del _states
+
+ @classmethod
+ def __setup__(cls):
+ super(Forecast, cls).__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.add(
+ Index(
+ t,
+ (t.state, Index.Equality()),
+ (t.to_date, Index.Range())))
+ cls.create_date.select = True
+ cls._order.insert(0, ('from_date', 'DESC'))
+ cls._order.insert(1, ('warehouse', 'ASC'))
+ cls._transitions |= set((
+ ('draft', 'done'),
+ ('draft', 'cancelled'),
+ ('done', 'draft'),
+ ('cancelled', 'draft'),
+ ))
+ cls._buttons.update({
+ 'cancel': {
+ 'invisible': Eval('state') != 'draft',
+ 'depends': ['state'],
+ },
+ 'draft': {
+ 'invisible': Eval('state') == 'draft',
+ 'depends': ['state'],
+ },
+ 'confirm': {
+ 'invisible': Eval('state') != 'draft',
+ 'depends': ['state'],
+ },
+ 'complete': {
+ 'readonly': Eval('state') != 'draft',
+ 'depends': ['state'],
+ },
+ })
+ cls._active_field = 'active'
+
+ @classmethod
+ def __register__(cls, module_name):
+ cursor = Transaction().connection.cursor()
+ sql_table = cls.__table__()
+
+ super(Forecast, cls).__register__(module_name)
+
+ table = cls.__table_handler__(module_name)
+
+ # Migration from 5.0: remove check_from_to_date
+ table.drop_constraint('check_from_to_date')
+
+ # Migration from 5.6: rename state cancel to cancelled
+ cursor.execute(*sql_table.update(
+ [sql_table.state], ['cancelled'],
+ where=sql_table.state == 'cancel'))
+
+ @staticmethod
+ def default_state():
+ return 'draft'
+
+ @classmethod
+ def default_destination(cls):
+ Location = Pool().get('stock.location')
+ locations = Location.search(cls.destination.domain)
+ if len(locations) == 1:
+ return locations[0].id
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ def get_active(self, name):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ return self.to_date >= Date.today()
+
+ @classmethod
+ def search_active(cls, name, clause):
+ pool = Pool()
+ Date = pool.get('ir.date')
+
+ today = Date.today()
+ operators = {
+ '=': '>=',
+ '!=': '<',
+ }
+ reverse = {
+ '=': '!=',
+ '!=': '=',
+ }
+ if clause[1] in operators:
+ if clause[2]:
+ return [('to_date', operators[clause[1]], today)]
+ else:
+ return [('to_date', operators[reverse[clause[1]]], today)]
+ else:
+ return []
+
+ def get_rec_name(self, name):
+ return self.warehouse.rec_name
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return [('warehouse.rec_name',) + tuple(clause[1:])]
+
+ @classmethod
+ def validate_fields(cls, forecasts, field_names):
+ super().validate_fields(forecasts, field_names)
+ cls.check_date_overlap(forecasts, field_names)
+
+ @classmethod
+ def check_date_overlap(cls, forecasts, field_names=None):
+ if field_names and not (field_names & {
+ 'from_date', 'to_date',
+ 'warehouse', 'destination',
+ 'company', 'state'}):
+ return
+ transaction = Transaction()
+ connection = transaction.connection
+ cls.lock()
+ table = cls.__table__()
+ cursor = connection.cursor()
+ for forecast in forecasts:
+ if forecast.state != 'done':
+ continue
+ cursor.execute(*table.select(table.id,
+ where=(((table.from_date <= forecast.from_date)
+ & (table.to_date >= forecast.from_date))
+ | ((table.from_date <= forecast.to_date)
+ & (table.to_date >= forecast.to_date))
+ | ((table.from_date >= forecast.from_date)
+ & (table.to_date <= forecast.to_date)))
+ & (table.warehouse == forecast.warehouse.id)
+ & (table.destination == forecast.destination.id)
+ & (table.company == forecast.company.id)
+ & (table.id != forecast.id)))
+ forecast_id = cursor.fetchone()
+ if forecast_id:
+ second = cls(forecast_id[0])
+ raise ForecastValidationError(
+ gettext('stock_forecast.msg_forecast_date_overlap',
+ first=forecast.rec_name,
+ second=second.rec_name))
+
+ @classmethod
+ def delete(cls, forecasts):
+ # Cancel before delete
+ cls.cancel(forecasts)
+ for forecast in forecasts:
+ if forecast.state != 'cancelled':
+ raise AccessError(
+ gettext('stock_forecast.msg_forecast_delete_cancel',
+ forecast=forecast.rec_name))
+ super(Forecast, cls).delete(forecasts)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ def draft(cls, forecasts):
+ pass
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def confirm(cls, forecasts):
+ pass
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, forecasts):
+ pass
+
+ @classmethod
+ @ModelView.button_action('stock_forecast.wizard_forecast_complete')
+ def complete(cls, forecasts):
+ pass
+
+ @staticmethod
+ def create_moves(forecasts):
+ 'Create stock moves for the forecast ids'
+ pool = Pool()
+ Line = pool.get('stock.forecast.line')
+ to_save = []
+ for forecast in forecasts:
+ if forecast.state == 'done':
+ for line in forecast.lines:
+ line.moves += tuple(line.get_moves())
+ to_save.append(line)
+ Line.save(to_save)
+
+ @staticmethod
+ def delete_moves(forecasts):
+ 'Delete stock moves for the forecast ids'
+ Line = Pool().get('stock.forecast.line')
+ Line.delete_moves([l for f in forecasts for l in f.lines])
+
+
+class ForecastLine(ModelSQL, ModelView):
+ 'Stock Forecast Line'
+ __name__ = 'stock.forecast.line'
+ _states = {
+ 'readonly': Eval('forecast_state') != 'draft',
+ }
+
+ product = fields.Many2One('product.product', 'Product', required=True,
+ domain=[
+ ('type', '=', 'goods'),
+ ('consumable', '=', False),
+ ],
+ states=_states)
+ product_uom_category = fields.Function(
+ fields.Many2One('product.uom.category', 'Product Uom Category'),
+ 'on_change_with_product_uom_category')
+ uom = fields.Many2One('product.uom', 'UOM', required=True,
+ domain=[
+ If(Bool(Eval('product_uom_category')),
+ ('category', '=', Eval('product_uom_category')),
+ ('category', '!=', -1)),
+ ],
+ states=_states,
+ depends={'product'})
+ quantity = fields.Float(
+ "Quantity", digits='uom', required=True,
+ domain=[('quantity', '>=', 0)],
+ states=_states)
+ minimal_quantity = fields.Float(
+ "Minimal Qty", digits='uom', required=True,
+ domain=[('minimal_quantity', '<=', Eval('quantity'))],
+ states=_states)
+ moves = fields.Many2Many('stock.forecast.line-stock.move',
+ 'line', 'move', 'Moves', readonly=True)
+ forecast = fields.Many2One(
+ 'stock.forecast', 'Forecast', required=True, ondelete='CASCADE',
+ states={
+ 'readonly': ((Eval('forecast_state') != 'draft')
+ & Bool(Eval('forecast'))),
+ })
+ forecast_state = fields.Function(
+ fields.Selection('get_forecast_states', 'Forecast State'),
+ 'on_change_with_forecast_state')
+ quantity_executed = fields.Function(fields.Float(
+ "Quantity Executed", digits='uom'), 'get_quantity_executed')
+
+ del _states
+
+ @classmethod
+ def __setup__(cls):
+ super(ForecastLine, cls).__setup__()
+ cls.__access__.add('forecast')
+ t = cls.__table__()
+ cls._sql_constraints += [
+ ('forecast_product_uniq', Unique(t, t.forecast, t.product),
+ 'stock_forecast.msg_forecast_line_product_unique'),
+ ]
+
+ @classmethod
+ def __register__(cls, module_name):
+ super().__register__(module_name)
+
+ table_h = cls.__table_handler__(module_name)
+
+ # Migration from 5.0: remove check on quantity
+ table_h.drop_constraint('check_line_qty_pos')
+ table_h.drop_constraint('check_line_minimal_qty')
+
+ @staticmethod
+ def default_minimal_quantity():
+ return 1.0
+
+ @fields.depends('product')
+ def on_change_product(self):
+ if self.product:
+ self.uom = self.product.default_uom
+
+ @fields.depends('product')
+ def on_change_with_product_uom_category(self, name=None):
+ if self.product:
+ return self.product.default_uom_category.id
+
+ @classmethod
+ def get_forecast_states(cls):
+ pool = Pool()
+ Forecast = pool.get('stock.forecast')
+ return Forecast.fields_get(['state'])['state']['selection']
+
+ @fields.depends('forecast', '_parent_forecast.state')
+ def on_change_with_forecast_state(self, name=None):
+ if self.forecast:
+ return self.forecast.state
+
+ 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 get_quantity_executed(cls, lines, name):
+ cursor = Transaction().connection.cursor()
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Location = pool.get('stock.location')
+ Uom = pool.get('product.uom')
+ Forecast = pool.get('stock.forecast')
+ LineMove = pool.get('stock.forecast.line-stock.move')
+
+ move = Move.__table__()
+ location_from = Location.__table__()
+ location_to = Location.__table__()
+ line_move = LineMove.__table__()
+
+ result = dict((x.id, 0) for x in lines)
+
+ def key(line):
+ return line.forecast.id
+ lines.sort(key=key)
+ for forecast_id, lines in itertools.groupby(lines, key):
+ forecast = Forecast(forecast_id)
+ product2line = dict((line.product.id, line) for line in lines)
+ product_ids = product2line.keys()
+ for sub_ids in grouped_slice(product_ids):
+ red_sql = reduce_ids(move.product, sub_ids)
+ cursor.execute(*move.join(location_from,
+ condition=move.from_location == location_from.id
+ ).join(location_to,
+ condition=move.to_location == location_to.id
+ ).join(line_move, 'LEFT',
+ condition=move.id == line_move.move
+ ).select(move.product, Sum(move.internal_quantity),
+ where=red_sql
+ & (location_from.left >= forecast.warehouse.left)
+ & (location_from.right <= forecast.warehouse.right)
+ & (location_to.left >= forecast.destination.left)
+ & (location_to.right <= forecast.destination.right)
+ & (move.state != 'cancelled')
+ & (Coalesce(move.effective_date, move.planned_date)
+ >= forecast.from_date)
+ & (Coalesce(move.effective_date, move.planned_date)
+ <= forecast.to_date)
+ & (line_move.id == Null),
+ group_by=move.product))
+ for product_id, quantity in cursor:
+ line = product2line[product_id]
+ result[line.id] = Uom.compute_qty(line.product.default_uom,
+ quantity, line.uom)
+ return result
+
+ @classmethod
+ def copy(cls, lines, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('moves', None)
+ return super(ForecastLine, cls).copy(lines, default=default)
+
+ def get_moves(self):
+ 'Get stock moves for the forecast line'
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Uom = pool.get('product.uom')
+ Date = pool.get('ir.date')
+
+ assert not self.moves
+
+ today = Date.today()
+ from_date = self.forecast.from_date
+ if from_date < today:
+ from_date = today
+ to_date = self.forecast.to_date
+ if to_date < today:
+ return []
+
+ delta = to_date - from_date
+ delta = delta.days + 1
+ nb_packet = ((self.quantity - self.quantity_executed)
+ // self.minimal_quantity)
+ distribution = self.distribute(delta, nb_packet)
+ unit_price = None
+ if self.forecast.destination.type == 'customer':
+ unit_price = self.product.list_price or 0
+ unit_price = Uom.compute_price(self.product.default_uom,
+ unit_price, self.uom)
+
+ moves = []
+ for day, qty in distribution.items():
+ if qty == 0.0:
+ continue
+ move = Move()
+ move.from_location = self.forecast.warehouse.storage_location
+ move.to_location = self.forecast.destination
+ move.product = self.product
+ move.uom = self.uom
+ move.quantity = qty * self.minimal_quantity
+ move.planned_date = from_date + datetime.timedelta(day)
+ move.company = self.forecast.company
+ move.currency = self.forecast.company.currency
+ move.unit_price = unit_price
+ moves.append(move)
+ return moves
+
+ @classmethod
+ def delete_moves(cls, lines):
+ 'Delete stock moves of the forecast line'
+ Move = Pool().get('stock.move')
+ Move.delete([m for l in lines for m in l.moves])
+
+ def distribute(self, delta, qty):
+ 'Distribute qty over delta'
+ range_delta = list(range(delta))
+ a = {}.fromkeys(range_delta, 0)
+ while qty > 0:
+ if qty > delta:
+ for i in range_delta:
+ a[i] += qty // delta
+ qty = qty % delta
+ elif delta // qty > 1:
+ i = 0
+ while i < qty:
+ a[i * delta // qty + (delta // qty // 2)] += 1
+ i += 1
+ qty = 0
+ else:
+ for i in range_delta:
+ a[i] += 1
+ qty = delta - qty
+ i = 0
+ while i < qty:
+ a[delta - ((i * delta // qty) + (delta // qty // 2)) - 1
+ ] -= 1
+ i += 1
+ qty = 0
+ return a
+
+
+class ForecastLineMove(ModelSQL):
+ 'ForecastLine - Move'
+ __name__ = 'stock.forecast.line-stock.move'
+ _table = 'forecast_line_stock_move_rel'
+ line = fields.Many2One(
+ 'stock.forecast.line', "Forecast Line",
+ ondelete='CASCADE', required=True)
+ move = fields.Many2One(
+ 'stock.move', "Move", ondelete='CASCADE', required=True)
+
+
+class ForecastCompleteAsk(ModelView):
+ 'Complete Forecast'
+ __name__ = 'stock.forecast.complete.ask'
+ from_date = fields.Date(
+ "From Date", required=True,
+ domain=[('from_date', '<', Eval('to_date'))])
+ to_date = fields.Date(
+ "To Date", required=True,
+ domain=[('to_date', '>', Eval('from_date'))])
+
+
+class ForecastCompleteChoose(ModelView):
+ 'Complete Forecast'
+ __name__ = 'stock.forecast.complete.choose'
+ products = fields.Many2Many(
+ 'product.product', None, None, "Products",
+ domain=[
+ ('type', '=', 'goods'),
+ ('consumable', '=', False),
+ ])
+
+
+class ForecastComplete(Wizard):
+ 'Complete Forecast'
+ __name__ = 'stock.forecast.complete'
+ start_state = 'ask'
+ ask = StateView('stock.forecast.complete.ask',
+ 'stock_forecast.forecast_complete_ask_view_form', [
+ Button('Cancel', 'end', 'tryton-cancel'),
+ Button('Choose Products', 'choose', 'tryton-forward'),
+ Button('Complete', 'complete', 'tryton-ok', default=True),
+ ])
+ choose = StateView('stock.forecast.complete.choose',
+ 'stock_forecast.forecast_complete_choose_view_form', [
+ Button('Cancel', 'end', 'tryton-cancel'),
+ Button('Choose Dates', 'ask', 'tryton-back'),
+ Button('Complete', 'complete', 'tryton-ok', default=True),
+ ])
+ complete = StateTransition()
+
+ def default_ask(self, fields):
+ """
+ Forecast dates shifted by one year.
+ """
+ default = {}
+ for field in ("to_date", "from_date"):
+ default[field] = (
+ getattr(self.record, field) - relativedelta(years=1))
+ return default
+
+ def _get_product_quantity(self):
+ pool = Pool()
+ Product = pool.get('product.product')
+
+ with Transaction().set_context(
+ stock_destinations=[self.record.destination.id],
+ stock_date_start=self.ask.from_date,
+ stock_date_end=self.ask.to_date):
+ return Product.products_by_location([self.record.warehouse.id],
+ with_childs=True)
+
+ def default_choose(self, fields):
+ """
+ Collect products for which there is an outgoing stream between
+ the given location and the destination.
+ """
+ if getattr(self.choose, 'products', None):
+ return {'products': [x.id for x in self.choose.products]}
+ pbl = self._get_product_quantity()
+ products = []
+ for (_, product), qty in pbl.items():
+ if qty < 0:
+ products.append(product)
+ return {'products': products}
+
+ def transition_complete(self):
+ pool = Pool()
+ ForecastLine = pool.get('stock.forecast.line')
+ Product = pool.get('product.product')
+
+ forecast = self.record
+ prod2line = {}
+ forecast_lines = ForecastLine.search([
+ ('forecast', '=', forecast.id),
+ ])
+ for forecast_line in forecast_lines:
+ prod2line[forecast_line.product.id] = forecast_line
+
+ pbl = self._get_product_quantity()
+ id2product = {p.id: p for p in Product.browse([x[1] for x in pbl])}
+
+ products = set(getattr(self.choose, 'products', {}))
+
+ to_save = []
+ for key, qty in pbl.items():
+ _, product_id = key
+ product = id2product[product_id]
+ if products and product not in products:
+ continue
+ if product.type != 'goods' or product.consumable:
+ continue
+ if -qty <= 0:
+ continue
+ if product in prod2line:
+ line = prod2line[product]
+ else:
+ line = ForecastLine()
+ line.product = product
+ line.quantity = -qty
+ line.uom = product.default_uom.id
+ line.forecast = forecast
+ line.minimal_quantity = min(1, -qty)
+ to_save.append(line)
+
+ ForecastLine.save(to_save)
+ return 'end'
diff --git a/modules/stock_forecast/forecast.xml b/modules/stock_forecast/forecast.xml
new file mode 100644
index 0000000000..d9372f0876
--- /dev/null
+++ b/modules/stock_forecast/forecast.xml
@@ -0,0 +1,161 @@
+
+
+
+
+
+ Stock Forecast
+
+
+
+
+
+
+
+ Complete Forecast
+ stock.forecast.complete
+ stock.forecast
+
+
+
+ stock.forecast
+ form
+ forecast_form
+
+
+ stock.forecast
+ tree
+ forecast_tree
+
+
+ Forecasts
+ stock.forecast
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Draft
+
+
+
+
+
+ Done
+
+
+
+
+
+ All
+
+
+
+
+
+
+
+ stock.forecast.line
+ form
+ forecast_line_form
+
+
+ stock.forecast.line
+ tree
+ forecast_line_tree
+
+
+
+ stock.forecast.complete.ask
+ form
+ forecast_complete_ask_form
+
+
+ stock.forecast.complete.choose
+ form
+ forecast_complete_choose_form
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cancel
+ Cancel
+
+
+
+
+
+
+
+
+ draft
+ Draft
+
+
+
+
+
+
+
+
+ confirm
+ Confirm
+
+
+
+
+
+
+
+
+ complete
+
+
+
+
+
diff --git a/modules/stock_forecast/locale/bg.po b/modules/stock_forecast/locale/bg.po
new file mode 100644
index 0000000000..68166100e2
--- /dev/null
+++ b/modules/stock_forecast/locale/bg.po
@@ -0,0 +1,222 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Активен"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Местонахождение-цел"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "От дата"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Редове"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Състояние"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "До дата"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "От дата"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "До дата"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Продукти"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Прогноза"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Мин, к-во"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Категория мер. ед. на продукт"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Изпълнено количество"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "Мер. ед."
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Ред от прогноза"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Движение"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Приключено"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Прогноза за наличност"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Изготвяне на прогноза"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Изготвяне на прогноза"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Ред от прогноза за наличност"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Ред от прогноза - Движение"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Отказ"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Приключен"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Проект"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "Добавяне на ред от прогноза въз основа на минали данни"
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Изготвяне на прогноза"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Избот на продукти"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Изпълнен"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Отказ"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Избор на дати"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Пълен"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Отказ"
diff --git a/modules/stock_forecast/locale/ca.po b/modules/stock_forecast/locale/ca.po
new file mode 100644
index 0000000000..039d75c2f9
--- /dev/null
+++ b/modules/stock_forecast/locale/ca.po
@@ -0,0 +1,216 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Actiu"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Destinació"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Des de la data"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Línies"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Fins a la data"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Des de la data"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Fins a la data"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Productes"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Previsió"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr "Estat de la previsió"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Quantitat mínima"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoria UdM del producte"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Quantitats executades"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Línia de previsió"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Moviment"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Previsions"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Previsió completa"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Tot"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Finalitzada"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+"Les previsions \"%(first)s\" i \"%(second)s\" es superposen, heu d'utilitzar"
+" dates diferents."
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr "Per eliminar la previsió \"%(forecast)s\" l'heu de cancel·lar."
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr "El producte ha de ser únic en la previsió d'existències."
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirma"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Previsions"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Previsió d'existències"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Previsió d'existències"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Demanar previsió completa"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Triar previsió completa"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Línia de previsió d'existències"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Línia de previsió - Moviment"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Cancel·lada"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Finalitzada"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Esborrany"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "Afegir línia de previsió sobre la base de dades anteriors."
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Previsió completa"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Selecciona productes"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Completa"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Selecciona dates"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Complet"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
diff --git a/modules/stock_forecast/locale/cs.po b/modules/stock_forecast/locale/cs.po
new file mode 100644
index 0000000000..4be4af4f94
--- /dev/null
+++ b/modules/stock_forecast/locale/cs.po
@@ -0,0 +1,224 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Forecasts"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Done"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancel"
diff --git a/modules/stock_forecast/locale/de.po b/modules/stock_forecast/locale/de.po
new file mode 100644
index 0000000000..1c568b5a0b
--- /dev/null
+++ b/modules/stock_forecast/locale/de.po
@@ -0,0 +1,220 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Aktiv"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Bestimmungsort"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Von Datum"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Positionen"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Bis Datum"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Von Datum"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Bis Datum"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Artikel"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Bedarfsprognose"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr "Prognosestatus"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Minimale Anzahl"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Maßeinheitenkategorie"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Menge ausgeführt"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "Maßeinheit"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Bedarfsprognoseposition"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Warenbewegung"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Bedarfsprognosen"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Bedarfsprognose durchführen"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+"Die Bedarfsprognosen \"%(first)s\" und \"%(second)s\" überschneiden sich. Es"
+" müssen unterschiedliche Daten verwendet werden."
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+"Damit die Bedarfsprognose \"%(forecast)s\" gelöscht werden kann, muss sie "
+"zuerst annulliert werden."
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr "Ein Artikel kann nur einmal pro Bedarfsprognose eingetragen werden."
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Annullieren"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Bestätigen"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Bedarfsprognosen"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Lager Bedarfsprognose"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Lager Bedarfsprognose"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Bedarfsprognose durchführen"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Bedarfsprognose durchführen (Auswahl)"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Bedarfsprognoseposition"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Bedarfsprognoseposition - Warenbewegung"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Annulliert"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Erledigt"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Entwurf"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+"Erstelle Bedarfsprognosepositionen basierend auf den Werten aus der "
+"Vergangenheit."
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Bedarfsprognose durchführen"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Artikel auswählen"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Durchführen"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Auswahl Datum"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Durchführen"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
diff --git a/modules/stock_forecast/locale/es.po b/modules/stock_forecast/locale/es.po
new file mode 100644
index 0000000000..e7fc6464b8
--- /dev/null
+++ b/modules/stock_forecast/locale/es.po
@@ -0,0 +1,216 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Activo"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Destino"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Desde la fecha"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Líneas"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Desde la fecha"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Productos"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Previsión"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr "Estado de la previsión"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Cantidad mínima"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoría UdM del producto"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Cantidades ejecutadas"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Línea de previsión"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Movimiento"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Previsiones"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Previsión completa"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Todo"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Finalizado"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+"Las previsiones \"%(first)s\" y \"%(second)s\" se solapan, debe usar fechas "
+"diferentes."
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr "Para eliminar la previsión \"%(forecast)s\" debe cancelarla."
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr "El producto debe ser único en la previsión de existencias."
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirmar"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Previsiones"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Previsión de existencias"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Previsión de existencias"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Previsión completa"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Elegir previsión completa"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Línea de previsión de existencias"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Línea de previsión - Movimiento"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Cancelada"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Finalizada"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Borrador"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "Añadir línea de previsión en base a datos anteriores."
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Previsión completa"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Seleccionar productos"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Completar"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Seleccionar fechas"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Completar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancelar"
diff --git a/modules/stock_forecast/locale/es_419.po b/modules/stock_forecast/locale/es_419.po
new file mode 100644
index 0000000000..7ce6fb9c81
--- /dev/null
+++ b/modules/stock_forecast/locale/es_419.po
@@ -0,0 +1,217 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoría de UdM de producto"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Cantidad ejecutada"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Cancelar"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancelar"
diff --git a/modules/stock_forecast/locale/et.po b/modules/stock_forecast/locale/et.po
new file mode 100644
index 0000000000..af0f9f7130
--- /dev/null
+++ b/modules/stock_forecast/locale/et.po
@@ -0,0 +1,216 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Aktiivne"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Sihtkoht"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Kuupäevast"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Read"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Kuupäevani"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Asukoht"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Kuupäevast"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Luupäevani"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Tooted"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Prognoos"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr "Prognoosi olek"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Vähim kogus"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Liikumised"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Toote mõõtühiku kategooria"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "Ühik"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Prognoosi rida"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Liikumine"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Prognoosid"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Täielik prognoos"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Kõik"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Kinnita"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Prognoosid"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Laoprognoos"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Laoprognoos"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Täielik prognoos"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Täielik prognoos"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Lao prognoosi rida"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Prognoosirida - kanne"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Tühista"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Tehtud"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Mustand"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Täielik prognoos"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Vali tooted"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Lõpetatud"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Tühista"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Määra kuupäevad"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Lõpetatud"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Tühista"
diff --git a/modules/stock_forecast/locale/fa.po b/modules/stock_forecast/locale/fa.po
new file mode 100644
index 0000000000..1362df7567
--- /dev/null
+++ b/modules/stock_forecast/locale/fa.po
@@ -0,0 +1,217 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "فعال"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "مقصد"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "از تاریخ"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "سطرها"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "وضعیت"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "تا تاریخ"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "مکان"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "از تاریخ"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "تا تاریخ"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "محصولات"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "پیش بینی"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr "وضعیت پیش بینی"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "تعداد حداقل"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "دسته بندی واحد اندازه گیری محصول"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "مقدار حساب شده"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "واحد اندازی گیری"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "سطر پیش بینی"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "جابجایی"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "پیش بینی ها"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "پیش بینی کامل"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "همه"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+"پیش بینی های :\"%(first)s\" و \"%(second)s\" همپوشانی دارند، شما باید از "
+"تاریخ های مختلف استفاده کنید."
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr "برای حذف پیش بینی :\"%(forecast)s\" شما باید آن را لغو کنید."
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr "محصول باید با پیش بینی منحصر به فرد باشد."
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "پیش بینی ها"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "پیش بینی موجودی"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "پیش بینی موجودی"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "پیش بینی کامل"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "پیش بینی کامل"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "سطر پیش بینی موجودی"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "سطر پیش بینی - جابجایی"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "انصراف"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "انجام شد"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "پیشنویس"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "بر اساس داده های گذشته سطر پیش بینی را اضافه کنید."
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "پیش بینی کامل"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "انتخاب محصولات"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "تکمیل"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "انصراف"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "انتخاب تاریخ ها"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "تکمیل"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "انصراف"
diff --git a/modules/stock_forecast/locale/fi.po b/modules/stock_forecast/locale/fi.po
new file mode 100644
index 0000000000..4be4af4f94
--- /dev/null
+++ b/modules/stock_forecast/locale/fi.po
@@ -0,0 +1,224 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Forecasts"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Done"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancel"
diff --git a/modules/stock_forecast/locale/fr.po b/modules/stock_forecast/locale/fr.po
new file mode 100644
index 0000000000..ee775829b7
--- /dev/null
+++ b/modules/stock_forecast/locale/fr.po
@@ -0,0 +1,216 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Actif"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Destination"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Date de début"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Lignes"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Date de fin"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Date de début"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Date de fin"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Produits"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Prévision"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr "État de la prévision"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Qté minimale"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Catégorie d'unité de mesure"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Quantité exécutée"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "UDM"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Ligne de prévision"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Mouvement"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Prévisions"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Compléter la prévision"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Toutes"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Effectuée"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+"Les prévisions « %(first)s » et « %(second)s » se chevauchent, vous devez "
+"utiliser des dates différentes."
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr "Pour supprimer la prévision « %(forecast)s », vous devez l'annuler."
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr "Le produit doit être unique par prévision."
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirmer"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Prévisions"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock prévisionnel"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock prévisionnel"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Completer la prévision - Demander"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Completer la prévision - Choisir"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Ligne de prévision de stock"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Ligne de prévision - Mouvement"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Annulée"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Terminée"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Brouillon"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "Ajouter la ligne des prévisions fondées sur des données historiques."
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Completer la prévision"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Choix des produits"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Compléter"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Annuler"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Choix des dates"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Compléter"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Annuler"
diff --git a/modules/stock_forecast/locale/hu.po b/modules/stock_forecast/locale/hu.po
new file mode 100644
index 0000000000..32be4b4d9f
--- /dev/null
+++ b/modules/stock_forecast/locale/hu.po
@@ -0,0 +1,219 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Aktív"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Cég"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Cél"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Ettől"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Sorok"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Állapot"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Eddig"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Tárhely"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Ettől"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Eddig"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Termékek"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Előrejelzés"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Minimum mennyiség"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Készletmozgások"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Mértékegység kategória"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Mennyiség kész"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "Mértékegység"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Előrejelzés sor"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Tétel"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Előrejelzések"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "összes"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr "Egy variáció csak egyszer írható be ."
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Mégse"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Jóváhagyás"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Előrejelzések"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "érvénytelen"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Kész"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "vázlat"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Mégse"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Mégse"
diff --git a/modules/stock_forecast/locale/id.po b/modules/stock_forecast/locale/id.po
new file mode 100644
index 0000000000..6301ffacaf
--- /dev/null
+++ b/modules/stock_forecast/locale/id.po
@@ -0,0 +1,215 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Aktif"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Dari Tanggal"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Baris"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Ke Tanggal"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Lokasi"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Dari Tanggal"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Ke Tanggal"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "UOM"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Perpindahan"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Konfirmasi"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Rancangan"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Prakiraan"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Batal"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Rancangan"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Batal"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Batal"
diff --git a/modules/stock_forecast/locale/it.po b/modules/stock_forecast/locale/it.po
new file mode 100644
index 0000000000..0329ef59d1
--- /dev/null
+++ b/modules/stock_forecast/locale/it.po
@@ -0,0 +1,235 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Attivo"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Data Inizio"
+
+#, fuzzy
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Righe"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Stato"
+
+#, fuzzy
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "a data"
+
+#, fuzzy
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Luogo"
+
+#, fuzzy
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Data Inizio"
+
+#, fuzzy
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "a data"
+
+#, fuzzy
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Forecasts"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categotia UdM prodotto"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "UdM"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Movimento"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Tutti"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Annulla"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Annullato"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Fatto"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Bozza"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Annulla"
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Scelta date"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Annulla"
diff --git a/modules/stock_forecast/locale/lo.po b/modules/stock_forecast/locale/lo.po
new file mode 100644
index 0000000000..b807682b2c
--- /dev/null
+++ b/modules/stock_forecast/locale/lo.po
@@ -0,0 +1,242 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "ໃຊ້ຢູ່"
+
+#, fuzzy
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "ແຕ່ວັນທີ"
+
+#, fuzzy
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "ຮ່ວງ"
+
+#, fuzzy
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "ສະຖານະ"
+
+#, fuzzy
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "ເຖິງວັນທີ"
+
+#, fuzzy
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "ບ່ອນຢູ່"
+
+#, fuzzy
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "ແຕ່ວັນທີ"
+
+#, fuzzy
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "ເຖິງວັນທີ"
+
+#, fuzzy
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Forecasts"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "ເຄື່ອນໄຫວ"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "ທັງໝົດ"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "ຍົກເລີກ"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "ແລ້ວໆ"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "ຮ່າງກຽມ"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "ຍົກເລີກ"
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "ເລືອກວັນທີ"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "ຍົກເລີກ"
diff --git a/modules/stock_forecast/locale/lt.po b/modules/stock_forecast/locale/lt.po
new file mode 100644
index 0000000000..67687580f2
--- /dev/null
+++ b/modules/stock_forecast/locale/lt.po
@@ -0,0 +1,224 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Forecasts"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Done"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancel"
diff --git a/modules/stock_forecast/locale/nl.po b/modules/stock_forecast/locale/nl.po
new file mode 100644
index 0000000000..4b0fcdbf0b
--- /dev/null
+++ b/modules/stock_forecast/locale/nl.po
@@ -0,0 +1,216 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Actief"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Bestemming"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Vanaf datum"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Regels"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Tot datum"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Plaats"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Vanaf datum"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Tot datum"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Producten"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "prognose"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr "prognose status"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Minimale hoeveelheid"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Mutaties"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Poduct maateenheid categorie"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Uitgevoerde hoeveelheid (verbruikt?)"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "maateenheid"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "prognose lijn"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Mutatie"
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "voorspellingen"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Prognose voltooien"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "Alle"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+"De prognoses\"%(first)s\" en \"%(second)s\" overlappen elkaar. Verschillende"
+" gegevens moeten worden gebruikt."
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr "Om voorspelling \"%(forecast)s\"\" te verwijderen, moet u deze annuleren."
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr "Product moet uniek zijn op basis van prognose."
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Bevestigen"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "prognose"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock prognose"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock prognose"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Prognose voltooien"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Prognose voltooien"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Stock prognose lijn"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Prognose lijn - Mutatie"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Geannuleerd"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Klaar"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Concept"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "prognosesregel toevoegen op basis van gegevens uit het verleden."
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Prognose voltooien"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Kies producten"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Voltooien"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Kies datums"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Voltooien"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Annuleren"
diff --git a/modules/stock_forecast/locale/pl.po b/modules/stock_forecast/locale/pl.po
new file mode 100644
index 0000000000..369a1e901c
--- /dev/null
+++ b/modules/stock_forecast/locale/pl.po
@@ -0,0 +1,227 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Aktywna"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Cel"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Od dnia"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Wiersze"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Stan"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Do dnia"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Lokalizacja"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Od dnia"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Do dnia"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Produkty"
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Forecasts"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Minimalna ilość"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Kategoria jm produktu"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "Jm"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Ruch"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Anuluj"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Wykonano"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Wybierz produkty"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Anuluj"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Wybierz daty"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Anuluj"
diff --git a/modules/stock_forecast/locale/pt.po b/modules/stock_forecast/locale/pt.po
new file mode 100644
index 0000000000..560cf0e21d
--- /dev/null
+++ b/modules/stock_forecast/locale/pt.po
@@ -0,0 +1,223 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Ativo"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Destino"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Data de Início"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Linhas"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Até a Data"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Localização"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Desde a Data"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Até a Data"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Produtos"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Previsão"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr "Estado da Previsão"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Qtd Mínima"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Categoria da UDM do Produto"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Quantidade Executada"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "UM"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Linha de Previsão"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Movimentação"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr "O produto deve ser único por previsão"
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Previsão do Estoque"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Pedir a Previsão Completa"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Escolher a Previsão Completa"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Linha da Previsão de Estoque"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Linha de Previsão - Movimentação"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Cancelar"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Feito"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Rascunho"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "Adicionar linha de previsão com base em dados históricos."
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Completar a Previsão"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Escolher os Produtos"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Completar"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancelar"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Escolher Datas"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Concluída"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancelar"
diff --git a/modules/stock_forecast/locale/ro.po b/modules/stock_forecast/locale/ro.po
new file mode 100644
index 0000000000..157346db17
--- /dev/null
+++ b/modules/stock_forecast/locale/ro.po
@@ -0,0 +1,214 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Rânduri"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_forecast/locale/ru.po b/modules/stock_forecast/locale/ru.po
new file mode 100644
index 0000000000..6533f03399
--- /dev/null
+++ b/modules/stock_forecast/locale/ru.po
@@ -0,0 +1,224 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Действующий"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Организация"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Назначение"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Начальная дата"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Строки"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Состояние"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Конечная дата"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Начальная дата"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Конечная дата"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Продукция"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Прогноз"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Минимальное кол-во"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Продукт"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Категория ед. измерения продукции"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Кол-во выполнено"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "Ед.изм."
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Строка прогноза"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Перемещение"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Выполнено"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr "Продукт должен быть уникальным в пределах прогноза."
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Прогноз по складу"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Завершить прогноз"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Завершить прогноз"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Строка прогноза по складу"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Строка прогноза - Перемещение"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Отменить"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Выполнено"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Черновик"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "Добавить строчку прогноза основанного на предыдущих данных."
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Завершить прогноз"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Выбрать продукты"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Завершить"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Отменить"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Выбрать даты"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Завершить"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Отменить"
diff --git a/modules/stock_forecast/locale/sl.po b/modules/stock_forecast/locale/sl.po
new file mode 100644
index 0000000000..ce0784985a
--- /dev/null
+++ b/modules/stock_forecast/locale/sl.po
@@ -0,0 +1,223 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "Aktivno"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr "Cilj"
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr "Od"
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr "Postavke"
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "Stanje"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr "Do"
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr "Lokacija"
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr "Od"
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr "Do"
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr "Izdelki"
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Napoved"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr "Stanje napovedi"
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr "Minimalna količina"
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr "Katerogija ME izdelka"
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr "Izvedena količina"
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr "ME"
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr "Postavka napovedi"
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr "Promet"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "All"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr "Izdelek mora biti edinstven po napovedih"
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Napoved zaloge"
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Izpolnitev napovedi"
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Izpolnitev napovedi"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr "Postavka napovedi zaloge"
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr "Postavka napovedi - Promet"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Preklic"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Zaključeno"
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "V pripravi"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr "Dodaj postavko napovedi na osnovi preteklih podatkov."
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Izpolnitev napovedi"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr "Izberi izdelke"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr "Zaključi"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Prekliči"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr "Izberi datume"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr "Zaključi"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Prekliči"
diff --git a/modules/stock_forecast/locale/tr.po b/modules/stock_forecast/locale/tr.po
new file mode 100644
index 0000000000..4be4af4f94
--- /dev/null
+++ b/modules/stock_forecast/locale/tr.po
@@ -0,0 +1,224 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Forecasts"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "All"
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "Done"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "Cancel"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "Done"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "Cancel"
diff --git a/modules/stock_forecast/locale/uk.po b/modules/stock_forecast/locale/uk.po
new file mode 100644
index 0000000000..3ae9e34a8c
--- /dev/null
+++ b/modules/stock_forecast/locale/uk.po
@@ -0,0 +1,214 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr ""
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr ""
+
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr ""
+
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr ""
+
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr ""
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_forecast/locale/zh_CN.po b/modules/stock_forecast/locale/zh_CN.po
new file mode 100644
index 0000000000..d9fa91bb98
--- /dev/null
+++ b/modules/stock_forecast/locale/zh_CN.po
@@ -0,0 +1,228 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:stock.forecast,active:"
+msgid "Active"
+msgstr "启用"
+
+msgctxt "field:stock.forecast,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.forecast,destination:"
+msgid "Destination"
+msgstr ""
+
+msgctxt "field:stock.forecast,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,lines:"
+msgid "Lines"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast,state:"
+msgid "State"
+msgstr "状态"
+
+msgctxt "field:stock.forecast,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast,warehouse:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,from_date:"
+msgid "From Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.ask,to_date:"
+msgid "To Date"
+msgstr ""
+
+msgctxt "field:stock.forecast.complete.choose,products:"
+msgid "Products"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.forecast.line,forecast:"
+msgid "Forecast"
+msgstr "Forecasts"
+
+msgctxt "field:stock.forecast.line,forecast_state:"
+msgid "Forecast State"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,minimal_quantity:"
+msgid "Minimal Qty"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,product_uom_category:"
+msgid "Product Uom Category"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,quantity_executed:"
+msgid "Quantity Executed"
+msgstr ""
+
+msgctxt "field:stock.forecast.line,uom:"
+msgid "UOM"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,line:"
+msgid "Forecast Line"
+msgstr ""
+
+msgctxt "field:stock.forecast.line-stock.move,move:"
+msgid "Move"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:ir.action,name:wizard_forecast_complete"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_all"
+msgid "All"
+msgstr "全部"
+
+#, fuzzy
+msgctxt "model:ir.action.act_window.domain,name:act_forecast_form_domain_done"
+msgid "Done"
+msgstr "完成"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_forecast_form_domain_draft"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.message,text:msg_forecast_date_overlap"
+msgid ""
+"The forecasts \"%(first)s\" and \"%(second)s\" overlap, you must use "
+"different dates."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_delete_cancel"
+msgid "To delete forecast \"%(forecast)s\" you must cancel it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_forecast_line_product_unique"
+msgid "Product must be unique by forecast."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:forecast_cancel_button"
+msgid "Cancel"
+msgstr "Cancel"
+
+msgctxt "model:ir.model.button,string:forecast_confirm_button"
+msgid "Confirm"
+msgstr "Confirm"
+
+msgctxt "model:ir.model.button,string:forecast_draft_button"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "model:ir.rule.group,name:rule_group_forecast_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_forecast_form"
+msgid "Forecasts"
+msgstr "Forecasts"
+
+msgctxt "model:res.group,name:group_stock_forecast"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast,name:"
+msgid "Stock Forecast"
+msgstr "Stock Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.ask,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+#, fuzzy
+msgctxt "model:stock.forecast.complete.choose,name:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "model:stock.forecast.line,name:"
+msgid "Stock Forecast Line"
+msgstr ""
+
+msgctxt "model:stock.forecast.line-stock.move,name:"
+msgid "ForecastLine - Move"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Cancelled"
+msgstr "取消"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Done"
+msgstr "完成"
+
+#, fuzzy
+msgctxt "selection:stock.forecast,state:"
+msgid "Draft"
+msgstr "Draft"
+
+msgctxt "view:stock.forecast:"
+msgid "Add forecast line based on past data."
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.forecast:"
+msgid "Complete Forecast"
+msgstr "Complete Forecast"
+
+msgctxt "wizard_button:stock.forecast.complete,ask,choose:"
+msgid "Choose Products"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,ask,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,ask,end:"
+msgid "Cancel"
+msgstr "取消"
+
+msgctxt "wizard_button:stock.forecast.complete,choose,ask:"
+msgid "Choose Dates"
+msgstr ""
+
+msgctxt "wizard_button:stock.forecast.complete,choose,complete:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.forecast.complete,choose,end:"
+msgid "Cancel"
+msgstr "取消"
diff --git a/modules/stock_forecast/message.xml b/modules/stock_forecast/message.xml
new file mode 100644
index 0000000000..e02b4f6b65
--- /dev/null
+++ b/modules/stock_forecast/message.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ The forecasts "%(first)s" and "%(second)s" overlap, you must use different dates.
+
+
+ To delete forecast "%(forecast)s" you must cancel it.
+
+
+ Product must be unique by forecast.
+
+
+
diff --git a/modules/stock_forecast/setup.py b/modules/stock_forecast/setup.py
new file mode 100755
index 0000000000..3079bad279
--- /dev/null
+++ b/modules/stock_forecast/setup.py
@@ -0,0 +1,146 @@
+#!/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 find_packages, setup
+
+
+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_stock_forecast'
+
+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-dateutil', '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 stock forecasts',
+ 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/stock_forecast',
+ },
+ keywords='tryton stock forecast',
+ package_dir={'trytond.modules.stock_forecast': '.'},
+ packages=(
+ ['trytond.modules.stock_forecast']
+ + ['trytond.modules.stock_forecast.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_forecast': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_forecast = trytond.modules.stock_forecast
+ """,
+ )
diff --git a/modules/stock_forecast/tests/__init__.py b/modules/stock_forecast/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_forecast/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_forecast/tests/test_module.py b/modules/stock_forecast/tests/test_module.py
new file mode 100644
index 0000000000..5a36cdb978
--- /dev/null
+++ b/modules/stock_forecast/tests/test_module.py
@@ -0,0 +1,321 @@
+# 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 decimal import Decimal
+
+from dateutil.relativedelta import relativedelta
+
+from trytond.modules.company.tests import (
+ CompanyTestMixin, create_company, set_company)
+from trytond.pool import Pool
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.transaction import Transaction
+
+
+class StockForecastTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test StockForecast module'
+ module = 'stock_forecast'
+
+ @with_transaction()
+ def test_distribute(self):
+ 'Test distribute'
+ pool = Pool()
+ Line = pool.get('stock.forecast.line')
+ line = Line()
+ for values, result in (
+ ((1, 5), {0: 5}),
+ ((4, 8), {0: 2, 1: 2, 2: 2, 3: 2}),
+ ((2, 5), {0: 2, 1: 3}),
+ ((10, 4), {0: 0, 1: 1, 2: 0, 3: 1, 4: 0,
+ 5: 0, 6: 1, 7: 0, 8: 1, 9: 0}),
+ ):
+ self.assertEqual(line.distribute(*values), result)
+
+ @with_transaction()
+ def test_create_moves_before(self):
+ "Test create moves before start date"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Forecast = pool.get('stock.forecast')
+ Move = pool.get('stock.move')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': 'Test create_moves',
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ customer, = Location.search([('code', '=', 'CUS')])
+ warehouse, = Location.search([('code', '=', 'WH')])
+ storage, = Location.search([('code', '=', 'STO')])
+ company = create_company()
+ with set_company(company):
+ today = datetime.date.today()
+
+ forecast, = Forecast.create([{
+ 'warehouse': warehouse.id,
+ 'destination': customer.id,
+ 'from_date': today + relativedelta(months=1, day=1),
+ 'to_date': today + relativedelta(months=1, day=20),
+ 'company': company.id,
+ 'lines': [
+ ('create', [{
+ 'product': product.id,
+ 'quantity': 10,
+ 'uom': unit.id,
+ 'minimal_quantity': 2,
+ }],
+ ),
+ ],
+ }])
+ Forecast.confirm([forecast])
+
+ Forecast.create_moves([forecast])
+ line, = forecast.lines
+ self.assertEqual(line.quantity_executed, 0)
+ self.assertEqual(len(line.moves), 5)
+ self.assertEqual(sum(move.quantity for move in line.moves), 10)
+ self.assertGreaterEqual(
+ min(m.planned_date for m in line.moves), forecast.from_date)
+
+ Forecast.delete_moves([forecast])
+ line, = forecast.lines
+ self.assertEqual(len(line.moves), 0)
+
+ Move.create([{
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 2,
+ 'planned_date': today + relativedelta(months=1, day=5),
+ 'company': company.id,
+ 'currency': company.currency.id,
+ 'unit_price': Decimal('1'),
+ }])
+ line, = forecast.lines
+ self.assertEqual(line.quantity_executed, 2)
+
+ Forecast.create_moves([forecast])
+ line, = forecast.lines
+ self.assertEqual(line.quantity_executed, 2)
+ self.assertEqual(len(line.moves), 4)
+ self.assertEqual(sum(move.quantity for move in line.moves), 8)
+ self.assertGreaterEqual(
+ min(m.planned_date for m in line.moves), forecast.from_date)
+
+ @with_transaction()
+ def test_create_moves_during(self):
+ "Test create moves during the period"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Forecast = pool.get('stock.forecast')
+ Move = pool.get('stock.move')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': 'Test create_moves',
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ customer, = Location.search([('code', '=', 'CUS')])
+ warehouse, = Location.search([('code', '=', 'WH')])
+ storage, = Location.search([('code', '=', 'STO')])
+ company = create_company()
+ with set_company(company):
+ today = datetime.date.today()
+
+ forecast, = Forecast.create([{
+ 'warehouse': warehouse.id,
+ 'destination': customer.id,
+ 'from_date': today - relativedelta(days=20),
+ 'to_date': today + relativedelta(days=10),
+ 'company': company.id,
+ 'lines': [
+ ('create', [{
+ 'product': product.id,
+ 'quantity': 20,
+ 'uom': unit.id,
+ 'minimal_quantity': 2,
+ }],
+ ),
+ ],
+ }])
+ Forecast.confirm([forecast])
+
+ Forecast.create_moves([forecast])
+ line, = forecast.lines
+ self.assertEqual(line.quantity_executed, 0)
+ self.assertEqual(len(line.moves), 10)
+ self.assertEqual(sum(move.quantity for move in line.moves), 20)
+ self.assertGreaterEqual(
+ min(m.planned_date for m in line.moves), today)
+
+ Forecast.delete_moves([forecast])
+ line, = forecast.lines
+ self.assertEqual(len(line.moves), 0)
+
+ Move.create([{
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 10,
+ 'planned_date': today - relativedelta(days=5),
+ 'company': company.id,
+ 'currency': company.currency.id,
+ 'unit_price': Decimal('1'),
+ }])
+ line, = forecast.lines
+ self.assertEqual(line.quantity_executed, 10)
+
+ Forecast.create_moves([forecast])
+ line, = forecast.lines
+ self.assertEqual(line.quantity_executed, 10)
+ self.assertEqual(len(line.moves), 5)
+ self.assertEqual(sum(move.quantity for move in line.moves), 10)
+ self.assertGreaterEqual(
+ min(m.planned_date for m in line.moves), today)
+
+ @with_transaction()
+ def test_create_moves_after(self):
+ "Test create not moves after end date"
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Forecast = pool.get('stock.forecast')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': 'Test create_moves',
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ customer, = Location.search([('code', '=', 'CUS')])
+ warehouse, = Location.search([('code', '=', 'WH')])
+ storage, = Location.search([('code', '=', 'STO')])
+ company = create_company()
+ with set_company(company):
+ today = datetime.date.today()
+
+ forecast, = Forecast.create([{
+ 'warehouse': warehouse.id,
+ 'destination': customer.id,
+ 'from_date': today - relativedelta(days=20),
+ 'to_date': today - relativedelta(days=10),
+ 'company': company.id,
+ 'lines': [
+ ('create', [{
+ 'product': product.id,
+ 'quantity': 20,
+ 'uom': unit.id,
+ 'minimal_quantity': 2,
+ }],
+ ),
+ ],
+ }])
+ Forecast.confirm([forecast])
+
+ Forecast.create_moves([forecast])
+ line, = forecast.lines
+ self.assertEqual(len(line.moves), 0)
+
+ @with_transaction()
+ def test_complete(self):
+ 'Test complete'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Forecast = pool.get('stock.forecast')
+ Move = pool.get('stock.move')
+ ForecastComplete = pool.get('stock.forecast.complete', type='wizard')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': 'Test complete',
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ customer, = Location.search([('code', '=', 'CUS')])
+ supplier, = Location.search([('code', '=', 'SUP')])
+ warehouse, = Location.search([('code', '=', 'WH')])
+ storage, = Location.search([('code', '=', 'STO')])
+ company = create_company()
+ with set_company(company):
+ today = datetime.date.today()
+
+ moves = Move.create([{
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 10,
+ 'effective_date': (today
+ + relativedelta(months=-1, day=1)),
+ 'company': company.id,
+ 'currency': company.currency.id,
+ 'unit_price': Decimal('1'),
+ }, {
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'product': product.id,
+ 'uom': unit.id,
+ 'quantity': 5,
+ 'effective_date': (today
+ + relativedelta(months=-1, day=15)),
+ 'company': company.id,
+ 'currency': company.currency.id,
+ 'unit_price': Decimal('1'),
+ }])
+ Move.do(moves)
+
+ forecast, = Forecast.create([{
+ 'warehouse': warehouse.id,
+ 'destination': customer.id,
+ 'from_date': today + relativedelta(months=1, day=1),
+ 'to_date': today + relativedelta(months=1, day=20),
+ 'company': company.id,
+ }])
+
+ with Transaction().set_context(
+ active_model=Forecast.__name__, active_id=forecast.id):
+ session_id, _, _ = ForecastComplete.create()
+ forecast_complete = ForecastComplete(session_id)
+ forecast_complete.ask.from_date = (
+ today + relativedelta(months=-1, day=1))
+ forecast_complete.ask.to_date = (
+ today + relativedelta(months=-1, day=20))
+ forecast_complete.transition_complete()
+
+ self.assertEqual(len(forecast.lines), 1)
+ forecast_line, = forecast.lines
+ self.assertEqual(forecast_line.product, product)
+ self.assertEqual(forecast_line.uom, unit)
+ self.assertEqual(forecast_line.quantity, 5)
+ self.assertEqual(forecast_line.minimal_quantity, 1)
+
+
+del ModuleTestCase
diff --git a/modules/stock_forecast/tox.ini b/modules/stock_forecast/tox.ini
new file mode 100644
index 0000000000..a04ae2d481
--- /dev/null
+++ b/modules/stock_forecast/tox.ini
@@ -0,0 +1,16 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+commands =
+ coverage run --include=./**/stock_forecast/* -m unittest discover -s tests
+ coverage report --include=./**/stock_forecast/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_forecast/tryton.cfg b/modules/stock_forecast/tryton.cfg
new file mode 100644
index 0000000000..189e38ab73
--- /dev/null
+++ b/modules/stock_forecast/tryton.cfg
@@ -0,0 +1,11 @@
+[tryton]
+version=6.7.0
+depends:
+ company
+ ir
+ product
+ res
+ stock
+xml:
+ forecast.xml
+ message.xml
diff --git a/modules/stock_forecast/view/forecast_complete_ask_form.xml b/modules/stock_forecast/view/forecast_complete_ask_form.xml
new file mode 100644
index 0000000000..39f1822f77
--- /dev/null
+++ b/modules/stock_forecast/view/forecast_complete_ask_form.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/modules/stock_forecast/view/forecast_complete_choose_form.xml b/modules/stock_forecast/view/forecast_complete_choose_form.xml
new file mode 100644
index 0000000000..e2369e6402
--- /dev/null
+++ b/modules/stock_forecast/view/forecast_complete_choose_form.xml
@@ -0,0 +1,6 @@
+
+
+
diff --git a/modules/stock_forecast/view/forecast_form.xml b/modules/stock_forecast/view/forecast_form.xml
new file mode 100644
index 0000000000..50b7dd1588
--- /dev/null
+++ b/modules/stock_forecast/view/forecast_form.xml
@@ -0,0 +1,26 @@
+
+
+
diff --git a/modules/stock_forecast/view/forecast_line_form.xml b/modules/stock_forecast/view/forecast_line_form.xml
new file mode 100644
index 0000000000..dc235aed8e
--- /dev/null
+++ b/modules/stock_forecast/view/forecast_line_form.xml
@@ -0,0 +1,19 @@
+
+
+
diff --git a/modules/stock_forecast/view/forecast_line_tree.xml b/modules/stock_forecast/view/forecast_line_tree.xml
new file mode 100644
index 0000000000..daf00c00ba
--- /dev/null
+++ b/modules/stock_forecast/view/forecast_line_tree.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_forecast/view/forecast_tree.xml b/modules/stock_forecast/view/forecast_tree.xml
new file mode 100644
index 0000000000..5bd299f321
--- /dev/null
+++ b/modules/stock_forecast/view/forecast_tree.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_inventory_location/.drone.yml b/modules/stock_inventory_location/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/stock_inventory_location/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_inventory_location/.flake8 b/modules/stock_inventory_location/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_inventory_location/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_inventory_location/.isort.cfg b/modules/stock_inventory_location/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_inventory_location/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_inventory_location/CHANGELOG b/modules/stock_inventory_location/CHANGELOG
new file mode 100644
index 0000000000..5524a0cd40
--- /dev/null
+++ b/modules/stock_inventory_location/CHANGELOG
@@ -0,0 +1,90 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-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
+* Add empty quantity and complete lines options
+
+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
+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-11
+* Bug fixes (see mercurial logs for details)
+
+Version 1.4.0 - 2009-10-19
+* Bug fixes (see mercurial logs for details)
+
+Version 1.2.0 - 2009-07-28
+* Initial release
diff --git a/modules/stock_inventory_location/COPYRIGHT b/modules/stock_inventory_location/COPYRIGHT
new file mode 100644
index 0000000000..df66364561
--- /dev/null
+++ b/modules/stock_inventory_location/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2009-2022 Cédric Krier.
+Copyright (C) 2009-2012 Bertrand Chenal.
+Copyright (C) 2009-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/stock_inventory_location/LICENSE b/modules/stock_inventory_location/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_inventory_location/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/stock_inventory_location/MANIFEST.in b/modules/stock_inventory_location/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_inventory_location/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_inventory_location/README.rst b/modules/stock_inventory_location/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_inventory_location/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_inventory_location/__init__.py b/modules/stock_inventory_location/__init__.py
new file mode 100644
index 0000000000..f6753b9ddc
--- /dev/null
+++ b/modules/stock_inventory_location/__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 inventory
+
+
+def register():
+ Pool.register(
+ inventory.CreateInventoriesStart,
+ module='stock_inventory_location', type_='model')
+ Pool.register(
+ inventory.CreateInventories,
+ module='stock_inventory_location', type_='wizard')
diff --git a/modules/stock_inventory_location/doc/index.rst b/modules/stock_inventory_location/doc/index.rst
new file mode 100644
index 0000000000..df2e925432
--- /dev/null
+++ b/modules/stock_inventory_location/doc/index.rst
@@ -0,0 +1,9 @@
+Stock Inventory Location Module
+###############################
+
+The Stock Inventory Location Module add a new wizard *Create
+Inventories* under the *Inventories* sub-menu.
+
+This wizard first asks the user to select the locations, the products
+and the categories of product that he wants to create inventories for
+and opens them in a new tab.
diff --git a/modules/stock_inventory_location/inventory.py b/modules/stock_inventory_location/inventory.py
new file mode 100644
index 0000000000..792176a607
--- /dev/null
+++ b/modules/stock_inventory_location/inventory.py
@@ -0,0 +1,82 @@
+# 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 Pool
+from trytond.transaction import Transaction
+from trytond.wizard import Button, StateAction, StateView, Wizard
+
+
+class CreateInventoriesStart(ModelView):
+ 'Create Inventories'
+ __name__ = 'stock.inventory.create.start'
+ date = fields.Date('Date', required=True)
+ company = fields.Many2One('company.company', "Company", required=True)
+ empty_quantity = fields.Selection(
+ 'get_empty_quantities', "Empty Quantity",
+ help="How lines without a quantity are handled.")
+ complete_lines = fields.Boolean(
+ "Complete",
+ help="Add an inventory line for each missing product.")
+ locations = fields.Many2Many('stock.location', None, None,
+ 'Locations', required=True, domain=[('type', '=', 'storage')])
+
+ @classmethod
+ def default_date(cls):
+ return Pool().get('ir.date').today()
+
+ @staticmethod
+ def default_company():
+ return Transaction().context.get('company')
+
+ @classmethod
+ def get_empty_quantities(cls):
+ pool = Pool()
+ Inventory = pool.get('stock.inventory')
+ return Inventory.fields_get(
+ ['empty_quantity'])['empty_quantity']['selection']
+
+ @classmethod
+ def default_empty_quantity(cls):
+ pool = Pool()
+ Inventory = pool.get('stock.inventory')
+ try:
+ return Inventory.default_empty_quantity()
+ except AttributeError:
+ return
+
+ @classmethod
+ def default_complete_lines(cls):
+ return True
+
+
+class CreateInventories(Wizard):
+ 'Create Inventories'
+ __name__ = 'stock.inventory.create'
+ start = StateView('stock.inventory.create.start',
+ 'stock_inventory_location.inventory_create_start_view_form', [
+ Button('Cancel', 'end', 'tryton-cancel'),
+ Button('Create', 'create_', 'tryton-ok', default=True),
+ ])
+ create_ = StateAction('stock.act_inventory_form')
+
+ def get_inventory(self, location, Inventory):
+ return Inventory(
+ location=location,
+ date=self.start.date,
+ company=self.start.company,
+ empty_quantity=self.start.empty_quantity)
+
+ def do_create_(self, action):
+ pool = Pool()
+ Inventory = pool.get('stock.inventory')
+
+ inventories = [
+ self.get_inventory(location, Inventory)
+ for location in self.start.locations]
+ Inventory.save(inventories)
+
+ if self.start.complete_lines:
+ Inventory.complete_lines(inventories)
+
+ data = {'res_id': [i.id for i in inventories]}
+ return action, data
diff --git a/modules/stock_inventory_location/inventory.xml b/modules/stock_inventory_location/inventory.xml
new file mode 100644
index 0000000000..dacadf163c
--- /dev/null
+++ b/modules/stock_inventory_location/inventory.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+ Create Inventories
+ stock.inventory.create
+
+
+
+
+
+
+
+
+
+
+ stock.inventory.create.start
+ form
+ inventory_create_start_form
+
+
+
+ stock.inventory
+
+ inventory_list
+
+
+
diff --git a/modules/stock_inventory_location/locale/bg.po b/modules/stock_inventory_location/locale/bg.po
new file mode 100644
index 0000000000..00c488fa0b
--- /dev/null
+++ b/modules/stock_inventory_location/locale/bg.po
@@ -0,0 +1,53 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Местонахождения"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Създаване на инвентаризация"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Създаване"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Отказ"
diff --git a/modules/stock_inventory_location/locale/ca.po b/modules/stock_inventory_location/locale/ca.po
new file mode 100644
index 0000000000..4a31b0a3e6
--- /dev/null
+++ b/modules/stock_inventory_location/locale/ca.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr "Completa"
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Quantitat en blanc"
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Ubicacions"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr "Afegeix una línia d'inventary per a cada producte que falta."
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Com es gestionen les línies sense quantitat."
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Crea inventaris"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Crea inventaris"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Crea inventaris"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Crea"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
diff --git a/modules/stock_inventory_location/locale/cs.po b/modules/stock_inventory_location/locale/cs.po
new file mode 100644
index 0000000000..8707e67cf0
--- /dev/null
+++ b/modules/stock_inventory_location/locale/cs.po
@@ -0,0 +1,52 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_inventory_location/locale/de.po b/modules/stock_inventory_location/locale/de.po
new file mode 100644
index 0000000000..8ab0caf561
--- /dev/null
+++ b/modules/stock_inventory_location/locale/de.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr "Vervollständigen"
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Positionen ohne Erfassung"
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Lagerorte"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr "Inventurposition für jeden fehlenden Artikel hinzufügen."
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Bestimmt wie Positionen ohne erfasste Menge behandelt werden."
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Lagerbestände ermitteln"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Lagerbestände ermitteln"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Lagerbestände ermitteln"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Erstellen"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
diff --git a/modules/stock_inventory_location/locale/es.po b/modules/stock_inventory_location/locale/es.po
new file mode 100644
index 0000000000..78ae708154
--- /dev/null
+++ b/modules/stock_inventory_location/locale/es.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr "Completar"
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Cantidad en blanco"
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Ubicaciones"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr "Añade una línea de inventario por cada producto que falta."
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Como se gestionan las líneas sin cantidad."
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Crear inventarios"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Crear inventarios"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Crear inventarios"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Crear"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
diff --git a/modules/stock_inventory_location/locale/es_419.po b/modules/stock_inventory_location/locale/es_419.po
new file mode 100644
index 0000000000..11656f6b7d
--- /dev/null
+++ b/modules/stock_inventory_location/locale/es_419.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_inventory_location/locale/et.po b/modules/stock_inventory_location/locale/et.po
new file mode 100644
index 0000000000..456834497d
--- /dev/null
+++ b/modules/stock_inventory_location/locale/et.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Kuupäev"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Asukohad"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Loo laoseis"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Loo laoseis"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Loo laoseis"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Loo"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Tühista"
diff --git a/modules/stock_inventory_location/locale/fa.po b/modules/stock_inventory_location/locale/fa.po
new file mode 100644
index 0000000000..6219ae670c
--- /dev/null
+++ b/modules/stock_inventory_location/locale/fa.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "تاریخ"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "مکان ها"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "ایجاد فهرست های موجودی"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "ایجاد فهرست های موجودی"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "ایجاد فهرست های موجودی"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "ایجاد"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "انصراف"
diff --git a/modules/stock_inventory_location/locale/fi.po b/modules/stock_inventory_location/locale/fi.po
new file mode 100644
index 0000000000..8707e67cf0
--- /dev/null
+++ b/modules/stock_inventory_location/locale/fi.po
@@ -0,0 +1,52 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_inventory_location/locale/fr.po b/modules/stock_inventory_location/locale/fr.po
new file mode 100644
index 0000000000..a95d7706ed
--- /dev/null
+++ b/modules/stock_inventory_location/locale/fr.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr "Compléter"
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Quantité vide"
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr "Ajouter une ligne d'inventaire pour chaque produit manquant."
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Comment les lignes sans quantité sont traitées."
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Créer les inventaires"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Créer les inventaires"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Créer des inventaires"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Créer"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
diff --git a/modules/stock_inventory_location/locale/hu.po b/modules/stock_inventory_location/locale/hu.po
new file mode 100644
index 0000000000..4097a0d7c8
--- /dev/null
+++ b/modules/stock_inventory_location/locale/hu.po
@@ -0,0 +1,53 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Társaság"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Dátum"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Raktárhely"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Raktárkészlet meghatározása"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Létrehozás"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Mégse"
diff --git a/modules/stock_inventory_location/locale/id.po b/modules/stock_inventory_location/locale/id.po
new file mode 100644
index 0000000000..4476c8d1b6
--- /dev/null
+++ b/modules/stock_inventory_location/locale/id.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Buat"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Batal"
diff --git a/modules/stock_inventory_location/locale/it.po b/modules/stock_inventory_location/locale/it.po
new file mode 100644
index 0000000000..df5bd3404b
--- /dev/null
+++ b/modules/stock_inventory_location/locale/it.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr "Completa"
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Quantità vuota"
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Posizioni"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr "Aggiungi una riga di inventario per ogni prodotto mancante."
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Come vengono gestite le righe senza una quantità."
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Crea inventari"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Crea inventari"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Crea inventari"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Crea"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Annulla"
diff --git a/modules/stock_inventory_location/locale/lo.po b/modules/stock_inventory_location/locale/lo.po
new file mode 100644
index 0000000000..8ef56cc009
--- /dev/null
+++ b/modules/stock_inventory_location/locale/lo.po
@@ -0,0 +1,53 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "ບໍລິສັດ"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "ວັນທີ"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "ສະຖານທີ່"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "ສ້າງການກວດນັບ"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "ສ້າງ"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "ຍົກເລີກ"
diff --git a/modules/stock_inventory_location/locale/lt.po b/modules/stock_inventory_location/locale/lt.po
new file mode 100644
index 0000000000..23d6fc20bf
--- /dev/null
+++ b/modules/stock_inventory_location/locale/lt.po
@@ -0,0 +1,52 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_inventory_location/locale/nl.po b/modules/stock_inventory_location/locale/nl.po
new file mode 100644
index 0000000000..b6f63ed1c2
--- /dev/null
+++ b/modules/stock_inventory_location/locale/nl.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr "Voltooien"
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "datum"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr "Lege hoeveelheid"
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "locaties"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr "Voeg een inventarisregel toe voor alle ontbrekende producten."
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr "Hoe lijnen zonder hoeveelheid worden afgehandeld."
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "maak inventaris"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "maak inventaris"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "maak inventaris"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Maken"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Annuleren"
diff --git a/modules/stock_inventory_location/locale/pl.po b/modules/stock_inventory_location/locale/pl.po
new file mode 100644
index 0000000000..06b3309cda
--- /dev/null
+++ b/modules/stock_inventory_location/locale/pl.po
@@ -0,0 +1,53 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Lokalizacje"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Utwórz"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Anuluj"
diff --git a/modules/stock_inventory_location/locale/pt.po b/modules/stock_inventory_location/locale/pt.po
new file mode 100644
index 0000000000..69a6ab0e01
--- /dev/null
+++ b/modules/stock_inventory_location/locale/pt.po
@@ -0,0 +1,53 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Localizações"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Criar inventários"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Criar"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
diff --git a/modules/stock_inventory_location/locale/ro.po b/modules/stock_inventory_location/locale/ro.po
new file mode 100644
index 0000000000..052c623886
--- /dev/null
+++ b/modules/stock_inventory_location/locale/ro.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_inventory_location/locale/ru.po b/modules/stock_inventory_location/locale/ru.po
new file mode 100644
index 0000000000..8d49a7eff0
--- /dev/null
+++ b/modules/stock_inventory_location/locale/ru.po
@@ -0,0 +1,57 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Учет.орг."
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Местоположения"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Создать"
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Отменить"
diff --git a/modules/stock_inventory_location/locale/sl.po b/modules/stock_inventory_location/locale/sl.po
new file mode 100644
index 0000000000..49c739dd99
--- /dev/null
+++ b/modules/stock_inventory_location/locale/sl.po
@@ -0,0 +1,53 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr "Lokacije"
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Izdelava popisov"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr "Izdelaj"
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "Prekliči"
diff --git a/modules/stock_inventory_location/locale/tr.po b/modules/stock_inventory_location/locale/tr.po
new file mode 100644
index 0000000000..8707e67cf0
--- /dev/null
+++ b/modules/stock_inventory_location/locale/tr.po
@@ -0,0 +1,52 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_inventory_location/locale/uk.po b/modules/stock_inventory_location/locale/uk.po
new file mode 100644
index 0000000000..11656f6b7d
--- /dev/null
+++ b/modules/stock_inventory_location/locale/uk.po
@@ -0,0 +1,51 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_inventory_location/locale/zh_CN.po b/modules/stock_inventory_location/locale/zh_CN.po
new file mode 100644
index 0000000000..17fedbe2ae
--- /dev/null
+++ b/modules/stock_inventory_location/locale/zh_CN.po
@@ -0,0 +1,54 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.inventory.create.start,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,complete_lines:"
+msgid "Complete"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.create.start,date:"
+msgid "Date"
+msgstr "日期格式"
+
+msgctxt "field:stock.inventory.create.start,empty_quantity:"
+msgid "Empty Quantity"
+msgstr ""
+
+msgctxt "field:stock.inventory.create.start,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,complete_lines:"
+msgid "Add an inventory line for each missing product."
+msgstr ""
+
+msgctxt "help:stock.inventory.create.start,empty_quantity:"
+msgid "How lines without a quantity are handled."
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "model:ir.ui.menu,name:menu_create_inventory"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+#, fuzzy
+msgctxt "model:stock.inventory.create.start,name:"
+msgid "Create Inventories"
+msgstr "Create Inventories"
+
+msgctxt "wizard_button:stock.inventory.create,start,create_:"
+msgid "Create"
+msgstr ""
+
+#, fuzzy
+msgctxt "wizard_button:stock.inventory.create,start,end:"
+msgid "Cancel"
+msgstr "取消"
diff --git a/modules/stock_inventory_location/setup.py b/modules/stock_inventory_location/setup.py
new file mode 100755
index 0000000000..ff3ca1ba87
--- /dev/null
+++ b/modules/stock_inventory_location/setup.py
@@ -0,0 +1,152 @@
+#!/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 find_packages, setup
+
+
+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_stock_inventory_location'
+
+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 create inventories by locations',
+ 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/stock_inventory_location'),
+ },
+ keywords='tryton inventory location',
+ package_dir={'trytond.modules.stock_inventory_location': '.'},
+ packages=(
+ ['trytond.modules.stock_inventory_location']
+ + ['trytond.modules.stock_inventory_location.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_inventory_location': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_inventory_location = trytond.modules.stock_inventory_location
+ """,
+ )
diff --git a/modules/stock_inventory_location/tests/__init__.py b/modules/stock_inventory_location/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_inventory_location/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_inventory_location/tests/scenario_stock_inventories.rst b/modules/stock_inventory_location/tests/scenario_stock_inventories.rst
new file mode 100644
index 0000000000..a8a133d171
--- /dev/null
+++ b/modules/stock_inventory_location/tests/scenario_stock_inventories.rst
@@ -0,0 +1,39 @@
+==========================
+Stock Inventories Scenario
+==========================
+
+Imports::
+
+ >>> from proteus import Model, Wizard
+ >>> from trytond.tests.tools import activate_modules
+ >>> from trytond.modules.company.tests.tools import create_company
+
+Activate modules::
+
+ >>> config = activate_modules('stock_inventory_location')
+
+Create company::
+
+ >>> _ = create_company()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> storage_loc2, = storage_loc.duplicate()
+
+Create inventories::
+
+ >>> create = Wizard('stock.inventory.create')
+ >>> create.form.empty_quantity = 'keep'
+ >>> create.form.locations.extend(Location.find([('code', '=', 'STO')]))
+ >>> create.execute('create_')
+
+ >>> inventories, = create.actions
+ >>> len(inventories)
+ 2
+ >>> {i.location for i in inventories} == {storage_loc, storage_loc2}
+ True
+ >>> inventories[0].empty_quantity
+ 'keep'
diff --git a/modules/stock_inventory_location/tests/test_module.py b/modules/stock_inventory_location/tests/test_module.py
new file mode 100644
index 0000000000..0b6ee2b46a
--- /dev/null
+++ b/modules/stock_inventory_location/tests/test_module.py
@@ -0,0 +1,13 @@
+# 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.modules.company.tests import CompanyTestMixin
+from trytond.tests.test_tryton import ModuleTestCase
+
+
+class StockInventoryLocationTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test StockInventoryLocation module'
+ module = 'stock_inventory_location'
+
+
+del ModuleTestCase
diff --git a/modules/stock_inventory_location/tests/test_scenario.py b/modules/stock_inventory_location/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/stock_inventory_location/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock_inventory_location/tox.ini b/modules/stock_inventory_location/tox.ini
new file mode 100644
index 0000000000..37557d9313
--- /dev/null
+++ b/modules/stock_inventory_location/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_inventory_location/* -m unittest discover -s tests
+ coverage report --include=./**/stock_inventory_location/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_inventory_location/tryton.cfg b/modules/stock_inventory_location/tryton.cfg
new file mode 100644
index 0000000000..30c935ac6f
--- /dev/null
+++ b/modules/stock_inventory_location/tryton.cfg
@@ -0,0 +1,9 @@
+[tryton]
+version=6.7.0
+depends:
+ company
+ ir
+ product
+ stock
+xml:
+ inventory.xml
diff --git a/modules/stock_inventory_location/view/inventory_create_start_form.xml b/modules/stock_inventory_location/view/inventory_create_start_form.xml
new file mode 100644
index 0000000000..5ac5b5b8c7
--- /dev/null
+++ b/modules/stock_inventory_location/view/inventory_create_start_form.xml
@@ -0,0 +1,16 @@
+
+
+
diff --git a/modules/stock_inventory_location/view/inventory_list.xml b/modules/stock_inventory_location/view/inventory_list.xml
new file mode 100644
index 0000000000..768e8dd644
--- /dev/null
+++ b/modules/stock_inventory_location/view/inventory_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_location_move/.drone.yml b/modules/stock_location_move/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/stock_location_move/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_location_move/.flake8 b/modules/stock_location_move/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_location_move/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_location_move/.isort.cfg b/modules/stock_location_move/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_location_move/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_location_move/CHANGELOG b/modules/stock_location_move/CHANGELOG
new file mode 100644
index 0000000000..226e4544c8
--- /dev/null
+++ b/modules/stock_location_move/CHANGELOG
@@ -0,0 +1,37 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-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
+* Initial release
diff --git a/modules/stock_location_move/COPYRIGHT b/modules/stock_location_move/COPYRIGHT
new file mode 100644
index 0000000000..3e3fc46e16
--- /dev/null
+++ b/modules/stock_location_move/COPYRIGHT
@@ -0,0 +1,14 @@
+Copyright (C) 2017-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/stock_location_move/LICENSE b/modules/stock_location_move/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_location_move/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/stock_location_move/MANIFEST.in b/modules/stock_location_move/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_location_move/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_location_move/README.rst b/modules/stock_location_move/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_location_move/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_location_move/__init__.py b/modules/stock_location_move/__init__.py
new file mode 100644
index 0000000000..607de67820
--- /dev/null
+++ b/modules/stock_location_move/__init__.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 Pool
+
+from . import product, stock
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ stock.Location,
+ stock.ShipmentInternal,
+ stock.ShipmentInternal_Location,
+ stock.ShipmentOut,
+ stock.ShipmentInReturn,
+ product.Product,
+ module='stock_location_move', type_='model')
+ Pool.register(
+ stock.Supply,
+ module='stock_location_move', type_='wizard',
+ depends=['stock_supply'])
+ Pool.register(
+ module='stock_location_move', type_='report')
diff --git a/modules/stock_location_move/doc/index.rst b/modules/stock_location_move/doc/index.rst
new file mode 100644
index 0000000000..2ec1a68bd1
--- /dev/null
+++ b/modules/stock_location_move/doc/index.rst
@@ -0,0 +1,13 @@
+Stock Location Move Module
+##########################
+
+The stock location move module allows to define some *Locations* as movable
+(like palette).
+
+Such locations can be moved using an *Internal Shipment*. The parent location
+is changed for the destination location when the shipment is done. If there is
+a transit location, the locations will be first moved to this one when shipped.
+A reservation mechanism prevent to assign the same locations at the same time.
+
+If a *Customer Shipment* or a *Supplier Return Shipment* empties a movable
+location, it will automatically deactivate it.
diff --git a/modules/stock_location_move/locale/bg.po b/modules/stock_location_move/locale/bg.po
new file mode 100644
index 0000000000..3edbcf3228
--- /dev/null
+++ b/modules/stock_location_move/locale/bg.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/ca.po b/modules/stock_location_move/locale/ca.po
new file mode 100644
index 0000000000..eca28266d9
--- /dev/null
+++ b/modules/stock_location_move/locale/ca.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr "Reservat per"
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr "Movible"
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr "Ubicacions"
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr "Albarà"
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr "La ubicació '%(location)s' ja està reservada per '%(assigned_by)s'."
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr "Ubicació movible"
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr "Qualsevol ubicació"
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Ubicacions d'existències movibles"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr "Albarà intern - Ubicació"
diff --git a/modules/stock_location_move/locale/cs.po b/modules/stock_location_move/locale/cs.po
new file mode 100644
index 0000000000..3edbcf3228
--- /dev/null
+++ b/modules/stock_location_move/locale/cs.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/de.po b/modules/stock_location_move/locale/de.po
new file mode 100644
index 0000000000..a6fdd81f7d
--- /dev/null
+++ b/modules/stock_location_move/locale/de.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr "Zugeordnet"
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr "Beweglich"
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr "Lagerorte"
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "Lagerort"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr "Lieferung"
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr "Der Lagerort '%(location)s' ist bereits '%(assigned_by)s' zugeordnet."
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr "Mobiler Lagerort"
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr "Beliebiger Lagerort"
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Mobiler Lagerort"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr "Interne Lieferung - Lagerort"
diff --git a/modules/stock_location_move/locale/es.po b/modules/stock_location_move/locale/es.po
new file mode 100644
index 0000000000..609fd062d3
--- /dev/null
+++ b/modules/stock_location_move/locale/es.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr "Reservador por"
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr "Movible"
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr "Ubicaciones"
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr "Albarán"
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr "La ubicación '%(location)s' ya está reservada por '%(assigned_by)s'."
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr "Ubicación movible"
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr "Cualquier ubicación"
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Ubicaciones de existencias movibles"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr "Albarán interno - Ubicación"
diff --git a/modules/stock_location_move/locale/es_419.po b/modules/stock_location_move/locale/es_419.po
new file mode 100644
index 0000000000..ca763441f2
--- /dev/null
+++ b/modules/stock_location_move/locale/es_419.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr ""
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/et.po b/modules/stock_location_move/locale/et.po
new file mode 100644
index 0000000000..66a06609be
--- /dev/null
+++ b/modules/stock_location_move/locale/et.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr "Määratud"
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr "Liigutatav"
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr "Asukohad"
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "Asukoht"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr "Lähetus"
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr ""
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/fa.po b/modules/stock_location_move/locale/fa.po
new file mode 100644
index 0000000000..7118ec285d
--- /dev/null
+++ b/modules/stock_location_move/locale/fa.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr "اختصاص داده شده توسط"
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr "قابل جابجایی"
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr "مکان ها"
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "مکان"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr "محموله"
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr "مکان : \"%s\" در حال حاضر توسط : \"%s\" اختصاص داده شده است."
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "مکان موجودی قابل جابجایی"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr "مکان - محموله داخلی"
diff --git a/modules/stock_location_move/locale/fi.po b/modules/stock_location_move/locale/fi.po
new file mode 100644
index 0000000000..3edbcf3228
--- /dev/null
+++ b/modules/stock_location_move/locale/fi.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/fr.po b/modules/stock_location_move/locale/fr.po
new file mode 100644
index 0000000000..6f87a4effb
--- /dev/null
+++ b/modules/stock_location_move/locale/fr.po
@@ -0,0 +1,46 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr "Assigné par"
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr "Mobile"
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr "Expédition"
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+"L'emplacement « %(location)s » a déjà été assigné par « %(assigned_by)s »."
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr "Emplacement déplaçable"
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr "N'importe quel emplacement"
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Emplacement de stockage déplaçable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr "Expédition interne - Emplacement"
diff --git a/modules/stock_location_move/locale/hu.po b/modules/stock_location_move/locale/hu.po
new file mode 100644
index 0000000000..3edbcf3228
--- /dev/null
+++ b/modules/stock_location_move/locale/hu.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/id.po b/modules/stock_location_move/locale/id.po
new file mode 100644
index 0000000000..19d3d00db8
--- /dev/null
+++ b/modules/stock_location_move/locale/id.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "Lokasi"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr ""
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/it.po b/modules/stock_location_move/locale/it.po
new file mode 100644
index 0000000000..883627f980
--- /dev/null
+++ b/modules/stock_location_move/locale/it.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr "Assegnato da"
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr "Mobiliare"
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr "Luoghi"
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "Luogo"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr "Spedizione"
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr "Il luogo \"%(location)s\" è già stata assegnata da \"%(assigned_by)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr "Luogo mobile"
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr "Qualsiasi luogo"
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Luogo di stock mobiliare"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr "Spedizione interna - Ubicazione"
diff --git a/modules/stock_location_move/locale/lo.po b/modules/stock_location_move/locale/lo.po
new file mode 100644
index 0000000000..3edbcf3228
--- /dev/null
+++ b/modules/stock_location_move/locale/lo.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/lt.po b/modules/stock_location_move/locale/lt.po
new file mode 100644
index 0000000000..3edbcf3228
--- /dev/null
+++ b/modules/stock_location_move/locale/lt.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/nl.po b/modules/stock_location_move/locale/nl.po
new file mode 100644
index 0000000000..fffb67457b
--- /dev/null
+++ b/modules/stock_location_move/locale/nl.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr "Toegekend door"
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr "beweegbaar"
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr "locaties"
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "locatie"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr "levering"
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr "De locatie \"%(location)s\" is al toegewezen door \"%(assigned_by)s\"."
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr "Beweegbare locatie"
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr "Elke locatie"
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "voorraad locatie verplaatbaar"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr "Zending intern - Locatie"
diff --git a/modules/stock_location_move/locale/pl.po b/modules/stock_location_move/locale/pl.po
new file mode 100644
index 0000000000..9b219db6ff
--- /dev/null
+++ b/modules/stock_location_move/locale/pl.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr "Przydzielono przez"
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr "Lokalizacje"
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "Lokalizacja"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr "Wysyłka"
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/pt.po b/modules/stock_location_move/locale/pt.po
new file mode 100644
index 0000000000..8bf78ad7b5
--- /dev/null
+++ b/modules/stock_location_move/locale/pt.po
@@ -0,0 +1,47 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr "Atribuído por"
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr "Móvel"
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr "Localizações"
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr "Localização"
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr "Remessa"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr "A localização '%(location)s' já foi atribuída por '%(assigned_by)s'."
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr "Remessa Interna - Localização"
diff --git a/modules/stock_location_move/locale/ro.po b/modules/stock_location_move/locale/ro.po
new file mode 100644
index 0000000000..ca763441f2
--- /dev/null
+++ b/modules/stock_location_move/locale/ro.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr ""
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/ru.po b/modules/stock_location_move/locale/ru.po
new file mode 100644
index 0000000000..3edbcf3228
--- /dev/null
+++ b/modules/stock_location_move/locale/ru.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/sl.po b/modules/stock_location_move/locale/sl.po
new file mode 100644
index 0000000000..3edbcf3228
--- /dev/null
+++ b/modules/stock_location_move/locale/sl.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/tr.po b/modules/stock_location_move/locale/tr.po
new file mode 100644
index 0000000000..3edbcf3228
--- /dev/null
+++ b/modules/stock_location_move/locale/tr.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/uk.po b/modules/stock_location_move/locale/uk.po
new file mode 100644
index 0000000000..ca763441f2
--- /dev/null
+++ b/modules/stock_location_move/locale/uk.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr ""
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/locale/zh_CN.po b/modules/stock_location_move/locale/zh_CN.po
new file mode 100644
index 0000000000..3edbcf3228
--- /dev/null
+++ b/modules/stock_location_move/locale/zh_CN.po
@@ -0,0 +1,45 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,assigned_by:"
+msgid "Assigned by"
+msgstr ""
+
+msgctxt "field:stock.location,movable:"
+msgid "Movable"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.shipment.internal-location,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_location_already_assigned"
+msgid ""
+"The location \"%(location)s\" has already been assigned by "
+"\"%(assigned_by)s\"."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable"
+msgid "Movable location"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_location_movable_admin"
+msgid "Any location"
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_location_movable"
+msgid "Stock Location Movable"
+msgstr "Stock Location Movable"
+
+msgctxt "model:stock.shipment.internal-location,name:"
+msgid "Shipment Internal - Location"
+msgstr ""
diff --git a/modules/stock_location_move/message.xml b/modules/stock_location_move/message.xml
new file mode 100644
index 0000000000..487e44cd54
--- /dev/null
+++ b/modules/stock_location_move/message.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+ The location "%(location)s" has already been assigned by "%(assigned_by)s".
+
+
+
diff --git a/modules/stock_location_move/product.py b/modules/stock_location_move/product.py
new file mode 100644
index 0000000000..86dfd72965
--- /dev/null
+++ b/modules/stock_location_move/product.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 datetime
+
+from trytond.pool import Pool, PoolMeta
+from trytond.transaction import Transaction
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
+
+ @classmethod
+ def products_by_location(cls, *args, **kwargs):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ context = Transaction().context
+ forecast_location_move = context.get('forecast_location_move', False)
+ if forecast_location_move:
+ date = context.get('stock_date_end') or datetime.date.max
+ restore = Location.forecast_location_move(date)
+ quantities = super(Product, cls).products_by_location(*args, **kwargs)
+ if forecast_location_move:
+ restore()
+ return quantities
diff --git a/modules/stock_location_move/setup.py b/modules/stock_location_move/setup.py
new file mode 100755
index 0000000000..4c79f36de1
--- /dev/null
+++ b/modules/stock_location_move/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 find_packages, setup
+
+
+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_stock_location_move'
+
+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')]
+for dep in info.get('extras_depend', []):
+ tests_require.append(get_require_version('trytond_%s' % dep))
+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 move storage locations',
+ 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/stock_location_move',
+ },
+ keywords='tryton stock location',
+ package_dir={'trytond.modules.stock_location_move': '.'},
+ packages=(
+ ['trytond.modules.stock_location_move']
+ + ['trytond.modules.stock_location_move.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_location_move': (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 :: Portuguese (Brazilian)',
+ 'Natural Language :: Romanian',
+ 'Natural Language :: Russian',
+ 'Natural Language :: Slovenian',
+ 'Natural Language :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_location_move = trytond.modules.stock_location_move
+ """,
+ )
diff --git a/modules/stock_location_move/stock.py b/modules/stock_location_move/stock.py
new file mode 100644
index 0000000000..baf4718837
--- /dev/null
+++ b/modules/stock_location_move/stock.py
@@ -0,0 +1,267 @@
+# 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 functools
+
+from trytond.i18n import gettext
+from trytond.model import ModelSQL, ModelView, Workflow, fields
+from trytond.modules.stock.exceptions import AssignError
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Eval, If
+from trytond.transaction import Transaction
+
+
+class Location(metaclass=PoolMeta):
+ __name__ = 'stock.location'
+
+ movable = fields.Boolean(
+ "Movable",
+ states={
+ 'invisible': Eval('type') != 'storage',
+ })
+ assigned_by = fields.Reference(
+ "Assigned by", 'get_assigned_by', readonly=True)
+
+ @classmethod
+ def _get_assigned_by(cls):
+ "Return list of Model names for assigned_by Reference"
+ return ['stock.shipment.internal', 'stock.shipment.out']
+
+ @classmethod
+ def get_assigned_by(cls):
+ pool = Pool()
+ IrModel = pool.get('ir.model')
+ get_name = IrModel.get_name
+ models = cls._get_assigned_by()
+ return [(None, '')] + [(m, get_name(m)) for m in models]
+
+ @classmethod
+ def deactivate_empty(cls, locations=None):
+ if locations is None:
+ locations = cls.search([
+ ('movable', '=', True),
+ ])
+ to_deactivate = cls.get_empty_locations(locations)
+ if to_deactivate:
+ cls.write(cls.browse(to_deactivate), {'active': False})
+
+ @classmethod
+ def forecast_location_move(cls, date):
+ """Move temporary locations planned for the date
+ and returns a method to restore the initial parent."""
+ pool = Pool()
+ ShipmentInternal = pool.get('stock.shipment.internal')
+ Location = pool.get('stock.location')
+ Date = pool.get('ir.date')
+
+ today = Date.today()
+ shipments = ShipmentInternal.search([
+ ('locations', '!=', None),
+ ('state', 'not in', ['cancelled', 'done']),
+ ['OR', [
+ ('planned_date', '<=', date),
+ ('planned_date', '>=', today),
+ ('effective_date', '=', None),
+ ], [
+ ('effective_date', '<=', date),
+ ('effective_date', '>=', today),
+ ],
+ ],
+ ],
+ order=[('planned_date', 'ASC'), ('id', 'ASC')])
+ location_parents = {}
+ locations = []
+
+ for shipment in shipments:
+ for location in shipment.locations:
+ location_parents.setdefault(location, location.parent)
+ location.parent = shipment.to_location
+ locations.append(location)
+ Location.save(locations)
+
+ def restore():
+ locations = []
+ for location, parent in location_parents.items():
+ location.parent = parent
+ locations.append(location)
+ Location.save(locations)
+ return restore
+
+
+def clear_location_assignation(func):
+ @functools.wraps(func)
+ def wrapper(cls, shipments, *args, **kwargs):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ locations = []
+ for shipment in shipments:
+ for location in shipment.locations:
+ if location.assigned_by == shipment:
+ locations.append(location)
+ Location.write(locations, {'assigned_by': None})
+ return func(cls, shipments, *args, **kwargs)
+ return wrapper
+
+
+class ShipmentInternal(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.internal'
+
+ locations = fields.Many2Many(
+ 'stock.shipment.internal-location', 'shipment', 'location',
+ "Locations",
+ domain=[
+ ('type', '=', 'storage'),
+ ('movable', '=', True),
+ If(Eval('state') == 'assigned',
+ ('parent', 'child_of', Eval('from_location', -1)),
+ ()),
+ ],
+ states={
+ 'readonly': (~Eval('state').in_(['request', 'draft'])
+ | ~Eval('from_location') | ~Eval('to_location')),
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('draft')
+ @clear_location_assignation
+ def draft(cls, shipments):
+ super(ShipmentInternal, cls).draft(shipments)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('waiting')
+ @clear_location_assignation
+ def wait(cls, shipments):
+ super(ShipmentInternal, cls).wait(shipments)
+
+ @classmethod
+ @Workflow.transition('assigned')
+ def assign(cls, shipments):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ locations = {}
+ for shipment in shipments:
+ for location in shipment.locations:
+ if not location.assigned_by:
+ location.assigned_by = shipment
+ if location in locations:
+ raise AssignError(
+ gettext('stock_location_move'
+ '.msg_location_already_assigned') % {
+ 'location': location.rec_name,
+ 'assigned_by': locations[location].rec_name,
+ })
+ locations[location] = location.assigned_by
+ elif location.assigned_by != shipment:
+ raise AssignError(
+ gettext('stock_location_move'
+ '.msg_location_already_assigned') % {
+ 'location': location.rec_name,
+ 'assigned_by': location.assigned_by.rec_name,
+ })
+ if locations:
+ Location.save(list(locations))
+ super(ShipmentInternal, cls).assign(shipments)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('shipped')
+ def ship(cls, shipments):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ to_write = []
+ for shipment in shipments:
+ if not shipment.transit_location or not shipment.locations:
+ continue
+ to_write.append(list(shipment.locations))
+ to_write.append({
+ 'parent': shipment.transit_location.id,
+ })
+ if to_write:
+ Location.write(*to_write)
+ super(ShipmentInternal, cls).ship(shipments)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @clear_location_assignation
+ def done(cls, shipments):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ to_write = []
+ for shipment in shipments:
+ if not shipment.locations:
+ continue
+ to_write.append(list(shipment.locations))
+ to_write.append({
+ 'parent': shipment.to_location.id,
+ })
+ if to_write:
+ Location.write(*to_write)
+ super(ShipmentInternal, cls).done(shipments)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ @clear_location_assignation
+ def cancel(cls, shipments):
+ super(ShipmentInternal, cls).cancel(shipments)
+
+
+class ShipmentInternal_Location(ModelSQL):
+ "Shipment Internal - Location"
+ __name__ = 'stock.shipment.internal-location'
+
+ shipment = fields.Many2One(
+ 'stock.shipment.internal', "Shipment", required=True)
+ location = fields.Many2One(
+ 'stock.location', "Location", required=True,
+ domain=[
+ ('type', '=', 'storage'),
+ ('movable', '=', True),
+ ])
+
+
+def deactivate_empty_location(func):
+ @functools.wraps(func)
+ def wrapper(cls, shipments, *args, **kwargs):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ func(cls, shipments, *args, **kwargs)
+ locations = set()
+ for shipment in shipments:
+ locations.update(
+ move.from_location for move in shipment.moves
+ if move.from_location.movable)
+ Location.deactivate_empty(list(locations))
+ return wrapper
+
+
+class ShipmentOut(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out'
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @deactivate_empty_location
+ def done(cls, shipments):
+ super(ShipmentOut, cls).done(shipments)
+
+
+class ShipmentInReturn(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in.return'
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ @deactivate_empty_location
+ def done(cls, shipments):
+ super(ShipmentInReturn, cls).done(shipments)
+
+
+class Supply(metaclass=PoolMeta):
+ __name__ = 'stock.supply'
+
+ def transition_create_(self):
+ with Transaction().set_context(forecast_location_move=True):
+ return super(Supply, self).transition_create_()
diff --git a/modules/stock_location_move/stock.xml b/modules/stock_location_move/stock.xml
new file mode 100644
index 0000000000..37c2af6397
--- /dev/null
+++ b/modules/stock_location_move/stock.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+ Stock Location Movable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Movable location
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Any location
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.location
+
+ location_form
+
+
+
+ stock.shipment.internal
+
+ shipment_internal_form
+
+
+
diff --git a/modules/stock_location_move/tests/__init__.py b/modules/stock_location_move/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_location_move/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_location_move/tests/scenario_stock_location_move.rst b/modules/stock_location_move/tests/scenario_stock_location_move.rst
new file mode 100644
index 0000000000..7e3adbd6bb
--- /dev/null
+++ b/modules/stock_location_move/tests/scenario_stock_location_move.rst
@@ -0,0 +1,130 @@
+============================
+Stock Location Move Scenario
+============================
+
+Imports::
+
+ >>> import datetime
+
+ >>> 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()
+ >>> tomorrow = today + datetime.timedelta(1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock_location_move')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> storage1 = Location(name="Storage 1", parent=storage_loc)
+ >>> storage1.save()
+ >>> storage2 = Location(name="Storage 2", parent=storage_loc)
+ >>> storage2.save()
+ >>> pallet = Location(name="Pallet", parent=storage1, movable=True)
+ >>> pallet.save()
+
+Move pallet from storage1 to storage2::
+
+ >>> Shipment = Model.get('stock.shipment.internal')
+ >>> shipment = Shipment()
+ >>> shipment.from_location = storage1
+ >>> shipment.to_location = storage2
+ >>> shipment.locations.append(Location(pallet.id))
+ >>> shipment.click('wait')
+
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.state
+ 'assigned'
+ >>> pallet.reload()
+ >>> pallet.assigned_by == shipment
+ True
+ >>> pallet.parent == storage1
+ True
+
+ >>> shipment.click('done')
+ >>> shipment.state
+ 'done'
+ >>> pallet.reload()
+ >>> pallet.assigned_by
+ >>> pallet.parent == storage2
+ True
+
+Assign pallet from wrong location::
+
+ >>> shipment = Shipment()
+ >>> shipment.from_location = storage1
+ >>> shipment.to_location = storage2
+ >>> shipment.locations.append(Location(pallet.id))
+ >>> shipment.click('wait')
+ >>> shipment.click('assign_try') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ DomainValidationError: ...
+
+Concurrently move pallet::
+
+ >>> shipment1 = Shipment()
+ >>> shipment1.from_location = storage2
+ >>> shipment1.to_location = storage1
+ >>> shipment1.locations.append(Location(pallet.id))
+ >>> shipment1.click('wait')
+
+ >>> shipment2 = Shipment()
+ >>> shipment2.from_location = storage2
+ >>> shipment2.to_location = storage1
+ >>> shipment2.locations.append(Location(pallet.id))
+ >>> shipment2.click('wait')
+
+ >>> shipment1.click('assign_try')
+ True
+ >>> shipment2.click('assign_try') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ AssignError: ...
+
+ >>> shipment1.click('done')
+
+Add lead time between warehouses::
+
+ >>> warehouse1 = storage_loc.warehouse
+ >>> warehouse2, = warehouse1.duplicate()
+
+ >>> LeadTime = Model.get('stock.location.lead_time')
+ >>> lead_time = LeadTime()
+ >>> lead_time.warehouse_from = warehouse1
+ >>> lead_time.warehouse_to = warehouse2
+ >>> lead_time.lead_time = datetime.timedelta(1)
+ >>> lead_time.save()
+
+Move pallet from storage1 to storage2 with lead_time::
+
+ >>> Shipment = Model.get('stock.shipment.internal')
+ >>> shipment = Shipment()
+ >>> shipment.planned_date = tomorrow
+ >>> shipment.from_location = warehouse1.storage_location
+ >>> shipment.to_location = warehouse2.storage_location
+ >>> shipment.locations.append(Location(pallet.id))
+ >>> shipment.click('wait')
+ >>> shipment.click('assign_try')
+ True
+
+ >>> shipment.click('ship')
+ >>> pallet.reload()
+ >>> pallet.parent == shipment.transit_location
+ True
+
+ >>> shipment.click('done')
+ >>> pallet.reload()
+ >>> pallet.parent == warehouse2.storage_location
+ True
diff --git a/modules/stock_location_move/tests/scenario_stock_location_move_empty.rst b/modules/stock_location_move/tests/scenario_stock_location_move_empty.rst
new file mode 100644
index 0000000000..128cd4c3d7
--- /dev/null
+++ b/modules/stock_location_move/tests/scenario_stock_location_move_empty.rst
@@ -0,0 +1,162 @@
+==================================
+Stock Location Move Empty Scenario
+==================================
+
+Imports::
+
+ >>> import datetime
+ >>> 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()
+ >>> yesterday = today - datetime.timedelta(1)
+ >>> tomorrow = today + datetime.timedelta(1)
+
+Activate modules::
+
+ >>> config = activate_modules('stock_location_move')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> storage1 = Location(name="Storage 1", parent=storage_loc)
+ >>> storage1.save()
+ >>> pallet1 = Location(name="Pallet 1", parent=storage_loc, movable=True)
+ >>> pallet1.save()
+ >>> pallet2 = Location(name="Pallet 2", parent=storage_loc, movable=True)
+ >>> pallet2.save()
+ >>> pallet3 = Location(name="Pallet 3", parent=storage_loc, movable=True)
+ >>> pallet3.save()
+
+Create products::
+
+ >>> 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(0)
+ >>> template.save()
+ >>> product1 = Product()
+ >>> product1.template = template
+ >>> product1.save()
+ >>> product2 = Product()
+ >>> product2.template = template
+ >>> product2.save()
+ >>> product3 = Product()
+ >>> product3.template = template
+ >>> product3.save()
+
+Fill storage locations::
+
+ >>> StockMove = Model.get('stock.move')
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product1
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.unit_price = Decimal('0')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = storage1
+ >>> incoming_move.effective_date = yesterday
+ >>> incoming_move.click('do')
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product2
+ >>> incoming_move.quantity = 1
+ >>> incoming_move.unit_price = Decimal('0')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = pallet1
+ >>> incoming_move.effective_date = yesterday
+ >>> incoming_move.click('do')
+
+ >>> incoming_move = StockMove()
+ >>> incoming_move.product = product3
+ >>> incoming_move.quantity = 2
+ >>> incoming_move.unit_price = Decimal('0')
+ >>> incoming_move.currency = company.currency
+ >>> incoming_move.from_location = supplier_loc
+ >>> incoming_move.to_location = pallet2
+ >>> incoming_move.effective_date = yesterday
+ >>> incoming_move.click('do')
+
+Ship 1 product from the locations::
+
+ >>> ShipmentOut = Model.get('stock.shipment.out')
+ >>> shipment = ShipmentOut()
+ >>> shipment.customer = customer
+ >>> shipment.warehouse = warehouse_loc
+ >>> move = shipment.outgoing_moves.new()
+ >>> move.product = product1
+ >>> move.quantity = 1
+ >>> move.unit_price = Decimal('0')
+ >>> move.currency = company.currency
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> move = shipment.outgoing_moves.new()
+ >>> move.product = product2
+ >>> move.quantity = 1
+ >>> move.unit_price = Decimal('0')
+ >>> move.currency = company.currency
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> move = shipment.outgoing_moves.new()
+ >>> move.product = product3
+ >>> move.quantity = 1
+ >>> move.unit_price = Decimal('0')
+ >>> move.currency = company.currency
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> shipment.click('wait')
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.click('pick')
+ >>> shipment.click('pack')
+ >>> shipment.click('done')
+
+Check empty non movable location are still active::
+
+ >>> storage1.reload()
+ >>> bool(storage1.active)
+ True
+
+Check empty location are deactivated::
+
+ >>> pallet1.reload()
+ >>> bool(pallet1.active)
+ False
+
+Check non empty location are still active::
+
+ >>> pallet2.reload()
+ >>> bool(pallet2.active)
+ True
+
+Check non changed empty location are still active::
+
+ >>> pallet3.reload()
+ >>> bool(pallet3.active)
+ True
diff --git a/modules/stock_location_move/tests/scenario_stock_location_move_supply.rst b/modules/stock_location_move/tests/scenario_stock_location_move_supply.rst
new file mode 100644
index 0000000000..a5ec42803c
--- /dev/null
+++ b/modules/stock_location_move/tests/scenario_stock_location_move_supply.rst
@@ -0,0 +1,111 @@
+==========================
+Stock Location Move Supply
+==========================
+
+Imports::
+
+ >>> import datetime
+ >>> 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(['stock_location_move', 'stock_supply'])
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> provisioning_loc = Location(
+ ... name="Provisioning Location", parent=warehouse_loc)
+ >>> provisioning_loc.save()
+ >>> pallet = Location(name="Pallet", parent=provisioning_loc, movable=True)
+ >>> pallet.save()
+
+Create products::
+
+ >>> 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(0)
+ >>> template.save()
+ >>> product = Product()
+ >>> product.template = template
+ >>> product.save()
+
+Create internal order point::
+
+ >>> OrderPoint = Model.get('stock.order_point')
+ >>> order_point = OrderPoint()
+ >>> order_point.product = product
+ >>> order_point.storage_location = storage_loc
+ >>> order_point.provisioning_location = provisioning_loc
+ >>> order_point.type = 'internal'
+ >>> order_point.min_quantity = 2
+ >>> order_point.target_quantity = 2
+ >>> order_point.save()
+
+Fill pallet::
+
+ >>> Inventory = Model.get('stock.inventory')
+ >>> inventory = Inventory()
+ >>> inventory.location = pallet
+ >>> inventory_line = inventory.lines.new(product=product)
+ >>> inventory_line.quantity = 1
+ >>> inventory.click('confirm')
+
+Plan moving pallet::
+
+ >>> ShipmentInternal = Model.get('stock.shipment.internal')
+ >>> shipment = ShipmentInternal()
+ >>> shipment.planned_date = today
+ >>> shipment.from_location = provisioning_loc
+ >>> shipment.to_location = storage_loc
+ >>> shipment.locations.append(Location(pallet.id))
+ >>> shipment.save()
+
+Execute internal supply::
+
+ >>> Wizard('stock.supply').execute('create_')
+
+Only 1 product is requested::
+
+ >>> shipment, = ShipmentInternal.find([
+ ... ('id', '!=', shipment.id),
+ ... ])
+ >>> shipment.state
+ 'request'
+ >>> move, = shipment.moves
+ >>> move.quantity
+ 1.0
+
+Pallet did not moved::
+
+ >>> pallet.reload()
+ >>> pallet.parent.name
+ 'Provisioning Location'
diff --git a/modules/stock_location_move/tests/test_module.py b/modules/stock_location_move/tests/test_module.py
new file mode 100644
index 0000000000..07d83b344e
--- /dev/null
+++ b/modules/stock_location_move/tests/test_module.py
@@ -0,0 +1,13 @@
+# 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.tests.test_tryton import ModuleTestCase
+
+
+class StockLocationMoveTestCase(ModuleTestCase):
+ 'Test Stock Location Move module'
+ module = 'stock_location_move'
+ extras = ['stock_supply']
+
+
+del ModuleTestCase
diff --git a/modules/stock_location_move/tests/test_scenario.py b/modules/stock_location_move/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/stock_location_move/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock_location_move/tox.ini b/modules/stock_location_move/tox.ini
new file mode 100644
index 0000000000..31f227721f
--- /dev/null
+++ b/modules/stock_location_move/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_location_move/* -m unittest discover -s tests
+ coverage report --include=./**/stock_location_move/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_location_move/tryton.cfg b/modules/stock_location_move/tryton.cfg
new file mode 100644
index 0000000000..2841dcfc21
--- /dev/null
+++ b/modules/stock_location_move/tryton.cfg
@@ -0,0 +1,10 @@
+[tryton]
+version=6.7.0
+depends:
+ ir
+ stock
+extras_depend:
+ stock_supply
+xml:
+ stock.xml
+ message.xml
diff --git a/modules/stock_location_move/view/location_form.xml b/modules/stock_location_move/view/location_form.xml
new file mode 100644
index 0000000000..c4105b2e65
--- /dev/null
+++ b/modules/stock_location_move/view/location_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_location_move/view/shipment_internal_form.xml b/modules/stock_location_move/view/shipment_internal_form.xml
new file mode 100644
index 0000000000..baf5458182
--- /dev/null
+++ b/modules/stock_location_move/view/shipment_internal_form.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_location_sequence/.drone.yml b/modules/stock_location_sequence/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/stock_location_sequence/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_location_sequence/.flake8 b/modules/stock_location_sequence/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_location_sequence/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_location_sequence/.isort.cfg b/modules/stock_location_sequence/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_location_sequence/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_location_sequence/CHANGELOG b/modules/stock_location_sequence/CHANGELOG
new file mode 100644
index 0000000000..cb4a43cc28
--- /dev/null
+++ b/modules/stock_location_sequence/CHANGELOG
@@ -0,0 +1,89 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-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
+* 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
+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-12
+* Bug fixes (see mercurial logs for details)
+
+Version 1.4.0 - 2009-10-19
+* Bug fixes (see mercurial logs for details)
+
+Version 1.2.0 - 2009-04-20
+* Initial release
diff --git a/modules/stock_location_sequence/COPYRIGHT b/modules/stock_location_sequence/COPYRIGHT
new file mode 100644
index 0000000000..068e2b6331
--- /dev/null
+++ b/modules/stock_location_sequence/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2008-2022 Cédric Krier.
+Copyright (C) 2008-2012 Bertrand Chenal.
+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/stock_location_sequence/LICENSE b/modules/stock_location_sequence/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_location_sequence/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/stock_location_sequence/MANIFEST.in b/modules/stock_location_sequence/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_location_sequence/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_location_sequence/README.rst b/modules/stock_location_sequence/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_location_sequence/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_location_sequence/__init__.py b/modules/stock_location_sequence/__init__.py
new file mode 100644
index 0000000000..edaacbf806
--- /dev/null
+++ b/modules/stock_location_sequence/__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 stock
+
+
+def register():
+ Pool.register(
+ stock.Location,
+ module='stock_location_sequence', type_='model')
diff --git a/modules/stock_location_sequence/doc/index.rst b/modules/stock_location_sequence/doc/index.rst
new file mode 100644
index 0000000000..73372bfb77
--- /dev/null
+++ b/modules/stock_location_sequence/doc/index.rst
@@ -0,0 +1,4 @@
+Stock Location Sequence Module
+##############################
+
+The stock location sequence module adds ordering to location.
diff --git a/modules/stock_location_sequence/locale/bg.po b/modules/stock_location_sequence/locale/bg.po
new file mode 100644
index 0000000000..6b4a36f8d9
--- /dev/null
+++ b/modules/stock_location_sequence/locale/bg.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Последователност"
diff --git a/modules/stock_location_sequence/locale/ca.po b/modules/stock_location_sequence/locale/ca.po
new file mode 100644
index 0000000000..dc825b67bb
--- /dev/null
+++ b/modules/stock_location_sequence/locale/ca.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Seqüència"
diff --git a/modules/stock_location_sequence/locale/cs.po b/modules/stock_location_sequence/locale/cs.po
new file mode 100644
index 0000000000..f0ab631935
--- /dev/null
+++ b/modules/stock_location_sequence/locale/cs.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr ""
diff --git a/modules/stock_location_sequence/locale/de.po b/modules/stock_location_sequence/locale/de.po
new file mode 100644
index 0000000000..a648250dbd
--- /dev/null
+++ b/modules/stock_location_sequence/locale/de.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Reihenfolge"
diff --git a/modules/stock_location_sequence/locale/es.po b/modules/stock_location_sequence/locale/es.po
new file mode 100644
index 0000000000..6056d4dfb3
--- /dev/null
+++ b/modules/stock_location_sequence/locale/es.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Secuencia"
diff --git a/modules/stock_location_sequence/locale/es_419.po b/modules/stock_location_sequence/locale/es_419.po
new file mode 100644
index 0000000000..f0ab631935
--- /dev/null
+++ b/modules/stock_location_sequence/locale/es_419.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr ""
diff --git a/modules/stock_location_sequence/locale/et.po b/modules/stock_location_sequence/locale/et.po
new file mode 100644
index 0000000000..82b9214fb9
--- /dev/null
+++ b/modules/stock_location_sequence/locale/et.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Järjestus"
diff --git a/modules/stock_location_sequence/locale/fa.po b/modules/stock_location_sequence/locale/fa.po
new file mode 100644
index 0000000000..f23264517d
--- /dev/null
+++ b/modules/stock_location_sequence/locale/fa.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "ادامه"
diff --git a/modules/stock_location_sequence/locale/fi.po b/modules/stock_location_sequence/locale/fi.po
new file mode 100644
index 0000000000..f0ab631935
--- /dev/null
+++ b/modules/stock_location_sequence/locale/fi.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr ""
diff --git a/modules/stock_location_sequence/locale/fr.po b/modules/stock_location_sequence/locale/fr.po
new file mode 100644
index 0000000000..fca827bcef
--- /dev/null
+++ b/modules/stock_location_sequence/locale/fr.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Séquence"
diff --git a/modules/stock_location_sequence/locale/hu.po b/modules/stock_location_sequence/locale/hu.po
new file mode 100644
index 0000000000..b47ea95bc7
--- /dev/null
+++ b/modules/stock_location_sequence/locale/hu.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Sorrend"
diff --git a/modules/stock_location_sequence/locale/id.po b/modules/stock_location_sequence/locale/id.po
new file mode 100644
index 0000000000..34e2e7a197
--- /dev/null
+++ b/modules/stock_location_sequence/locale/id.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Urutan"
diff --git a/modules/stock_location_sequence/locale/it.po b/modules/stock_location_sequence/locale/it.po
new file mode 100644
index 0000000000..5947eebb59
--- /dev/null
+++ b/modules/stock_location_sequence/locale/it.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Sequenza"
diff --git a/modules/stock_location_sequence/locale/lo.po b/modules/stock_location_sequence/locale/lo.po
new file mode 100644
index 0000000000..15dcc80f03
--- /dev/null
+++ b/modules/stock_location_sequence/locale/lo.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "ລໍາດັບ"
diff --git a/modules/stock_location_sequence/locale/lt.po b/modules/stock_location_sequence/locale/lt.po
new file mode 100644
index 0000000000..f0ab631935
--- /dev/null
+++ b/modules/stock_location_sequence/locale/lt.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr ""
diff --git a/modules/stock_location_sequence/locale/nl.po b/modules/stock_location_sequence/locale/nl.po
new file mode 100644
index 0000000000..64b692f28f
--- /dev/null
+++ b/modules/stock_location_sequence/locale/nl.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Reeks"
diff --git a/modules/stock_location_sequence/locale/pl.po b/modules/stock_location_sequence/locale/pl.po
new file mode 100644
index 0000000000..2a81c5afca
--- /dev/null
+++ b/modules/stock_location_sequence/locale/pl.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Kolejność"
diff --git a/modules/stock_location_sequence/locale/pt.po b/modules/stock_location_sequence/locale/pt.po
new file mode 100644
index 0000000000..6c22676c16
--- /dev/null
+++ b/modules/stock_location_sequence/locale/pt.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Sequência"
diff --git a/modules/stock_location_sequence/locale/ro.po b/modules/stock_location_sequence/locale/ro.po
new file mode 100644
index 0000000000..6dbade116b
--- /dev/null
+++ b/modules/stock_location_sequence/locale/ro.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Secvenţă"
diff --git a/modules/stock_location_sequence/locale/ru.po b/modules/stock_location_sequence/locale/ru.po
new file mode 100644
index 0000000000..e977e853c6
--- /dev/null
+++ b/modules/stock_location_sequence/locale/ru.po
@@ -0,0 +1,8 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Последовательность"
diff --git a/modules/stock_location_sequence/locale/sl.po b/modules/stock_location_sequence/locale/sl.po
new file mode 100644
index 0000000000..b62c60e11c
--- /dev/null
+++ b/modules/stock_location_sequence/locale/sl.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Zap.št."
diff --git a/modules/stock_location_sequence/locale/tr.po b/modules/stock_location_sequence/locale/tr.po
new file mode 100644
index 0000000000..478a3db38b
--- /dev/null
+++ b/modules/stock_location_sequence/locale/tr.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "Sıra"
diff --git a/modules/stock_location_sequence/locale/uk.po b/modules/stock_location_sequence/locale/uk.po
new file mode 100644
index 0000000000..f0ab631935
--- /dev/null
+++ b/modules/stock_location_sequence/locale/uk.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr ""
diff --git a/modules/stock_location_sequence/locale/zh_CN.po b/modules/stock_location_sequence/locale/zh_CN.po
new file mode 100644
index 0000000000..798af85267
--- /dev/null
+++ b/modules/stock_location_sequence/locale/zh_CN.po
@@ -0,0 +1,7 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.location,sequence:"
+msgid "Sequence"
+msgstr "序列"
diff --git a/modules/stock_location_sequence/setup.py b/modules/stock_location_sequence/setup.py
new file mode 100755
index 0000000000..612f16f17b
--- /dev/null
+++ b/modules/stock_location_sequence/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 find_packages, setup
+
+
+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_stock_location_sequence'
+
+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'))
+
+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 sequence on location',
+ 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/stock_location_sequence',
+ },
+ keywords='tryton stock location sequence',
+ package_dir={'trytond.modules.stock_location_sequence': '.'},
+ packages=(
+ ['trytond.modules.stock_location_sequence']
+ + ['trytond.modules.stock_location_sequence.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_location_sequence': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_location_sequence = trytond.modules.stock_location_sequence
+ """,
+ )
diff --git a/modules/stock_location_sequence/stock.py b/modules/stock_location_sequence/stock.py
new file mode 100644
index 0000000000..08184678da
--- /dev/null
+++ b/modules/stock_location_sequence/stock.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 import sequence_ordered
+from trytond.pool import PoolMeta
+
+
+class Location(sequence_ordered(), metaclass=PoolMeta):
+ __name__ = 'stock.location'
diff --git a/modules/stock_location_sequence/stock.xml b/modules/stock_location_sequence/stock.xml
new file mode 100644
index 0000000000..3cea5849e5
--- /dev/null
+++ b/modules/stock_location_sequence/stock.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ stock.location
+
+
+ location_form
+
+
+
diff --git a/modules/stock_location_sequence/tests/__init__.py b/modules/stock_location_sequence/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_location_sequence/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_location_sequence/tests/test_module.py b/modules/stock_location_sequence/tests/test_module.py
new file mode 100644
index 0000000000..d901cd7560
--- /dev/null
+++ b/modules/stock_location_sequence/tests/test_module.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.tests.test_tryton import ModuleTestCase
+
+
+class StockLocationSequenceTestCase(ModuleTestCase):
+ 'Test StockLocationSequence module'
+ module = 'stock_location_sequence'
+
+
+del ModuleTestCase
diff --git a/modules/stock_location_sequence/tox.ini b/modules/stock_location_sequence/tox.ini
new file mode 100644
index 0000000000..189eabf611
--- /dev/null
+++ b/modules/stock_location_sequence/tox.ini
@@ -0,0 +1,16 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+commands =
+ coverage run --include=./**/stock_location_sequence/* -m unittest discover -s tests
+ coverage report --include=./**/stock_location_sequence/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_location_sequence/tryton.cfg b/modules/stock_location_sequence/tryton.cfg
new file mode 100644
index 0000000000..ec73702285
--- /dev/null
+++ b/modules/stock_location_sequence/tryton.cfg
@@ -0,0 +1,7 @@
+[tryton]
+version=6.7.0
+depends:
+ ir
+ stock
+xml:
+ stock.xml
diff --git a/modules/stock_location_sequence/view/location_form.xml b/modules/stock_location_sequence/view/location_form.xml
new file mode 100644
index 0000000000..d1faf82d9a
--- /dev/null
+++ b/modules/stock_location_sequence/view/location_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/.drone.yml b/modules/stock_lot/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/stock_lot/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_lot/.flake8 b/modules/stock_lot/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_lot/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_lot/.isort.cfg b/modules/stock_lot/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_lot/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_lot/CHANGELOG b/modules/stock_lot/CHANGELOG
new file mode 100644
index 0000000000..e18a172206
--- /dev/null
+++ b/modules/stock_lot/CHANGELOG
@@ -0,0 +1,89 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Synchronize lot on drop shipment
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add lot to assign criteria if not empty
+* Add lot traceability
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+* Add wizard to add lots
+* Allow lot sequence number to be configured on product
+* Add lots_by_locations Model
+
+Version 5.8.0 - 2020-11-02
+* Bug fixes (see mercurial logs for details)
+* Remove support for Python 3.5
+* Add relate to locations quantity
+* Add lots by warehouse relate
+
+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)
+* Use MultiSelection for lot_required
+* Synchronize lot on internal shipment
+
+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)
+* Allow to count inventory by lot
+* Remove support for Python 2.7
+* Check no move when modify product of lot
+
+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 entry to show lot quantities
+
+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)
+* Adapt inventory to use grouping
+
+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)
+* Add relate from lot to moves
+
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+* Add quantity and forecast_quantity fields on Lot
+* Add lot in inventory
+* Add Period Cache per lot
+
+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-07-31
+* Initial release
diff --git a/modules/stock_lot/COPYRIGHT b/modules/stock_lot/COPYRIGHT
new file mode 100644
index 0000000000..03f4719f79
--- /dev/null
+++ b/modules/stock_lot/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/stock_lot/LICENSE b/modules/stock_lot/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_lot/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/stock_lot/MANIFEST.in b/modules/stock_lot/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_lot/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_lot/README.rst b/modules/stock_lot/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_lot/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_lot/__init__.py b/modules/stock_lot/__init__.py
new file mode 100644
index 0000000000..2021916f1e
--- /dev/null
+++ b/modules/stock_lot/__init__.py
@@ -0,0 +1,44 @@
+# 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, stock
+from .stock import LotMixin
+
+__all__ = ['LotMixin', 'register']
+
+
+def register():
+ Pool.register(
+ stock.Lot,
+ stock.LotTrace,
+ stock.LotByLocationContext,
+ stock.LotsByLocations,
+ stock.LotByWarehouseContext,
+ stock.Location,
+ stock.Move,
+ stock.MoveAddLotsStart,
+ stock.MoveAddLotsStartLot,
+ stock.ShipmentIn,
+ stock.ShipmentOut,
+ stock.ShipmentOutReturn,
+ stock.ShipmentInternal,
+ stock.Period,
+ stock.PeriodCacheLot,
+ stock.Inventory,
+ stock.InventoryLine,
+ stock.InventoryCountSearch,
+ product.Configuration,
+ product.ConfigurationDefaultLotSequence,
+ product.Template,
+ product.Product,
+ module='stock_lot', type_='model')
+ Pool.register(
+ stock.MoveAddLots,
+ stock.InventoryCount,
+ module='stock_lot', type_='wizard')
+ Pool.register(
+ stock.ShipmentDrop,
+ module='stock_lot', type_='model',
+ depends=['sale_supply_drop_shipment'])
diff --git a/modules/stock_lot/doc/index.rst b/modules/stock_lot/doc/index.rst
new file mode 100644
index 0000000000..b4bd2b2c8a
--- /dev/null
+++ b/modules/stock_lot/doc/index.rst
@@ -0,0 +1,11 @@
+Stock Lot Module
+################
+
+The stock lot module defines lot of products.
+
+Lot
+***
+
+A lot is by default just a number to tag moves.
+It is possible to define per product when the lot is required by selecting the
+type of location involved in the move.
diff --git a/modules/stock_lot/ir.xml b/modules/stock_lot/ir.xml
new file mode 100644
index 0000000000..91a87901a7
--- /dev/null
+++ b/modules/stock_lot/ir.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ Stock Lot
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/locale/bg.po b/modules/stock_lot/locale/bg.po
new file mode 100644
index 0000000000..2625747b23
--- /dev/null
+++ b/modules/stock_lot/locale/bg.po
@@ -0,0 +1,491 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Въведете партида"
+
+#, fuzzy
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Въведете партида"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Въведете партида"
+
+#, fuzzy
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Въведете партида"
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Партида"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Планирано количество"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Записано на"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Партида"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Планирано количество"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Партида"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Записано на"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Местоположение"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Записано на"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Партида"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Количество"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Количество"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Вътрешно количество"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Местоположение"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Партида"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Период"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Продукт"
+
+#, fuzzy
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Вида местонахождение за което е необходима партидата"
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Вида местонахождение за което е необходима партидата"
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Планирано количество"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Планирано количество"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Местоположение"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Наличност на партида"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Наличност на партида"
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Местоположение"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Партида"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Партиди"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/ca.po b/modules/stock_lot/locale/ca.po
new file mode 100644
index 0000000000..ff1e4ac60a
--- /dev/null
+++ b/modules/stock_lot/locale/ca.po
@@ -0,0 +1,445 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr "Seqüència de lot per defecte"
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr "Seqüència de lot per defecte"
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Lot obligatori"
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Seqüència del lot"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Lot obligatori"
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Seqüència del lot"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr "UdM per defecte"
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Dígits de l'unitat per defecte"
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantitat prevista"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr "Té seqüència"
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr "Document"
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr "Traçabilitat descendent"
+
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr "Albarà"
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr "Traçabilitat ascendent"
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "A data"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "A data"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "UdM per defecte"
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Decimals de la UdM per defecte"
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantitat prevista"
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "A data"
+
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Ubicacions"
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "A data"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr "Duplica número de lot"
+
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Quantitat restant"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr "Té seqüència"
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Quantitat"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr "Precàlculs de lot"
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantitat interna"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Període"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "El tipus d'ubicació per la qual el lot és obligatori."
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr "La seqüència utilitzada per numerar automàticament els lots."
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "El tipus d'ubicació per la qual el lot és obligatori."
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr "La seqüència utilitzada per numerar automàticament els lots."
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Permet calcular les quantitats previstes per a aquesta data.\n"
+"* Un valor buit és un data infinita en el futur.\n"
+"* Una data en el passat proporcionarà valors històrics."
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Permet calcular les quantitats previstes per a aquesta data.\n"
+"* Un valor buit és un data infinita en el futur.\n"
+"* Una data en el passat proporcionarà valors històrics."
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr "El nombre de vegades que s’ha de duplicar el lot."
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Quantitat per ubicacions (llistat)"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Quantitat per ubicacions"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr "Traçabilitat descendent"
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr "Traçabilitat ascendent"
+
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Lots per ubicació"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr "Lots per magatzem"
+
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Afgeix lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr "No podeu canviar el producte d'un lot que te moviments d'existències."
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr "Per moure el producte \"%(product)s\" heu d'especificar-n'he el lot."
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+"La quantitat total \"%(lot_quantity)s\" dels lots ha de ser inferior o igual"
+" a la quantitat \"%(move_quantity)s\" del moviment."
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr "Heu de seleccionar un lot en comptes d'un producte per \"%(product)s\"."
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr "Traçabilitat descendent"
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr "Traçabilitat ascendent"
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr "Duplica lot"
+
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Afegir lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Lot"
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr "Configuració de les seqüències de lots"
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Lot"
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr "Traçabilitat del lot"
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr "Lot per ubicació"
+
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Lots per ubicació"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr "Lots per Magatzem"
+
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Afegir lots"
+
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Afegir lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr "Període d'existències precalculat per lot"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Perdut i trobat"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Intern"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Perdut i trobat"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Intern"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Proveïdor"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr "Restant:"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr "vegades"
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr "Afegeix"
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr "Cancel·la"
diff --git a/modules/stock_lot/locale/cs.po b/modules/stock_lot/locale/cs.po
new file mode 100644
index 0000000000..aeb2eecb10
--- /dev/null
+++ b/modules/stock_lot/locale/cs.po
@@ -0,0 +1,468 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Production"
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lot"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Production"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lot"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lot"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lot"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Production"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lot"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lot"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/de.po b/modules/stock_lot/locale/de.po
new file mode 100644
index 0000000000..e345f5a2cf
--- /dev/null
+++ b/modules/stock_lot/locale/de.po
@@ -0,0 +1,455 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr "Standard Nummernkreis Charge"
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr "Standard Nummernkreis Charge"
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Charge erforderlich für Lagerort"
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Nummernkreis Charge"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Charge erforderlich für Lagerort"
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Nummernkreis Charge"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Charge"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr "Standardeinheit"
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Nachkommastellen Standardmaßeinheit"
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Voraussichtliche Menge"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr "Hat Nummernkreis"
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr "Dokument"
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr "Retrograde Rückverfolgung"
+
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Charge"
+
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr "Lieferung"
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr "Progressive Rückverfolgung"
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Ermittlungsdatum"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Ermittlungsdatum"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "Standardeinheit"
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Standardmaßeinheit Nachkommastellen"
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Voraussichtliche Menge"
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Charge"
+
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Ermittlungsdatum"
+
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Lagerorte"
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Ermittlungsdatum"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Charge"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr "Chargennummer Duplizieren"
+
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Chargen"
+
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Verbleibende Menge"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr "Hat Nummernkreis"
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr "Übergeordnet"
+
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Menge"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr "Caches Charge"
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Interne Menge"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Charge"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Lagerbuchungszeitraum"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Typ des Lagerorts, für den eine Chargen-Nummer erforderlich ist."
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+"Der Nummernkreis der zur automatischen Nummerierung der Chargen verwendet "
+"wird."
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Typ des Lagerorts, für den eine Chargen-Nummer erforderlich ist."
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+"Der Nummernkreis der zur automatischen Nummerierung der Chargen verwendet "
+"wird."
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Den erwarteten Lagerbestand für dieses Datum ermitteln.\n"
+"* Ein leerer Wert bedeutet ein unendliches Datum in der Zukunft.\n"
+"* Ein Wert in der Vergangenheit berechnet historische Werte."
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Den erwarteten Lagerbestand für dieses Datum ermitteln.\n"
+"* Ein leerer Wert bedeutet ein unendliches Datum in der Zukunft.\n"
+"* Ein Wert in der Vergangenheit berechnet historische Werte."
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr "Wie oft die Charge dupliziert werden muss."
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Lagerbestand je Lagerort"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Lagerbestand (Strukturansicht)"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Chargen"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr "Retrograde Rückverfolgung"
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr "Progressive Rückverfolgung"
+
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Chargen pro Lagerort"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr "Chargen pro Logistikstandort"
+
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Chargen Hinzufügen"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+"Der Artikel einer Charge, für die es Warenbewegungen gibt, kann nicht "
+"geändert werden."
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+"Damit der Artikel \"%(product)s\" umgelagert werden kann, muss eine Charge "
+"angegeben werden."
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+"Die Gesamtmenge \"%(lot_quantity)s\" der Chargen muss kleiner oder gleich "
+"der Menge \"%(move_quantity)s\" der Warenbewegung sein."
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+"Für \"%(product)s\" muss eine Charge ausgewählt werden anstatt einem "
+"Artikel."
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr "Retrograde Rückverfolgung"
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr "Progressive Rückverfolgung"
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr "Charge Duplizieren"
+
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Chargen Hinzufügen"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Lager Charge"
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Chargen"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr "Artikel Einstellungen Standardnummernkreise Charge"
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Lager Charge"
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr "Chargenverfolgung"
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr "Chargen nach Lagerort"
+
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Chargen pro Lagerort"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr "Charge nach Logistikstandort"
+
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Chargen Hinzufügen"
+
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Chargen Hinzufügen"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr "Lagerbuchungszeitraum Cache pro Charge"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Inventurdifferenz"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Lager"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Kunde"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Inventurdifferenz"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Produktion"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Lager"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Lieferant"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Charge"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Chargen"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr "Verbleibend:"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr "mal"
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr "Hinzufügen"
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr "Abbrechen"
diff --git a/modules/stock_lot/locale/es.po b/modules/stock_lot/locale/es.po
new file mode 100644
index 0000000000..fc07863cd2
--- /dev/null
+++ b/modules/stock_lot/locale/es.po
@@ -0,0 +1,447 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr "Secuencia de lote por defecto"
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr "Secuencia de lote por defecto"
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Lote obligatorio"
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Secuencia de lote"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Lote obligatorio"
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Secuencia de lote"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lote"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr "UdM por defecto"
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Decimales de unidad por defecto"
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Cantidad prevista"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr "Tiene secuencia"
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr "Documento"
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr "Trazabilidad descendente"
+
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lote"
+
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr "Albarán"
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr "Trazabilidad ascendente"
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "A la fecha"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "A la fecha"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "UdM por defecto"
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Decimales de la UdM por defecto"
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Cantidad prevista"
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lote"
+
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "A la fecha"
+
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Ubicaciones"
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "A la fecha"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lote"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr "Duplicar número de lote"
+
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lotes"
+
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Cantidad restante"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr "Tiene secuencia"
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Cantidad"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr "Lote precalculado"
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Cantidad interna"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lote"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Periodo"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "El tipo de ubicación en la que el lote es obligatorio."
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr "La secuencia usada para numerar automáticamente los lotes."
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "El tipo de ubicación en la que el lote es obligatorio."
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr "La secuencia usada para numerar automáticamente los lotes."
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Permite calcular las cantidades previstas para esta fecha.\n"
+"* Un valor vacío es una fecha infinita en el futuro.\n"
+"* Una fecha en el pasado proporcionará valores históricos."
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Permite calcular las cantidades previstas para esta fecha.\n"
+"* Un valor vacío es una fecha infinita en el futuro.\n"
+"* Una fecha en el pasado proporcionará valores históricos."
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr "El número de veces que el lote debe ser duplicado."
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Cantidad por ubicaciones (listado)"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Cantidad por ubicaciones"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lotes"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr "Trazabilidad descendente"
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr "Trazabilidad ascendente"
+
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Lotes por ubicación"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr "Lotes por almacén"
+
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Añadir lotes"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+"No puede cambiar el producto de un lote que ya tiene movimientos de "
+"existencias."
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr "Para mover el producto \"%(product)s\" debe especificar su lote."
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+"La cantidad total \"%(lot_quantity)s\" de los lotes debe ser menor o igual "
+"que la cantidad \"%(move_quantity)s\" del movimiento."
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr "Debe seleccionar un lote en lugar de un producto en \"%(product)s\"."
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr "Trazabilidad descendente"
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr "Trazabilidad ascendente"
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr "Duplicar lote"
+
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Añadir lotes"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Lote"
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lotes"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr "Configuración de las secuencias de lotes"
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Lote"
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr "Trazabilidad del lote"
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr "Lote por ubicación"
+
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Lotes por ubicación"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr "Lote por almacén"
+
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Añadir lotes"
+
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Añadir lotes"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr "Periodo de existencias precalculado por lote"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Perdido y encontrado"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Interno"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Perdido y encontrado"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Interno"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Proveedor"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lote"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lotes"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr "Restante:"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr "veces"
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr "Añadir"
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr "Cancelar"
diff --git a/modules/stock_lot/locale/es_419.po b/modules/stock_lot/locale/es_419.po
new file mode 100644
index 0000000000..edf309c82f
--- /dev/null
+++ b/modules/stock_lot/locale/es_419.po
@@ -0,0 +1,442 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Lote requerido"
+
+#, fuzzy
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Lote requerido"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Lote requerido"
+
+#, fuzzy
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Lote requerido"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "El tipo de ubicación para la cual el lote es requerido"
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "El tipo de ubicación para la cual el lote es requerido"
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Lote de stock"
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr ""
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Lote de stock"
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr ""
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/et.po b/modules/stock_lot/locale/et.po
new file mode 100644
index 0000000000..2ec65d049b
--- /dev/null
+++ b/modules/stock_lot/locale/et.po
@@ -0,0 +1,476 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Partii nõutav"
+
+#, fuzzy
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Partii nõutav"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Partii nõutav"
+
+#, fuzzy
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Partii nõutav"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Partii"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognoositav kogus"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Kuupäeval"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Partii"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Kuupäeval"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Kuupäeval"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Prognoositav kogus"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Partii"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Kuupäeval"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Asukoht"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Kuupäeval"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Partii"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Partiid"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Kogus"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Number"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Toode"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Kogus"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Sisemine kogus"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Asukoht"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Partii"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Periood"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Toode"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Prognoositav kogus"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Prognoositav kogus"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Partiid"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Asukoht"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Partiid"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Partiid"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Partii laos"
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Partiid"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Partii laos"
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Asukoht"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Partiid"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Partiid"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Klient"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Kaotatud ja leitud"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Tootmine"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Laokoht"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Hankija"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Klient"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Kaotatud ja leitud"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Tootmine"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Laokoht"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Hankija"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Partii"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Partiid"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/fa.po b/modules/stock_lot/locale/fa.po
new file mode 100644
index 0000000000..ae9fdeb98e
--- /dev/null
+++ b/modules/stock_lot/locale/fa.po
@@ -0,0 +1,490 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "قطعه مورد نیاز"
+
+#, fuzzy
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "قطعه مورد نیاز"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "قطعه مورد نیاز"
+
+#, fuzzy
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "قطعه مورد نیاز"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "قطعه"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "مقدار پیش بینی شده"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "محصول"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "در تاریخ"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "قطعه"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "در تاریخ"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "در تاریخ"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "مقدار پیش بینی شده"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "قطعه"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "در تاریخ"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "مکان"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "در تاریخ"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "قطعه"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "قطعهها"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "شماره"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "مقدار/تعداد"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr "مخازن قطعه"
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "مقدار داخلی"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "مکان"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "قطعه"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "دوره زمانی"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "محصول"
+
+#, fuzzy
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "نوع مکانی که نیازمند قطعه میباشد"
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "نوع مکانی که نیازمند قطعه میباشد"
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"اجازه می دهد مقادیرموجودی مورد انتظار را برای این تاریخ محاسبه کنید.\n"
+"* مقدار خالی یک تاریخ درآینده نامحدود است.\n"
+"* یک تاریخ در گذشته ارزش های تاریخی را فراهم می کند."
+
+#, fuzzy
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"اجازه می دهد مقادیرموجودی مورد انتظار را برای این تاریخ محاسبه کنید.\n"
+"* مقدار خالی یک تاریخ درآینده نامحدود است.\n"
+"* یک تاریخ در گذشته ارزش های تاریخی را فراهم می کند."
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "مقدار پیش بینی شده"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "مقدار پیش بینی شده"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "قطعهها"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "قطعه بواسطه مکان"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "قطعهها"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+"شما نمیتوانید محصول زیادی از یک جنس را تغییر دهید که جابجایی اجناس داشته "
+"باشد."
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+"برای جابجایی محصول :\"%(product)s\" شما باید یک قطعه از جنس را ارائه کنید."
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+"شما باید یک مقدار جنس را به جای یک محصول برای \"%(product)s\" انتخاب کنید."
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "قطعهها"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "قطعه موجود"
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "قطعهها"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "قطعه موجود"
+
+#, fuzzy
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr "مخازن قطعه"
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr "قطعه بواسطه مکان"
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "قطعه بواسطه مکان"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "قطعهها"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "قطعهها"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr "موجودی دوره انبار در هر قطعه"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "مشتری"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "گمشده ها و یافته ها"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "تهیه کننده"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "مخزن"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "تأمین کننده"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "مشتری"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "گمشده ها و یافته ها"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "تهیه کننده"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "مخزن"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "تأمین کننده"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "قطعه"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "قطعهها"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/fi.po b/modules/stock_lot/locale/fi.po
new file mode 100644
index 0000000000..6e23f07970
--- /dev/null
+++ b/modules/stock_lot/locale/fi.po
@@ -0,0 +1,466 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Production"
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Production"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Production"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/fr.po b/modules/stock_lot/locale/fr.po
new file mode 100644
index 0000000000..d9136a41df
--- /dev/null
+++ b/modules/stock_lot/locale/fr.po
@@ -0,0 +1,448 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr "Séquence de lot par défaut"
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr "Séquence de lot par défaut"
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Lot requis"
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Séquence de lot"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Lot requis"
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Séquence de lot"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr "UDM par défaut"
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Décimales d'unité par défaut"
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantité prévisionnelle"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr "A une séquence"
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr "Document"
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr "Traces descendantes"
+
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr "Expédition"
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr "Traces ascendantes"
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "À la date"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "À la date"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "UDM par défaut"
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Décimales d'UDM par défaut"
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantité prévisionnelle"
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "À la date"
+
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "À la date"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr "Dupliquer le numéro de lot"
+
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Quantité restante"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr "A une séquence"
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Numéro"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Quantité"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr "Caches de lot"
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantité interne"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Période"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Le type d'emplacement pour lequel un lot est requis."
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr "La séquence utilisée pour numéroter automatiquement les lots."
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Le type d'emplacement pour lequel un lot est requis."
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr "La séquence utilisée pour numéroter automatiquement les lots."
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Permet de calculer les quantités de stock attendues pour cette date.\n"
+"* Une valeur vide est une date infinie dans le futur.\n"
+"* Une date dans le passé fournira les valeurs historiques."
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Permet de calculer les quantités de stock attendues pour cette date.\n"
+"* Une valeur vide est une date infinie dans le futur.\n"
+"* Une date dans le passé fournira les valeurs historiques."
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr "Le nombre de fois que le lot doit être dupliqué."
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Liste des quantités par emplacements"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Arbre des quantité par emplacements"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr "Traces descendantes"
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr "Traces ascendantes"
+
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Lots par emplacements"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr "Lots par entrepôt"
+
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Ajouter des lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+"Vous ne pouvez pas changer le produit d'un lot qui a des mouvements de "
+"stock."
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr "Pour déplacer le produit « %(product)s », vous devez fournir un lot."
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+"La quantité totale « %(lot_quantity)s » des lots doit être inférieure ou "
+"égale à la quantité « %(move_quantity)s » du mouvement."
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+"Vous devez sélectionner un lot au lieu d'un produit pour « %(product)s »."
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr "Traces descendantes"
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr "Traces ascendantes"
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr "Dupliquer le lot"
+
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Ajouter des lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Lot"
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr "Configuration produit Séquence de lot par défaut"
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Lot"
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr "Suivi des lots"
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr "Lot par emplacement"
+
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Lots par emplacements"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr "Lot par entrepôt"
+
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Ajouter des lots"
+
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Ajouter des lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr "Caches de période de stock par lot"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Pertes et surplus"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Magasin"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Client"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Pertes et surplus"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Magasin"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Fournisseur"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr "Restant :"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr "fois"
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr "Ajouter"
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr "Annuler"
diff --git a/modules/stock_lot/locale/hu.po b/modules/stock_lot/locale/hu.po
new file mode 100644
index 0000000000..946e5fa0ac
--- /dev/null
+++ b/modules/stock_lot/locale/hu.po
@@ -0,0 +1,483 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Charge szükséges a raktárhelyhez "
+
+#, fuzzy
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Charge szükséges a raktárhelyhez "
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Charge szükséges a raktárhelyhez"
+
+#, fuzzy
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Charge szükséges a raktárhelyhez "
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Charge"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Előrelátható mennyiség"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Termék"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Utolsó módosítás dátuma"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Charge"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Előrelátható mennyiség"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Charge"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Utolsó módosítás dátuma"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Hely"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Utolsó módosítás dátuma"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Charge"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Szám"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Mennyiség"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr "Caches Charge"
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Belső mennyiség"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Hely"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Charge"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Raktár időszak"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Termék"
+
+#, fuzzy
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Raktárhely típusa, melyhez szükséges Charge szám"
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Raktárhely típusa, melyhez szükséges Charge szám"
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Előrelátható mennyiség"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Előrelátható mennyiség"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Hely"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Raktár Charge"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Raktár Charge"
+
+#, fuzzy
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr "Caches Charge"
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Hely"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr "Raktár Cache időszak Chargenként"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Charge"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Chargen"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/id.po b/modules/stock_lot/locale/id.po
new file mode 100644
index 0000000000..59a821294b
--- /dev/null
+++ b/modules/stock_lot/locale/id.po
@@ -0,0 +1,443 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Tanggal"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr "Dokumen"
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Kuantitas"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Pada Tanggal"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Pada Tanggal"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Pada Tanggal"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Lokasi"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Pada Tanggal"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Gudang"
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Kuantitas"
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Nomor"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr "Induk"
+
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Lokasi"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Periode"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Lokasi"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr ""
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Lokasi"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Pelanggan"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Pelanggan"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Pemasok"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/it.po b/modules/stock_lot/locale/it.po
new file mode 100644
index 0000000000..aa632c3c17
--- /dev/null
+++ b/modules/stock_lot/locale/it.po
@@ -0,0 +1,463 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lotto"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr "UdM predefinita"
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantità prevista"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Numero"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Utente scrittura"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lotto"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantità prevista"
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lotto"
+
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Utente scrittura"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Luogo"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Utente scrittura"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lotto"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lotti"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Quantità"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Numero"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Quantità"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Luogo"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lotto"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Periodo"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Prodotto"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Quantità prevista"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Quantità prevista"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lotti"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Luogo"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lot"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lot"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lotti"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Luogo"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lot"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Perso e ritrovato"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Deposito"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Cliente"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Perso e ritrovato"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Deposito"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Fornitore"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lotto"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lotti"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/lo.po b/modules/stock_lot/locale/lo.po
new file mode 100644
index 0000000000..24ccbce21c
--- /dev/null
+++ b/modules/stock_lot/locale/lo.po
@@ -0,0 +1,482 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+#, fuzzy
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "ວັນທີບັນທຶກ"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "ຈຳນວນພາຍໃນ"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "ວັນທີບັນທຶກ"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "ບ່ອນຢູ່"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "ວັນທີບັນທຶກ"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "ເລກທີ"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "ຈຳນວນ"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "ຈຳນວນພາຍໃນ"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "ບ່ອນຢູ່"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "ໄລຍະ"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "ບ່ອນຢູ່"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "ບ່ອນຢູ່"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "ລໍຮັບຈ່າຍ"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "ຫ້ອງເກັບມ້ຽນຢາ"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "ລໍຮັບຈ່າຍ"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "ຫ້ອງເກັບມ້ຽນຢາ"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "ຜູ້ສະໜອງ"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/lt.po b/modules/stock_lot/locale/lt.po
new file mode 100644
index 0000000000..cef192d912
--- /dev/null
+++ b/modules/stock_lot/locale/lt.po
@@ -0,0 +1,471 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lo"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Pakeitimo data"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lo"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lo"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Pakeitimo data"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Pakeitimo data"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lo"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lo"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lo"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lo"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Production"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lo"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lo"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lo"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Production"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lo"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lo"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lo"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lo"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/nl.po b/modules/stock_lot/locale/nl.po
new file mode 100644
index 0000000000..7466ae79f1
--- /dev/null
+++ b/modules/stock_lot/locale/nl.po
@@ -0,0 +1,448 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr "Standaard batchvolgorde"
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr "Standaard batchvolgorde"
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Batch vereist"
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Batch volgorde"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Batch vereist"
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Batch volgorde"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Batch"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr "Standaard maateenheid"
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "Standaard maateenheid decimalen"
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Verwachte hoeveelheid"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr "Heeft reeks"
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Datum"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr "Document"
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr "Neerwaartse tracering"
+
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Batch"
+
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr "Zending"
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr "Opwaartse tracering"
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Op datum"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Op datum"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "Standaard maateenheid"
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "Standaard maateenheid decimalen"
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Verwachte hoeveelheid"
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Batch"
+
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Op datum"
+
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Locaties"
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Op datum"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Batch"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr "Dupliceer batchnummer"
+
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Batches"
+
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Resterende hoeveelheid"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr "Heeft reeks"
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Nummer"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr "Bovenliggend"
+
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Hoeveelheid"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr "Batch Caches"
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Interne hoeveelheid"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Plaats"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Batch"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Periode"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Het soort locatie waarvoor een batch vereist is."
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr "De volgorde die wordt gebruikt om batches automatisch te nummeren."
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Het soort locatie waarvoor een batch vereist is."
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr "De volgorde die wordt gebruikt om batches automatisch te nummeren."
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Sta toe de verwachte voorraadhoeveelheden voor deze datum te berekenen.\n"
+"* Een lege waarde is een oneindige datum in de toekomst.\n"
+"* Een datum in het verleden levert historische waarden op."
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Sta toe de verwachte voorraadhoeveelheden voor deze datum te berekenen.\n"
+"* Een lege waarde is een oneindige datum in de toekomst.\n"
+"* Een datum in het verleden levert historische waarden op."
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr "Het aantal keren dat de batch gedupliceerd moet worden."
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Lijst met hoeveelheden per locatie"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Boomstructuur met hoeveelheden per locatie"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Batches"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr "Neerwaartse tracering"
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr "Opwaartse tracering"
+
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Batches per locatie"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr "Batches per magazijn"
+
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Batches toevoegen"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+"U kunt het product van een batch die voorraadbewegingen heeft niet wijzigen."
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr "Om product \"%(product)s\" te verplaatsen, moet u een batch opgeven."
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+"De totale hoeveelheid \"%(lot_quantity)s\" van de batches moet kleiner of "
+"gelijk zijn aan de hoeveelheid \"%(move_quantity)s\" van de "
+"voorraadbeweging."
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+"U moet een batch selecteren in plaats van een product voor \"%(product)s\"."
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr "Neerwaartse tracering"
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr "Opwaartse tracering"
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr "Dupliceer batch"
+
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Batches toevoegen"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr "Gebruiker in bedrijven"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Voorraad batch"
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Batches"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr "Productconfiguratie Standaard Batchvolgorde"
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Voorraad batch"
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr "Batch tracering"
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr "Batch per locatie"
+
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Batches per locatie"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr "Batch per magazijn"
+
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Batches toevoegen"
+
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Batches toevoegen"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr "Voorraadperiode Cache per batch"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Klant"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Voorraad verschil"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Magazijn"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Klant"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Voorraad verschil"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Magazijn"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Leverancier"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Batch"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Batches"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr "Overig:"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr "keer"
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr "Toevoegen"
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr "Annuleer"
diff --git a/modules/stock_lot/locale/pl.po b/modules/stock_lot/locale/pl.po
new file mode 100644
index 0000000000..f6f810c31b
--- /dev/null
+++ b/modules/stock_lot/locale/pl.po
@@ -0,0 +1,478 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Na dzień"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Na dzień"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na dzień"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Ilość"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Na dzień"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Lokalizacja"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na dzień"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Ilość"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Numer"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Produkt"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Ilość"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Lokalizacja"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Okres"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Produkt"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Lokalizacja"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Lokalizacja"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/pt.po b/modules/stock_lot/locale/pt.po
new file mode 100644
index 0000000000..2372daa772
--- /dev/null
+++ b/modules/stock_lot/locale/pt.po
@@ -0,0 +1,489 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Lote Obrigatório"
+
+#, fuzzy
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Lote Obrigatório"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Lote Obrigatório"
+
+#, fuzzy
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Lote Obrigatório"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lote"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantidade prevista"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Produto"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Na Data"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lote"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Na Data"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na Data"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Quantidade prevista"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lote"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Na Data"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Localização"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na Data"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lote"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Quantidade"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Número"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Quantidade"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr "Lotes pré-calculados"
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Quantidade interna"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Localização"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lote"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Período"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Produto"
+
+#, fuzzy
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "O tipo de localização para a qual o lote é obrigatório"
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "O tipo de localização para a qual o lote é obrigatório"
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Permite o cálculo esperado das quantidades do estoque para esta data.\n"
+"* Um valor vazio é uma data infinita no futuro.\n"
+"* Uma data no passado mostrará valores históricos."
+
+#, fuzzy
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Permite o cálculo esperado das quantidades do estoque para esta data.\n"
+"* Um valor vazio é uma data infinita no futuro.\n"
+"* Uma data no passado mostrará valores históricos."
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Quantidade prevista"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Quantidade prevista"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Lote Localização"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Lote de estoque"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Lote de estoque"
+
+#, fuzzy
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr "Lotes pré-calculados"
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr "Lote Localização"
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Lote Localização"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr "Período de estoque pré-calculado por lote"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lote"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lotes"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/ro.po b/modules/stock_lot/locale/ro.po
new file mode 100644
index 0000000000..c8ec3fb0e7
--- /dev/null
+++ b/modules/stock_lot/locale/ro.po
@@ -0,0 +1,441 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Perioadă"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Produs"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Locaţii Lista Cantităţi"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Arbore Cantitate Locaţii"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr ""
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr ""
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/ru.po b/modules/stock_lot/locale/ru.po
new file mode 100644
index 0000000000..71c1381064
--- /dev/null
+++ b/modules/stock_lot/locale/ru.po
@@ -0,0 +1,486 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Прогноз количества"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Номер"
+
+#, fuzzy
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+#, fuzzy
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Дата изменения"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Прогноз количества"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Дата изменения"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Местоположение"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Дата изменения"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Кол-во"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Номер"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Кол-во"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Внутреннее количество"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Местоположение"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Период"
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Товарно материальные ценности (ТМЦ)"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Прогноз количества"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Прогноз количества"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Местоположение"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Местоположение"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Заказчик"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Утраченный и обретенный"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Производство"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Хранилище"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Поставщик"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Заказчик"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Утраченный и обретенный"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Производство"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Хранилище"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Поставщик"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/sl.po b/modules/stock_lot/locale/sl.po
new file mode 100644
index 0000000000..d7379d7064
--- /dev/null
+++ b/modules/stock_lot/locale/sl.po
@@ -0,0 +1,489 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "Serija obvezna"
+
+#, fuzzy
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Serija obvezna"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "Serija obvezna"
+
+#, fuzzy
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "Serija obvezna"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Serija"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Predvidena količina"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "Na dan"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Serija"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "Na dan"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na dan"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "Predvidena količina"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Serija"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "Na dan"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Lokacija"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "Na dan"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Serija"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "Količina"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "Številka"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "Količina"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr "Predpomnjene serije"
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "Notranja količina"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "Lokacija"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Serija"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "Obdobje"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "Izdelek"
+
+#, fuzzy
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Tip lokacije, za katero je serija obvezna"
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+#, fuzzy
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr "Tip lokacije, za katero je serija obvezna"
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Omogoča izračun predvidenih zalog na ta dan.\n"
+"* Prazno polje pomeni neskončno v prihodnost.\n"
+"* Pretekli datum daje zgodovino zaloge."
+
+#, fuzzy
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+"Omogoča izračun predvidenih zalog na ta dan.\n"
+"* Prazno polje pomeni neskončno v prihodnost.\n"
+"* Pretekli datum daje zgodovino zaloge."
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "Predvidena količina"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "Predvidena količina"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Serija po lokaciji"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "Serija"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "Serija"
+
+#, fuzzy
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr "Predpomnjene serije"
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr "Serija po lokaciji"
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Serija po lokaciji"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr "Predpomnjena obdobja po serijah"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Serija"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Serije"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/tr.po b/modules/stock_lot/locale/tr.po
new file mode 100644
index 0000000000..6e23f07970
--- /dev/null
+++ b/modules/stock_lot/locale/tr.po
@@ -0,0 +1,466 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "Production"
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "Production"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "Lot"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr "Production"
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Production"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "Lots"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "Customer"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "Lost and Found"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "Production"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "Storage"
+
+#, fuzzy
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "Supplier"
+
+#, fuzzy
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "Lot"
+
+#, fuzzy
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "Lots"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/uk.po b/modules/stock_lot/locale/uk.po
new file mode 100644
index 0000000000..34055af361
--- /dev/null
+++ b/modules/stock_lot/locale/uk.po
@@ -0,0 +1,437 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr ""
+
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr ""
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr ""
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr ""
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr ""
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr ""
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr ""
+
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr ""
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr ""
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr ""
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr ""
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr ""
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/locale/zh_CN.po b/modules/stock_lot/locale/zh_CN.po
new file mode 100644
index 0000000000..992a367691
--- /dev/null
+++ b/modules/stock_lot/locale/zh_CN.po
@@ -0,0 +1,457 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.configuration,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt ""
+"field:product.configuration.default_lot_sequence,default_lot_sequence:"
+msgid "Default Lot Sequence"
+msgstr ""
+
+msgctxt "field:product.product,lot_required:"
+msgid "Lot Required"
+msgstr "需要批次"
+
+#, fuzzy
+msgctxt "field:product.product,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "需要批次"
+
+msgctxt "field:product.template,lot_required:"
+msgid "Lot Required"
+msgstr "需要批次"
+
+#, fuzzy
+msgctxt "field:product.template,lot_sequence:"
+msgid "Lot Sequence"
+msgstr "需要批次"
+
+msgctxt "field:stock.inventory.line,lot:"
+msgid "Lot"
+msgstr "批次"
+
+msgctxt "field:stock.lot,default_uom:"
+msgid "Default UOM"
+msgstr "默认计量单位"
+
+msgctxt "field:stock.lot,default_uom_digits:"
+msgid "Default Unit Digits"
+msgstr "默认单位有效数字"
+
+msgctxt "field:stock.lot,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "预期数量"
+
+msgctxt "field:stock.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+msgctxt "field:stock.lot,number:"
+msgid "Number"
+msgstr "批次号"
+
+msgctxt "field:stock.lot,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:stock.lot,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:stock.lot.trace,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,date:"
+msgid "Date"
+msgstr "日期"
+
+msgctxt "field:stock.lot.trace,document:"
+msgid "Document"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,downward_traces:"
+msgid "Downward Traces"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,lot:"
+msgid "Lot"
+msgstr "批次"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,product:"
+msgid "Product"
+msgstr "产品"
+
+#, fuzzy
+msgctxt "field:stock.lot.trace,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:stock.lot.trace,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot.trace,upward_traces:"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "field:stock.lots_by_location.context,forecast_date:"
+msgid "At Date"
+msgstr "日期"
+
+msgctxt "field:stock.lots_by_location.context,stock_date_end:"
+msgid "At Date"
+msgstr "日期"
+
+msgctxt "field:stock.lots_by_locations,default_uom:"
+msgid "Default UOM"
+msgstr "默认计量单位"
+
+msgctxt "field:stock.lots_by_locations,default_uom_digits:"
+msgid "Default UOM Digits"
+msgstr "默认计量单位有效数字"
+
+msgctxt "field:stock.lots_by_locations,forecast_quantity:"
+msgid "Forecast Quantity"
+msgstr "预期数量"
+
+msgctxt "field:stock.lots_by_locations,lot:"
+msgid "Lot"
+msgstr "批次"
+
+msgctxt "field:stock.lots_by_locations,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "field:stock.lots_by_locations,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:stock.lots_by_warehouse.context,forecast_date:"
+msgid "At Date"
+msgstr "日期"
+
+msgctxt "field:stock.lots_by_warehouse.context,locations:"
+msgid "Locations"
+msgstr "库位"
+
+msgctxt "field:stock.lots_by_warehouse.context,stock_date_end:"
+msgid "At Date"
+msgstr "日期"
+
+msgctxt "field:stock.lots_by_warehouse.context,warehouse:"
+msgid "Warehouse"
+msgstr "仓库"
+
+msgctxt "field:stock.move,lot:"
+msgid "Lot"
+msgstr "批次"
+
+msgctxt "field:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "Duplicate Lot Number"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,lots:"
+msgid "Lots"
+msgstr "批次"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,product:"
+msgid "Product"
+msgstr "产品"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start,quantity_remaining:"
+msgid "Quantity Remaining"
+msgstr "数量"
+
+msgctxt "field:stock.move.add.lots.start,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,has_sequence:"
+msgid "Has Sequence"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,number:"
+msgid "Number"
+msgstr "批次号"
+
+msgctxt "field:stock.move.add.lots.start.lot,parent:"
+msgid "Parent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product:"
+msgid "Product"
+msgstr "产品"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,quantity:"
+msgid "Quantity"
+msgstr "数量"
+
+msgctxt "field:stock.move.add.lots.start.lot,quantity_unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.period,lot_caches:"
+msgid "Lot Caches"
+msgstr "批次缓存"
+
+msgctxt "field:stock.period.cache.lot,internal_quantity:"
+msgid "Internal Quantity"
+msgstr "内部数量"
+
+msgctxt "field:stock.period.cache.lot,location:"
+msgid "Location"
+msgstr "库位"
+
+msgctxt "field:stock.period.cache.lot,lot:"
+msgid "Lot"
+msgstr "批次"
+
+msgctxt "field:stock.period.cache.lot,period:"
+msgid "Period"
+msgstr "周期"
+
+msgctxt "field:stock.period.cache.lot,product:"
+msgid "Product"
+msgstr "产品"
+
+msgctxt "help:product.product,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.product,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:product.template,lot_required:"
+msgid "The type of location for which lot is required."
+msgstr ""
+
+msgctxt "help:product.template,lot_sequence:"
+msgid "The sequence used to automatically number lots."
+msgstr ""
+
+msgctxt "help:stock.lots_by_location.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.lots_by_warehouse.context,forecast_date:"
+msgid ""
+"Allow to compute expected stock quantities for this date.\n"
+"* An empty value is an infinite date in the future.\n"
+"* A date in the past will provide historical values."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start,duplicate_lot_number:"
+msgid "The number of times the lot must be duplicated."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_location_quantity_list"
+msgid "Locations List Quantity"
+msgstr "库位明细数量"
+
+msgctxt "model:ir.action,name:act_location_quantity_tree"
+msgid "Locations Tree Quantity"
+msgstr "库位树数量"
+
+msgctxt "model:ir.action,name:act_lot_form"
+msgid "Lots"
+msgstr "批次"
+
+msgctxt "model:ir.action,name:act_lot_trace_downward_relate"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lot_trace_upward_relate"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lots_by_locations_relate"
+msgid "Lots by Locations"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_lots_by_warehouse_relate"
+msgid "Lots By Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_move_add_lots"
+msgid "Add Lots"
+msgstr "批次"
+
+msgctxt "model:ir.message,text:msg_change_product"
+msgid "You cannot change the product of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_required"
+msgid "To move product \"%(product)s\" you must provide a stock lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_add_lot_quantity"
+msgid ""
+"The total quantity \"%(lot_quantity)s\" of the lots must be less than or "
+"equal to the quantity \"%(move_quantity)s\" of the move."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_only_lot"
+msgid "You must select a stock lot instead of a product for \"%(product)s\"."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_downward_traces_button"
+msgid "Downward Traces"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:lot_upward_traces_button"
+msgid "Upward Traces"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:move_add_lots_start_duplicate_lot_button"
+msgid "Duplicate Lot"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:move_add_lots_wizard_button"
+msgid "Add Lots"
+msgstr "批次"
+
+msgctxt "model:ir.rule.group,name:rule_group_lot_trace_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_stock_lot"
+msgid "Stock Lot"
+msgstr "库存批次"
+
+msgctxt "model:ir.ui.menu,name:menu_lot_form"
+msgid "Lots"
+msgstr "批次"
+
+msgctxt "model:product.configuration.default_lot_sequence,name:"
+msgid "Product Configuration Default Lot Sequence"
+msgstr ""
+
+msgctxt "model:stock.lot,name:"
+msgid "Stock Lot"
+msgstr "库存批次"
+
+#, fuzzy
+msgctxt "model:stock.lot.trace,name:"
+msgid "Lot Trace"
+msgstr "批次缓存"
+
+msgctxt "model:stock.lots_by_location.context,name:"
+msgid "Lot by Location"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.lots_by_locations,name:"
+msgid "Lots by Locations"
+msgstr "Production"
+
+msgctxt "model:stock.lots_by_warehouse.context,name:"
+msgid "Lot by Warehouse"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start,name:"
+msgid "Add Lots"
+msgstr "批次"
+
+#, fuzzy
+msgctxt "model:stock.move.add.lots.start.lot,name:"
+msgid "Add Lots"
+msgstr "批次"
+
+msgctxt "model:stock.period.cache.lot,name:"
+msgid "Stock Period Cache per Lot"
+msgstr ""
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Customer"
+msgstr "客户"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Lost and Found"
+msgstr "失物招领区"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Production"
+msgstr "产品"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Storage"
+msgstr "存储区"
+
+msgctxt "selection:product.product,lot_required:"
+msgid "Supplier"
+msgstr "供应商"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Customer"
+msgstr "客户"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Lost and Found"
+msgstr "失物招领区"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Production"
+msgstr "产品"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Storage"
+msgstr "存储区"
+
+msgctxt "selection:product.template,lot_required:"
+msgid "Supplier"
+msgstr "供应商"
+
+msgctxt "selection:stock.inventory.count.search,search:"
+msgid "Lot"
+msgstr "批次"
+
+msgctxt "view:product.template:"
+msgid "Lots"
+msgstr "批次"
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "Remaining:"
+msgstr ""
+
+msgctxt "view:stock.move.add.lots.start:"
+msgid "times"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,add:"
+msgid "Add"
+msgstr ""
+
+msgctxt "wizard_button:stock.move.add.lots,start,end:"
+msgid "Cancel"
+msgstr ""
diff --git a/modules/stock_lot/message.xml b/modules/stock_lot/message.xml
new file mode 100644
index 0000000000..08b54d5eb7
--- /dev/null
+++ b/modules/stock_lot/message.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ You cannot change the product of a stock lot which has stock moves.
+
+
+ To move product "%(product)s" you must provide a stock lot.
+
+
+ You must select a stock lot instead of a product for "%(product)s".
+
+
+ The total quantity "%(lot_quantity)s" of the lots must be less than or equal to the quantity "%(move_quantity)s" of the move.
+
+
+
diff --git a/modules/stock_lot/product.py b/modules/stock_lot/product.py
new file mode 100644
index 0000000000..4ececa619b
--- /dev/null
+++ b/modules/stock_lot/product.py
@@ -0,0 +1,114 @@
+# 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 sql import Table
+
+from trytond.config import config
+from trytond.model import ModelSQL, ValueMixin, fields
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Eval, Id
+from trytond.transaction import Transaction
+
+
+class Configuration(metaclass=PoolMeta):
+ __name__ = 'product.configuration'
+
+ default_lot_sequence = fields.MultiValue(
+ fields.Many2One(
+ 'ir.sequence', "Default Lot Sequence",
+ domain=[
+ ('sequence_type', '=',
+ Id('stock_lot', 'sequence_type_stock_lot')),
+ ]))
+
+
+class ConfigurationDefaultLotSequence(ModelSQL, ValueMixin):
+ "Product Configuration Default Lot Sequence"
+ __name__ = 'product.configuration.default_lot_sequence'
+ default_lot_sequence = fields.Many2One(
+ 'ir.sequence', "Default Lot Sequence",
+ domain=[
+ ('sequence_type', '=',
+ Id('stock_lot', 'sequence_type_stock_lot')),
+ ])
+
+
+class Template(metaclass=PoolMeta):
+ __name__ = 'product.template'
+
+ lot_required = fields.MultiSelection([
+ ('supplier', "Supplier"),
+ ('customer', "Customer"),
+ ('lost_found', "Lost and Found"),
+ ('storage', "Storage"),
+ ('production', "Production"),
+ ], "Lot Required",
+ help='The type of location for which lot is required.',
+ states={
+ 'invisible': ~Eval('type').in_(['goods', 'assets']),
+ })
+ lot_sequence = fields.Many2One(
+ 'ir.sequence', "Lot Sequence",
+ domain=[
+ ('sequence_type', '=', Id('stock_lot', 'sequence_type_stock_lot')),
+ ],
+ states={
+ 'invisible': ~Eval('type').in_(['goods', 'assets']),
+ },
+ help="The sequence used to automatically number lots.")
+
+ @classmethod
+ def __register__(cls, module):
+ connection = Transaction().connection
+ cursor = connection.cursor()
+
+ super().__register__(module)
+
+ table_h = cls.__table_handler__(module)
+ template_lot_type_table_name = config.get(
+ 'table', 'product.template-stock.lot.type',
+ default='product.template-stock.lot.type' .replace('.', '_'))
+ lot_type_table_name = config.get(
+ 'table', 'stock.lot.type',
+ default='stock.lot.type'.replace('.', '_'))
+
+ # Migration from 5.2: fill lot_required
+ if (table_h.table_exist(template_lot_type_table_name)
+ and table_h.table_exist(lot_type_table_name)):
+ table = cls.__table__()
+ template_lot_type = Table(template_lot_type_table_name)
+ lot_type = Table(lot_type_table_name)
+
+ cursor_select = connection.cursor()
+ cursor_select.execute(*template_lot_type.select(
+ template_lot_type.template,
+ distinct_on=template_lot_type.template))
+ for template_id, in cursor_select:
+ cursor.execute(*template_lot_type
+ .join(lot_type,
+ condition=template_lot_type.type == lot_type.id)
+ .select(
+ lot_type.code,
+ where=template_lot_type.template == template_id))
+ value = cls.lot_required.sql_format([t for t, in cursor])
+ cursor.execute(*table.update(
+ [table.lot_required], [value],
+ where=table.id == template_id))
+ table_h.drop_table('product.template-stock.lot.type',
+ template_lot_type_table_name)
+ table_h.drop_table('stock.lot.type', lot_type_table_name)
+
+ @classmethod
+ def default_lot_sequence(cls, **pattern):
+ pool = Pool()
+ Configuration = pool.get('product.configuration')
+ sequence = Configuration(1).get_multivalue(
+ 'default_lot_sequence', **pattern)
+ return sequence.id if sequence else None
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
+
+ def lot_is_required(self, from_, to):
+ 'Is product lot required for move with "from_" and "to" location ?'
+ return any(l.type in (self.lot_required or []) for l in [from_, to])
diff --git a/modules/stock_lot/product.xml b/modules/stock_lot/product.xml
new file mode 100644
index 0000000000..e36d47b573
--- /dev/null
+++ b/modules/stock_lot/product.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ product.configuration
+
+ product_configuration_form
+
+
+
+ product.template
+
+ template_form
+
+
+
diff --git a/modules/stock_lot/setup.py b/modules/stock_lot/setup.py
new file mode 100755
index 0000000000..bd18b0ebfe
--- /dev/null
+++ b/modules/stock_lot/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 find_packages, setup
+
+
+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_stock_lot'
+
+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'), 'python-dateutil']
+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 lot of 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/',
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": 'https://hg.tryton.org/modules/stock_lot',
+ },
+ keywords='tryton stock lot',
+ package_dir={'trytond.modules.stock_lot': '.'},
+ packages=(
+ ['trytond.modules.stock_lot']
+ + ['trytond.modules.stock_lot.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_lot': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_lot = trytond.modules.stock_lot
+ """,
+ )
diff --git a/modules/stock_lot/stock.py b/modules/stock_lot/stock.py
new file mode 100644
index 0000000000..11b35c179d
--- /dev/null
+++ b/modules/stock_lot/stock.py
@@ -0,0 +1,819 @@
+# 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 copy import copy
+from functools import wraps
+
+from sql import Column
+from sql.functions import CharLength
+
+from trytond.i18n import gettext
+from trytond.model import Index, Model, ModelSQL, ModelView, fields
+from trytond.model.exceptions import (
+ AccessError, RequiredValidationError, ValidationError)
+from trytond.modules.stock import StockMixin
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Bool, Eval, Len
+from trytond.tools import grouped_slice
+from trytond.transaction import Transaction
+from trytond.wizard import Button, StateTransition, StateView, Wizard
+
+
+def check_no_move(func):
+ def find_moves(cls, records, state=None):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ for sub_records in grouped_slice(records):
+ domain = [
+ ('lot', 'in', [r.id for r in sub_records])
+ ]
+ if state:
+ domain.append(('state', '=', state))
+ moves = Move.search(domain, limit=1, order=[])
+ if moves:
+ return True
+ return False
+
+ @wraps(func)
+ def decorator(cls, *args):
+ transaction = Transaction()
+ if (transaction.user != 0
+ and transaction.context.get('_check_access')):
+ actions = iter(args)
+ for records, values in zip(actions, actions):
+ for field, state, error in cls._modify_no_move:
+ if field in values:
+ if find_moves(cls, records, state):
+ raise AccessError(gettext(error))
+ # No moves for those records
+ break
+ func(cls, *args)
+ return decorator
+
+
+class LotMixin:
+ __slots__ = ()
+ number = fields.Char(
+ "Number", required=True,
+ states={
+ 'required': ~Eval('has_sequence') | (Eval('id', -1) >= 0),
+ })
+ product = fields.Many2One('product.product', 'Product', required=True)
+ has_sequence = fields.Function(
+ fields.Boolean("Has Sequence"), 'on_change_with_has_sequence')
+
+ @classmethod
+ def __setup__(cls):
+ cls.number.search_unaccented = False
+ super().__setup__()
+
+ @fields.depends('product')
+ def on_change_with_has_sequence(self, name=None):
+ if self.product:
+ return bool(self.product.lot_sequence)
+
+
+class Lot(ModelSQL, ModelView, LotMixin, StockMixin):
+ "Stock Lot"
+ __name__ = 'stock.lot'
+ _rec_name = 'number'
+
+ quantity = fields.Function(fields.Float('Quantity'), 'get_quantity',
+ searcher='search_quantity')
+ forecast_quantity = fields.Function(fields.Float('Forecast Quantity'),
+ 'get_quantity', searcher='search_quantity')
+ default_uom = fields.Function(
+ fields.Many2One('product.uom', "Default UOM"),
+ 'on_change_with_default_uom')
+ default_uom_digits = fields.Function(fields.Integer("Default Unit Digits"),
+ 'on_change_with_default_uom_digits')
+
+ @classmethod
+ def __setup__(cls):
+ super(Lot, cls).__setup__()
+ cls._modify_no_move = [
+ ('product', None, 'stock_lot.msg_change_product'),
+ ]
+ cls._buttons.update({
+ 'upward_traces': {},
+ 'downward_traces': {},
+ })
+
+ @classmethod
+ def order_number(cls, tables):
+ table, _ = tables[None]
+ return [CharLength(table.number), table.number]
+
+ @classmethod
+ def get_quantity(cls, lots, name):
+ location_ids = Transaction().context.get('locations')
+ product_ids = list(set(l.product.id for l in lots))
+ quantities = {}
+ for product_ids in grouped_slice(product_ids):
+ quantities.update(cls._get_quantity(lots, name, location_ids,
+ grouping=('product', 'lot',),
+ grouping_filter=(list(product_ids),)))
+ return quantities
+
+ @classmethod
+ def search_quantity(cls, name, domain=None):
+ location_ids = Transaction().context.get('locations')
+ return cls._search_quantity(name, location_ids, domain,
+ grouping=('product', 'lot'))
+
+ @fields.depends('product')
+ def on_change_with_default_uom(self, name=None):
+ if self.product:
+ return self.product.default_uom.id
+
+ @fields.depends('product')
+ def on_change_with_default_uom_digits(self, name=None):
+ if self.product:
+ return self.product.default_uom.digits
+
+ @classmethod
+ def create(cls, vlist):
+ vlist = [v.copy() for v in vlist]
+ for values in vlist:
+ if not values.get('number'):
+ values['number'] = cls._new_number(values)
+ return super().create(vlist)
+
+ @classmethod
+ def _new_number(cls, values):
+ pool = Pool()
+ Product = pool.get('product.product')
+ if values.get('product'):
+ product = Product(values['product'])
+ if product.lot_sequence:
+ return product.lot_sequence.get()
+
+ @classmethod
+ @check_no_move
+ def write(cls, *args):
+ super(Lot, cls).write(*args)
+
+ @classmethod
+ @ModelView.button_action('stock_lot.act_lot_trace_upward_relate')
+ def upward_traces(cls, lots):
+ pass
+
+ @classmethod
+ @ModelView.button_action('stock_lot.act_lot_trace_downward_relate')
+ def downward_traces(cls, lots):
+ pass
+
+
+class LotTrace(ModelSQL, ModelView):
+ "Lot Trace"
+ __name__ = 'stock.lot.trace'
+
+ product = fields.Many2One(
+ 'product.product', "Product",
+ context={
+ 'company': Eval('company', -1),
+ },
+ depends=['company'])
+ lot = fields.Many2One('stock.lot', "Lot")
+
+ quantity = fields.Float("Quantity", digits='unit')
+ unit = fields.Many2One('product.uom', "Unit")
+
+ company = fields.Many2One('company.company', "Company")
+ date = fields.Date("Date")
+ shipment = fields.Reference("Shipment", 'get_shipments')
+ document = fields.Function(
+ fields.Reference("Document", 'get_documents'), 'get_document')
+
+ upward_traces = fields.Function(
+ fields.Many2Many(
+ 'stock.lot.trace', None, None, "Upward Traces"),
+ 'get_upward_traces')
+ downward_traces = fields.Function(
+ fields.Many2Many(
+ 'stock.lot.trace', None, None, "Downward Traces"),
+ 'get_downward_traces')
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._order.insert(0, ('date', 'ASC'))
+
+ @classmethod
+ def table_query(cls):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ move = Move.__table__()
+ return (
+ move.select(
+ *cls._columns(move),
+ where=move.state == 'done'))
+
+ @classmethod
+ def _columns(cls, move):
+ return [
+ move.id.as_('id'),
+ move.create_uid.as_('create_uid'),
+ move.create_date.as_('create_date'),
+ move.write_uid.as_('write_uid'),
+ move.write_date.as_('write_date'),
+ move.product.as_('product'),
+ move.lot.as_('lot'),
+ move.quantity.as_('quantity'),
+ move.uom.as_('unit'),
+ move.company.as_('company'),
+ move.effective_date.as_('date'),
+ move.shipment.as_('shipment'),
+ ]
+
+ def get_rec_name(self, name):
+ return self.document.rec_name if self.document else str(self.id)
+
+ @classmethod
+ def get_shipments(cls):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ return Move.get_shipment()
+
+ @classmethod
+ def get_documents(cls):
+ return cls.get_shipments()
+
+ def get_document(self, name):
+ if self.shipment:
+ return str(self.shipment)
+
+ @classmethod
+ def _is_trace_move(cls, move):
+ return move.state == 'done'
+
+ @classmethod
+ def _trace_move_order_key(cls, move):
+ return (move.effective_date,)
+
+ def get_upward_traces(self, name):
+ return list(map(int, sorted(filter(
+ self._is_trace_move, self._get_upward_traces()),
+ key=self._trace_move_order_key)))
+
+ def _get_upward_traces(self):
+ return set()
+
+ def get_downward_traces(self, name):
+ return list(map(int, sorted(filter(
+ self._is_trace_move, self._get_downward_traces()),
+ key=self._trace_move_order_key)))
+
+ def _get_downward_traces(self):
+ return set()
+
+
+class LotByLocationContext(ModelView):
+ 'Lot by Location'
+ __name__ = 'stock.lots_by_location.context'
+ forecast_date = fields.Date(
+ 'At Date', help=('Allow to compute expected '
+ 'stock quantities for this date.\n'
+ '* An empty value is an infinite date in the future.\n'
+ '* A date in the past will provide historical values.'))
+ stock_date_end = fields.Function(fields.Date('At Date'),
+ 'on_change_with_stock_date_end')
+
+ @staticmethod
+ def default_forecast_date():
+ Date = Pool().get('ir.date')
+ return Date.today()
+
+ @fields.depends('forecast_date')
+ def on_change_with_stock_date_end(self, name=None):
+ if self.forecast_date is None:
+ return datetime.date.max
+ return self.forecast_date
+
+
+class LotsByLocations(ModelSQL, ModelView):
+ "Lots by Locations"
+ __name__ = 'stock.lots_by_locations'
+
+ lot = fields.Many2One('stock.lot', "Lot")
+ product = fields.Many2One('product.product', "Product")
+ quantity = fields.Function(
+ fields.Float(
+ "Quantity", digits=(16, Eval('default_uom_digits', 2))),
+ 'get_lot', searcher='search_lot')
+ forecast_quantity = fields.Function(
+ fields.Float(
+ "Forecast Quantity", digits=(16, Eval('default_uom_digits', 2))),
+ 'get_lot', searcher='search_lot')
+ default_uom = fields.Function(
+ fields.Many2One('product.uom', "Default UOM"),
+ 'get_lot', searcher='search_lot')
+ default_uom_digits = fields.Function(
+ fields.Integer("Default UOM Digits"), 'get_lot')
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._order.insert(0, ('lot', 'ASC'))
+ cls._order.insert(1, ('product', 'ASC'))
+
+ @classmethod
+ def table_query(cls):
+ pool = Pool()
+ Lot = pool.get('stock.lot')
+ lot = Lot.__table__()
+ columns = []
+ for fname, field in cls._fields.items():
+ if not hasattr(field, 'set'):
+ if (isinstance(field, fields.Many2One)
+ and field.get_target() == Lot):
+ column = Column(lot, 'id')
+ else:
+ column = Column(lot, fname)
+ columns.append(column.as_(fname))
+ return lot.select(*columns)
+
+ def get_rec_name(self, name):
+ return self.lot.rec_name
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return [('lot.rec_name',) + tuple(clause[1:])]
+
+ def get_lot(self, name):
+ value = getattr(self.lot, name)
+ if isinstance(value, Model):
+ value = value.id
+ return value
+
+ @classmethod
+ def search_lot(cls, name, clause):
+ nested = clause[0][len(name):]
+ return [('lot.' + name + nested, *clause[1:])]
+
+
+class LotByWarehouseContext(LotByLocationContext):
+ "Lot by Warehouse"
+ __name__ = 'stock.lots_by_warehouse.context'
+ warehouse = fields.Many2One(
+ 'stock.location', "Warehouse", required=True,
+ domain=[
+ ('type', '=', 'warehouse'),
+ ],
+ )
+ locations = fields.Function(
+ fields.Many2Many('stock.location', None, None, "Locations"),
+ 'on_change_with_locations')
+
+ @classmethod
+ def default_warehouse(cls):
+ return Pool().get('stock.location').get_default_warehouse()
+
+ @fields.depends('warehouse')
+ def on_change_with_locations(self, name=None):
+ locations = []
+ if self.warehouse:
+ locations.append(self.warehouse.id)
+ return locations
+
+
+class Location(metaclass=PoolMeta):
+ __name__ = 'stock.location'
+
+ @classmethod
+ def _get_quantity_grouping(cls):
+ pool = Pool()
+ Lot = pool.get('stock.lot')
+ context = Transaction().context
+ grouping, grouping_filter, key = super()._get_quantity_grouping()
+ if context.get('lot') is not None:
+ try:
+ lot, = Lot.search([('id', '=', context['lot'])])
+ except ValueError:
+ pass
+ else:
+ grouping = ('product', 'lot',)
+ grouping_filter = ([lot.product.id], [lot.id])
+ key = (lot.product.id, lot.id)
+ return grouping, grouping_filter, key
+
+
+class Move(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+ lot = fields.Many2One('stock.lot', 'Lot',
+ domain=[
+ ('product', '=', Eval('product')),
+ ],
+ states={
+ 'readonly': Eval('state').in_(['cancelled', 'done']),
+ })
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._buttons.update({
+ 'add_lots_wizard': {
+ 'invisible': ~Eval('state').in_(['draft', 'assigned']),
+ 'readonly': Bool(Eval('lot')),
+ 'depends': ['lot', 'state'],
+ },
+ })
+
+ @classmethod
+ @ModelView.button_action('stock_lot.wizard_move_add_lots')
+ def add_lots_wizard(cls, moves):
+ pass
+
+ def check_lot(self):
+ "Check if lot is required"
+ if (self.state == 'done'
+ and self.internal_quantity
+ and not self.lot
+ and self.product.lot_is_required(
+ self.from_location, self.to_location)):
+ raise RequiredValidationError(
+ gettext('stock_lot.msg_lot_required',
+ product=self.product.rec_name))
+
+ @classmethod
+ def validate(cls, moves):
+ super(Move, cls).validate(moves)
+ for move in moves:
+ move.check_lot()
+
+ @classmethod
+ def assign_try(cls, moves, with_childs=True, grouping=('product',)):
+ if 'lot' not in grouping:
+ moves_with_lot, moves_without_lot = [], []
+ for move in moves:
+ if move.lot:
+ moves_with_lot.append(move)
+ else:
+ moves_without_lot.append(move)
+ success = super().assign_try(
+ moves_with_lot, with_childs, grouping=grouping + ('lot',))
+ success &= super().assign_try(
+ moves_without_lot, with_childs, grouping=grouping)
+ else:
+ success = super().assign_try(moves, with_childs, grouping)
+ return success
+
+
+class MoveAddLots(Wizard):
+ "Add Lots"
+ __name__ = 'stock.move.add.lots'
+ start = StateView('stock.move.add.lots.start',
+ 'stock_lot.move_add_lots_start_view_form', [
+ Button("Cancel", 'end', 'tryton-cancel'),
+ Button("Add", 'add', 'tryton-ok', default=True),
+ ])
+ add = StateTransition()
+
+ def default_start(self, fields):
+ default = {}
+ if 'product' in fields:
+ default['product'] = self.record.product.id
+ if 'quantity' in fields:
+ default['quantity'] = self.record.quantity
+ if 'unit' in fields:
+ default['unit'] = self.record.uom.id
+ return default
+
+ def transition_add(self):
+ pool = Pool()
+ Lang = pool.get('ir.lang')
+ Lot = pool.get('stock.lot')
+ lang = Lang.get()
+ quantity_remaining = self.start.on_change_with_quantity_remaining()
+ if quantity_remaining < 0:
+ digits = self.record.uom.digits
+ move_quantity = self.record.quantity
+ lot_quantity = self.record.quantity - quantity_remaining
+ raise ValidationError(gettext(
+ 'stock_lot.msg_move_add_lot_quantity',
+ lot_quantity=lang.format_number(lot_quantity, digits),
+ move_quantity=lang.format_number(move_quantity, digits)))
+ lots = []
+ for line in self.start.lots:
+ lot = line.get_lot(self.record)
+ lots.append(lot)
+ Lot.save(lots)
+ if quantity_remaining:
+ self.record.quantity = quantity_remaining
+ self.record.save()
+ for i, (line, lot) in enumerate(zip(self.start.lots, lots)):
+ if not i and not quantity_remaining:
+ self.record.quantity = line.quantity
+ self.record.lot = lot
+ self.record.save()
+ else:
+ with Transaction().set_context(_stock_move_split=True):
+ self.model.copy([self.record], {
+ 'quantity': line.quantity,
+ 'lot': lot.id,
+ })
+ return 'end'
+
+
+class MoveAddLotsStart(ModelView):
+ "Add Lots"
+ __name__ = 'stock.move.add.lots.start'
+
+ product = fields.Many2One('product.product', "Product", readonly=True)
+ quantity = fields.Float("Quantity", digits='unit', readonly=True)
+ unit = fields.Many2One('product.uom', "Unit", readonly=True)
+ quantity_remaining = fields.Function(
+ fields.Float("Quantity Remaining", digits='unit'),
+ 'on_change_with_quantity_remaining')
+
+ lots = fields.One2Many(
+ 'stock.move.add.lots.start.lot', 'parent', "Lots",
+ domain=[
+ ('product', '=', Eval('product', -1)),
+ ],
+ states={
+ 'readonly': ~Eval('quantity_remaining', 0),
+ })
+
+ duplicate_lot_number = fields.Integer(
+ "Duplicate Lot Number",
+ states={
+ 'invisible': Len(Eval('lots')) != 1,
+ },
+ help="The number of times the lot must be duplicated.")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._buttons.update(
+ duplicate_lot={
+ 'invisible': Len(Eval('lots')) != 1,
+ 'readonly': (~Eval('duplicate_lot_number')
+ | (Eval('duplicate_lot_number', 0) <= 0)),
+ 'depends': ['lots', 'duplicate_lot_number'],
+ },
+ )
+
+ @fields.depends('quantity', 'lots', 'unit')
+ def on_change_with_quantity_remaining(self, name=None):
+ if self.quantity is not None:
+ quantity = self.quantity
+ if self.lots:
+ for lot in self.lots:
+ quantity -= getattr(lot, 'quantity', 0) or 0
+ if self.unit:
+ quantity = self.unit.round(quantity)
+ return quantity
+
+ @ModelView.button_change(
+ 'lots', 'duplicate_lot_number',
+ methods=['on_change_with_quantity_remaining'])
+ def duplicate_lot(self):
+ lots = list(self.lots)
+ template, = self.lots
+ for i in range(self.duplicate_lot_number):
+ lot = copy(template)
+ lot._id = None
+ lots.append(lot)
+ self.lots = lots
+ self.quantity_remaining = self.on_change_with_quantity_remaining()
+
+
+class MoveAddLotsStartLot(ModelView, LotMixin):
+ "Add Lots"
+ __name__ = 'stock.move.add.lots.start.lot'
+
+ parent = fields.Many2One('stock.move.add.lots.start', "Parent")
+ quantity = fields.Float("Quantity", digits='quantity_unit', required=True)
+ quantity_unit = fields.Function(
+ fields.Many2One('product.uom', "Unit"), 'on_change_with_quantity_unit')
+
+ @fields.depends(
+ 'parent', '_parent_parent.quantity_remaining')
+ def on_change_parent(self):
+ if (self.parent
+ and self.parent.quantity_remaining is not None):
+ self.quantity = self.parent.quantity_remaining
+
+ @fields.depends('parent', '_parent_parent.unit')
+ def on_change_with_quantity_unit(self, name=None):
+ if self.parent and self.parent.unit:
+ return self.parent.unit.id
+
+ @fields.depends('number', 'product', methods=['_set_lot_values'])
+ def on_change_number(self):
+ pool = Pool()
+ Lot = pool.get('stock.lot')
+ if self.number and self.product:
+ lots = Lot.search([
+ ('number', '=', self.number),
+ ('product', '=', self.product.id),
+ ])
+ if len(lots) == 1:
+ lot, = lots
+ self._set_lot_values(lot)
+
+ def _set_lot_values(self, lot):
+ pass
+
+ def get_lot(self, move):
+ pool = Pool()
+ Lot = pool.get('stock.lot')
+ values = self._get_lot_values(move)
+ lots = Lot.search(
+ [(k, '=', v) for k, v in values.items()],
+ limit=1)
+ if lots:
+ lot, = lots
+ else:
+ lot = Lot()
+ for k, v in values.items():
+ setattr(lot, k, v)
+ return lot
+
+ def _get_lot_values(self, move):
+ return {
+ 'number': self.number,
+ 'product': move.product,
+ }
+
+
+class ShipmentIn(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in'
+
+ def _get_inventory_move(self, incoming_move):
+ move = super()._get_inventory_move(incoming_move)
+ if move and incoming_move.lot:
+ move.lot = incoming_move.lot
+ return move
+
+
+class ShipmentOut(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out'
+
+ def _get_inventory_move(self, outgoing_move):
+ move = super()._get_inventory_move(outgoing_move)
+ if move and outgoing_move.lot:
+ move.lot = outgoing_move.lot
+ return move
+
+ def _sync_move_key(self, move):
+ return super()._sync_move_key(move) + (('lot', move.lot),)
+
+
+class ShipmentOutReturn(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out.return'
+
+ def _get_inventory_move(self, incoming_move):
+ move = super()._get_inventory_move(incoming_move)
+ if move and incoming_move.lot:
+ move.lot = incoming_move.lot
+ return move
+
+
+class ShipmentInternal(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.internal'
+
+ def _sync_move_key(self, move):
+ return super()._sync_move_key(move) + (('lot', move.lot),)
+
+
+class ShipmentDrop(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.drop'
+
+ def _sync_move_key(self, move):
+ return super()._sync_move_key(move) + (('lot', move.lot),)
+
+
+class Period(metaclass=PoolMeta):
+ __name__ = 'stock.period'
+ lot_caches = fields.One2Many('stock.period.cache.lot', 'period',
+ 'Lot Caches', readonly=True)
+
+ @classmethod
+ def groupings(cls):
+ return super(Period, cls).groupings() + [('product', 'lot')]
+
+ @classmethod
+ def get_cache(cls, grouping):
+ pool = Pool()
+ Cache = super(Period, cls).get_cache(grouping)
+ if grouping == ('product', 'lot'):
+ return pool.get('stock.period.cache.lot')
+ return Cache
+
+
+class PeriodCacheLot(ModelSQL, ModelView):
+ '''
+ Stock Period Cache per Lot
+
+ It is used to store cached computation of stock quantities per lot.
+ '''
+ __name__ = 'stock.period.cache.lot'
+ period = fields.Many2One(
+ 'stock.period', "Period",
+ required=True, readonly=True, ondelete='CASCADE')
+ location = fields.Many2One(
+ 'stock.location', "Location",
+ required=True, readonly=True, ondelete='CASCADE')
+ product = fields.Many2One('product.product', 'Product', required=True,
+ readonly=True, ondelete='CASCADE')
+ lot = fields.Many2One('stock.lot', 'Lot', readonly=True,
+ ondelete='CASCADE')
+ internal_quantity = fields.Float('Internal Quantity', readonly=True)
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ t = cls.__table__()
+ cls._sql_indexes.update({
+ Index(
+ t,
+ (t.period, Index.Equality()),
+ (t.product, Index.Equality()),
+ (t.lot, Index.Equality()),
+ include=[t.internal_quantity]),
+ Index(
+ t,
+ (t.location, Index.Equality())),
+ })
+
+
+class Inventory(metaclass=PoolMeta):
+ __name__ = 'stock.inventory'
+
+ @classmethod
+ def grouping(cls):
+ return super(Inventory, cls).grouping() + ('lot', )
+
+
+class InventoryLine(metaclass=PoolMeta):
+ __name__ = 'stock.inventory.line'
+ lot = fields.Many2One('stock.lot', 'Lot',
+ domain=[
+ ('product', '=', Eval('product')),
+ ],
+ states={
+ 'readonly': Eval('inventory_state') != 'draft',
+ })
+
+ @classmethod
+ def __setup__(cls):
+ super(InventoryLine, cls).__setup__()
+ cls._order.insert(1, ('lot', 'ASC'))
+
+ def get_rec_name(self, name):
+ rec_name = super(InventoryLine, self).get_rec_name(name)
+ if self.lot:
+ rec_name += ' - %s' % self.lot.rec_name
+ return rec_name
+
+ def get_move(self):
+ move = super(InventoryLine, self).get_move()
+ if move:
+ move.lot = self.lot
+ return move
+
+
+class InventoryCount(metaclass=PoolMeta):
+ __name__ = 'stock.inventory.count'
+
+ def default_quantity(self, fields):
+ pool = Pool()
+ Product = pool.get('product.product')
+ inventory = self.record
+ if isinstance(self.search.search, Product):
+ product = self.search.search
+ if product.lot_is_required(
+ inventory.location, inventory.location.lost_found_used):
+ raise RequiredValidationError(
+ gettext('stock_lot.msg_only_lot',
+ product=product.rec_name))
+ return super(InventoryCount, self).default_quantity(fields)
+
+ def get_line_domain(self, inventory):
+ pool = Pool()
+ Lot = pool.get('stock.lot')
+ domain = super(InventoryCount, self).get_line_domain(inventory)
+ if isinstance(self.search.search, Lot):
+ domain.append(('lot', '=', self.search.search.id))
+ return domain
+
+ def get_line_values(self, inventory):
+ pool = Pool()
+ Lot = pool.get('stock.lot')
+ values = super(InventoryCount, self).get_line_values(inventory)
+ if isinstance(self.search.search, Lot):
+ lot = self.search.search
+ values['product'] = lot.product.id
+ values['lot'] = lot.id
+ return values
+
+
+class InventoryCountSearch(metaclass=PoolMeta):
+ __name__ = 'stock.inventory.count.search'
+
+ @classmethod
+ def __setup__(cls):
+ super(InventoryCountSearch, cls).__setup__()
+ cls.search.selection.append(('stock.lot', "Lot"))
diff --git a/modules/stock_lot/stock.xml b/modules/stock_lot/stock.xml
new file mode 100644
index 0000000000..8d64362070
--- /dev/null
+++ b/modules/stock_lot/stock.xml
@@ -0,0 +1,368 @@
+
+
+
+
+
+ stock.lot
+ form
+ lot_form
+
+
+
+ stock.lot
+ tree
+ lot_tree
+
+
+
+ Lots
+ stock.lot
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ upward_traces
+ Upward Traces
+
+
+
+
+ downward_traces
+ Downward Traces
+
+
+
+
+ stock.lot.trace
+ tree
+ upward_traces
+ lot_trace_tree
+
+
+
+ stock.lot.trace
+ tree
+ downward_traces
+ lot_trace_tree
+
+
+
+ Upward Traces
+ stock.lot.trace
+
+
+
+
+
+
+
+
+ form_relate
+ stock.lot,-1
+
+
+
+
+ Downward Traces
+ stock.lot.trace
+
+
+
+
+
+
+
+
+ form_relate
+ stock.lot,-1
+
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.lots_by_location.context
+ form
+ lot_by_location_context_form
+
+
+
+ stock.lots_by_locations
+ tree
+ lots_by_locations_list
+
+
+
+ Lots by Locations
+ stock.lots_by_locations
+
+
+ stock.lots_by_location.context
+
+
+
+
+
+
+
+ tree_open
+ stock.location,-1
+
+
+
+ form_relate
+ stock.location,-1
+
+
+
+
+ stock.lots_by_warehouse.context
+
+ lot_by_warehouse_context_form
+
+
+
+ Lots By Warehouse
+ stock.lots_by_locations
+
+
+ stock.lots_by_warehouse.context
+
+
+
+
+
+
+
+ form_relate
+ product.template,-1
+
+
+
+ form_relate
+ product.product,-1
+
+
+
+
+ Locations Tree Quantity
+ stock.location
+
+
+ stock.lots_by_location.context
+
+
+
+
+
+
+
+ form_relate
+ stock.lot,-1
+
+
+
+
+ Locations List Quantity
+ stock.location
+
+
+ stock.lots_by_location.context
+
+
+
+
+
+
+
+ form_relate
+ stock.lot,-1
+
+
+
+
+ stock.move
+
+ move_form
+
+
+
+ stock.move
+
+ move_tree
+
+
+
+ stock.move
+
+ move_tree
+
+
+
+ stock.move
+
+ move_tree
+
+
+
+ add_lots_wizard
+ Add Lots
+
+
+
+
+ Add Lots
+ stock.move.add.lots
+ stock.move
+
+
+
+ stock.move.add.lots.start
+ form
+ stock_move_add_lots_start_form
+
+
+
+ stock.move.add.lots.start.lot
+ tree
+ stock_move_add_lots_start_lot_list
+
+
+
+ duplicate_lot
+ Duplicate Lot
+
+
+
+
+ stock.period.cache.lot
+ form
+ period_cache_lot_form
+
+
+ stock.period.cache.lot
+ tree
+ period_cache_lot_list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.inventory.line
+
+ inventory_line_form
+
+
+
+ stock.inventory.line
+
+ inventory_line_tree
+
+
+
+ stock.inventory.line
+
+ inventory_line_tree
+
+
+
+
diff --git a/modules/stock_lot/tests/__init__.py b/modules/stock_lot/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_lot/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_lot/tests/scenario_stock_lot_assign_try.rst b/modules/stock_lot/tests/scenario_stock_lot_assign_try.rst
new file mode 100644
index 0000000000..5e2f534caf
--- /dev/null
+++ b/modules/stock_lot/tests/scenario_stock_lot_assign_try.rst
@@ -0,0 +1,123 @@
+=================================
+Stock Lot Assign Request Scenario
+=================================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+
+ >>> from proteus import config, 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('stock_lot')
+ >>> Inventory = Model.get('stock.inventory')
+ >>> Location = Model.get('stock.location')
+ >>> Lot = Model.get('stock.lot')
+ >>> Party = Model.get('party.party')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> ProductUom = Model.get('product.uom')
+ >>> ShipmentOut = Model.get('stock.shipment.out')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer::
+
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create product::
+
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Create lot::
+
+ >>> lot = Lot()
+ >>> lot.number = 'LOT'
+ >>> lot.product = product
+ >>> lot.save()
+
+Get stock locations::
+
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> zone1 = Location(name='Zone1')
+ >>> zone1.parent = storage_loc
+ >>> zone1.type = 'storage'
+ >>> zone1.save()
+ >>> zone2, = zone1.duplicate(default={'name': 'Zone2'})
+
+Add product quantities on zones storage locations::
+
+ >>> inventory = Inventory()
+ >>> inventory.location = zone1
+ >>> inventory_line = inventory.lines.new(product=product)
+ >>> inventory_line.quantity = 100.0
+ >>> inventory_line.expected_quantity = 0.0
+ >>> inventory.click('confirm')
+ >>> inventory.state
+ 'done'
+ >>> inventory = Inventory()
+ >>> inventory.location = zone2
+ >>> inventory_line = inventory.lines.new()
+ >>> inventory_line.product = product
+ >>> inventory_line.lot = lot
+ >>> inventory_line.quantity = 100.0
+ >>> inventory_line.expected_quantity = 0.0
+ >>> inventory.click('confirm')
+ >>> inventory.state
+ 'done'
+
+Create shipment out::
+
+ >>> shipment = ShipmentOut()
+ >>> shipment.planned_date = today
+ >>> shipment.customer = customer
+ >>> shipment.warehouse = warehouse_loc
+ >>> shipment.company = company
+ >>> move = shipment.outgoing_moves.new()
+ >>> move.product = product
+ >>> move.uom = unit
+ >>> move.quantity = 10
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> move.company = company
+ >>> move.unit_price = Decimal('1')
+ >>> move.currency = company.currency
+ >>> shipment.click('wait')
+
+Request specific lot in stock assignation::
+
+ >>> move, = shipment.inventory_moves
+ >>> move.lot = lot
+ >>> move.save()
+
+Assign the shipment::
+
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.state
+ 'assigned'
+ >>> move, = shipment.inventory_moves
+ >>> move.from_location.name
+ 'Zone2'
diff --git a/modules/stock_lot/tests/scenario_stock_lot_move_add.rst b/modules/stock_lot/tests/scenario_stock_lot_move_add.rst
new file mode 100644
index 0000000000..683d1fafd9
--- /dev/null
+++ b/modules/stock_lot/tests/scenario_stock_lot_move_add.rst
@@ -0,0 +1,111 @@
+===========================
+Stock Lot Move Add 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_lot')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+
+Create a move::
+
+ >>> Move = Model.get('stock.move')
+ >>> move = Move()
+ >>> move.from_location = storage_loc
+ >>> move.to_location = customer_loc
+ >>> move.product = product
+ >>> move.quantity = 10
+ >>> move.unit_price = Decimal('20')
+ >>> move.currency = company.currency
+ >>> move.save()
+
+Create a lot::
+
+ >>> Lot = Model.get('stock.lot')
+ >>> lot2 = Lot(number='02', product=product)
+ >>> lot2.save()
+
+Add few lots::
+
+ >>> add_lots = Wizard('stock.move.add.lots', [move])
+ >>> add_lots.form.product== product
+ True
+ >>> add_lots.form.quantity
+ 10.0
+ >>> add_lots.form.unit == unit
+ True
+ >>> add_lots.form.quantity_remaining
+ 10.0
+
+ >>> lot = add_lots.form.lots.new()
+ >>> lot.quantity
+ 10.0
+ >>> lot.number = '01'
+ >>> lot.quantity = 2
+ >>> lot = add_lots.form.lots.new()
+ >>> lot.quantity
+ 8.0
+ >>> lot.number = '02'
+ >>> lot.quantity = 1
+
+ >>> add_lots.execute('add')
+
+Check moves::
+
+ >>> move, = Move.find([('lot.number', '=', '01')])
+ >>> move.quantity
+ 2.0
+ >>> move, = Move.find([('lot.number', '=', '02')])
+ >>> move.quantity
+ 1.0
+ >>> move.lot == lot2
+ True
+ >>> move, = Move.find([('lot', '=', None)])
+ >>> move.quantity
+ 7.0
+
+Add lot to remaining::
+
+ >>> add_lots = Wizard('stock.move.add.lots', [move])
+ >>> lot = add_lots.form.lots.new()
+ >>> lot.number = '03'
+ >>> add_lots.execute('add')
+
+ >>> len(Move.find([]))
+ 3
+ >>> move.lot.number
+ '03'
+ >>> move.quantity
+ 7.0
diff --git a/modules/stock_lot/tests/scenario_stock_lot_number.rst b/modules/stock_lot/tests/scenario_stock_lot_number.rst
new file mode 100644
index 0000000000..da55c438ff
--- /dev/null
+++ b/modules/stock_lot/tests/scenario_stock_lot_number.rst
@@ -0,0 +1,53 @@
+=========================
+Stock Lot Number Scenario
+=========================
+
+Imports::
+
+ >>> from decimal import Decimal
+ >>> from proteus import Model
+ >>> from trytond.tests.tools import activate_modules
+
+Activate modules::
+
+ >>> config = activate_modules('stock_lot')
+
+Create lot sequence::
+
+ >>> Sequence = Model.get('ir.sequence')
+ >>> SequenceType = Model.get('ir.sequence.type')
+ >>> sequence_type, = SequenceType.find(
+ ... [('name', '=', "Stock Lot")], limit=1)
+ >>> sequence = Sequence(name="Lot", sequence_type=sequence_type)
+ >>> sequence.save()
+
+Set default sequence::
+
+ >>> Configuration = Model.get('product.configuration')
+ >>> configuration = Configuration(1)
+ >>> configuration.default_lot_sequence = sequence
+ >>> configuration.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.lot_sequence == sequence
+ True
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.save()
+ >>> product, = template.products
+
+Create lot without number::
+
+ >>> Lot = Model.get('stock.lot')
+ >>> lot = Lot(product=product)
+ >>> lot.save()
+
+ >>> lot.number
+ '1'
diff --git a/modules/stock_lot/tests/scenario_stock_lot_shipment_out.rst b/modules/stock_lot/tests/scenario_stock_lot_shipment_out.rst
new file mode 100644
index 0000000000..c4ffcd1ae1
--- /dev/null
+++ b/modules/stock_lot/tests/scenario_stock_lot_shipment_out.rst
@@ -0,0 +1,130 @@
+===============================
+Stock Lot Shipment Out Scenario
+===============================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import config, 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('stock_lot')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.lot_required = ['storage']
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+
+Create Shipment Out::
+
+ >>> ShipmentOut = Model.get('stock.shipment.out')
+ >>> shipment_out = ShipmentOut()
+ >>> shipment_out.planned_date = today
+ >>> shipment_out.customer = customer
+ >>> shipment_out.warehouse = warehouse_loc
+ >>> shipment_out.company = company
+ >>> move = shipment_out.outgoing_moves.new()
+ >>> move.product = product
+ >>> move.uom =unit
+ >>> move.quantity = 10
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> move.company = company
+ >>> move.unit_price = Decimal('1')
+ >>> move.currency = company.currency
+ >>> shipment_out.save()
+
+Set the shipment state to waiting::
+
+ >>> shipment_out.click('wait')
+ >>> len(shipment_out.outgoing_moves)
+ 1
+ >>> len(shipment_out.inventory_moves)
+ 1
+
+Split inventory move::
+
+ >>> move, = shipment_out.inventory_moves
+ >>> move.quantity = 7
+ >>> move.save()
+ >>> with config.set_context(_stock_move_split=True):
+ ... _ = move.duplicate(default=dict(quantity=3))
+ >>> shipment_out.reload()
+
+Assign the shipment::
+
+ >>> shipment_out.click('assign_force')
+ >>> shipment_out.state
+ 'assigned'
+ >>> len(shipment_out.outgoing_moves)
+ 1
+
+Try to pick without lot::
+
+ >>> shipment_out.click('pick') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ RequiredValidationError: ...
+
+Set 2 lots::
+
+ >>> Lot = Model.get('stock.lot')
+ >>> for i, move in enumerate(shipment_out.inventory_moves, start=1):
+ ... lot = Lot(number='%05i' % i, product=move.product)
+ ... lot.save()
+ ... move.lot = lot
+ >>> shipment_out.save()
+
+Pick the shipment::
+
+ >>> shipment_out.click('pick')
+ >>> shipment_out.state
+ 'picked'
+ >>> len(shipment_out.outgoing_moves)
+ 3
+ >>> sorted([m.quantity for m in shipment_out.outgoing_moves])
+ [0.0, 3.0, 7.0]
+ >>> lot_quantities = {}
+ >>> for move in shipment_out.outgoing_moves:
+ ... number = move.lot.number if move.lot else ''
+ ... quantity = lot_quantities.setdefault(number, 0)
+ ... lot_quantities[number] += move.quantity
+ >>> sorted(lot_quantities.items())
+ [('', 0.0), ('00001', 3.0), ('00002', 7.0)]
diff --git a/modules/stock_lot/tests/test_module.py b/modules/stock_lot/tests/test_module.py
new file mode 100644
index 0000000000..f6a7f73576
--- /dev/null
+++ b/modules/stock_lot/tests/test_module.py
@@ -0,0 +1,314 @@
+# 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 decimal import Decimal
+
+from dateutil.relativedelta import relativedelta
+
+from trytond.modules.company.tests import (
+ CompanyTestMixin, create_company, set_company)
+from trytond.pool import Pool
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.transaction import Transaction
+
+
+class StockLotTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test Stock Lot module'
+ module = 'stock_lot'
+
+ @with_transaction()
+ def test_products_by_location(self):
+ 'Test products_by_location'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Lot = pool.get('stock.lot')
+
+ kg, = Uom.search([('name', '=', 'Kilogram')])
+ g, = Uom.search([('name', '=', 'Gram')])
+ template, = Template.create([{
+ 'name': 'Test products_by_location',
+ 'type': 'goods',
+ 'default_uom': kg.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ supplier, = Location.search([('code', '=', 'SUP')])
+ customer, = Location.search([('code', '=', 'CUS')])
+ storage, = Location.search([('code', '=', 'STO')])
+ company = create_company()
+ currency = company.currency
+ with set_company(company):
+ lot1, lot2 = Lot.create([{
+ 'number': '1',
+ 'product': product.id,
+ }, {
+ 'number': '2',
+ 'product': product.id,
+ }])
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'lot': lot1.id,
+ 'uom': kg.id,
+ 'quantity': 5,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'lot': lot2.id,
+ 'uom': kg.id,
+ 'quantity': 10,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'lot': lot2.id,
+ 'uom': kg.id,
+ 'quantity': 2,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'lot': None,
+ 'uom': kg.id,
+ 'quantity': 3,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }])
+ Move.do(moves)
+
+ self.assertEqual(Product.products_by_location([storage.id],
+ grouping_filter=([product.id],)), {
+ (storage.id, product.id): 16,
+ })
+ self.assertEqual(Product.products_by_location([storage.id],
+ grouping=('product', 'lot',),
+ grouping_filter=([product.id],)), {
+ (storage.id, product.id, lot1.id): 5,
+ (storage.id, product.id, lot2.id): 8,
+ (storage.id, product.id, None): 3,
+ })
+ with Transaction().set_context(locations=[storage.id]):
+ lot1, lot2 = Lot.browse([lot1, lot2])
+ self.assertEqual(lot1.quantity, 5)
+ self.assertEqual(lot2.quantity, 8)
+
+ @with_transaction()
+ def test_period(self):
+ 'Test period'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Lot = pool.get('stock.lot')
+ Period = pool.get('stock.period')
+
+ unit, = Uom.search([('name', '=', 'Unit')])
+ template, = Template.create([{
+ 'name': 'Test period',
+ 'type': 'goods',
+ 'default_uom': unit.id,
+ }])
+ product, = Product.create([{
+ 'template': template.id,
+ }])
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'STO')])
+ company = create_company()
+ currency = company.currency
+ with set_company(company):
+ lot1, lot2 = Lot.create([{
+ 'number': '1',
+ 'product': product.id,
+ }, {
+ 'number': '2',
+ 'product': product.id,
+ }])
+
+ today = datetime.date.today()
+
+ moves = Move.create([{
+ 'product': product.id,
+ 'lot': lot1.id,
+ 'uom': unit.id,
+ 'quantity': 5,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today - relativedelta(days=1),
+ 'effective_date': today - relativedelta(days=1),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'lot': lot2.id,
+ 'uom': unit.id,
+ 'quantity': 10,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today - relativedelta(days=1),
+ 'effective_date': today - relativedelta(days=1),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }, {
+ 'product': product.id,
+ 'lot': None,
+ 'uom': unit.id,
+ 'quantity': 3,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'planned_date': today - relativedelta(days=1),
+ 'effective_date': today - relativedelta(days=1),
+ 'company': company.id,
+ 'unit_price': Decimal('1'),
+ 'currency': currency.id,
+ }])
+ Move.do(moves)
+
+ period, = Period.create([{
+ 'date': today - relativedelta(days=1),
+ 'company': company.id,
+ }])
+ Period.close([period])
+ self.assertEqual(period.state, 'closed')
+
+ quantities = {
+ supplier: -18,
+ storage: 18,
+ }
+ for cache in period.caches:
+ self.assertEqual(cache.product, product)
+ self.assertEqual(cache.internal_quantity,
+ quantities[cache.location])
+
+ quantities = {
+ (supplier, lot1): -5,
+ (storage, lot1): 5,
+ (supplier, lot2): -10,
+ (storage, lot2): 10,
+ (supplier, None): -3,
+ (storage, None): 3,
+ }
+ for lot_cache in period.lot_caches:
+ self.assertEqual(lot_cache.product, product)
+ self.assertEqual(lot_cache.internal_quantity,
+ quantities[(lot_cache.location, lot_cache.lot)])
+
+ @with_transaction
+ def test_assign_try_with_lot(self):
+ "Test Move assign_try with lot"
+ pool = Pool()
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Uom = pool.get('product.uom')
+ Location = pool.get('stock.location')
+ Move = pool.get('stock.move')
+ Lot = pool.get('stock.lot')
+
+ uom, = Uom.search([('name', '=', 'Meter')])
+ template = Template(
+ name="Product",
+ type='goods',
+ default_uom=uom,
+ )
+ template.save()
+ product = Product(template=template.id)
+ product.save()
+
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'STO')])
+ customer, = Location.search([('code', '=', 'CUS')])
+
+ company = create_company()
+ with set_company(company):
+ lot1, lot2 = Lot.create([{
+ 'number': "1",
+ 'product': product.id,
+ }, {
+ 'number': "2",
+ 'product': product.id,
+ }])
+ moves = Move.create([{
+ 'product': product.id,
+ 'lot': lot1.id,
+ 'uom': uom.id,
+ 'quantity': 2,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }, {
+ 'product': product.id,
+ 'lot': lot2.id,
+ 'uom': uom.id,
+ 'quantity': 3,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }, {
+ 'product': product.id,
+ 'lot': None,
+ 'uom': uom.id,
+ 'quantity': 3,
+ 'from_location': supplier.id,
+ 'to_location': storage.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+ Move.do(moves)
+
+ move, = Move.create([{
+ 'product': product.id,
+ 'uom': uom.id,
+ 'quantity': 10,
+ 'from_location': storage.id,
+ 'to_location': customer.id,
+ 'company': company.id,
+ 'unit_price': Decimal(1),
+ 'currency': company.currency.id,
+ }])
+
+ self.assertFalse(
+ Move.assign_try([move], grouping=('product', 'lot')))
+ moves = Move.search([
+ ('product', '=', product.id),
+ ('from_location', '=', storage.id),
+ ('to_location', '=', customer.id),
+ ('company', '=', company.id),
+ ])
+ self.assertEqual(len(moves), 4)
+ self.assertEqual({
+ (m.lot, m.quantity, m.state) for m in moves}, {
+ (lot1, 2, 'assigned'),
+ (lot2, 3, 'assigned'),
+ (None, 1, 'assigned'),
+ (None, 4, 'draft'),
+ })
+
+
+del ModuleTestCase
diff --git a/modules/stock_lot/tests/test_scenario.py b/modules/stock_lot/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/stock_lot/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock_lot/tox.ini b/modules/stock_lot/tox.ini
new file mode 100644
index 0000000000..2c78a15a21
--- /dev/null
+++ b/modules/stock_lot/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_lot/* -m unittest discover -s tests
+ coverage report --include=./**/stock_lot/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_lot/tryton.cfg b/modules/stock_lot/tryton.cfg
new file mode 100644
index 0000000000..6afd3c6181
--- /dev/null
+++ b/modules/stock_lot/tryton.cfg
@@ -0,0 +1,13 @@
+[tryton]
+version=6.7.0
+depends:
+ ir
+ product
+ stock
+extras_depend:
+ sale_supply_drop_shipment
+xml:
+ ir.xml
+ stock.xml
+ product.xml
+ message.xml
diff --git a/modules/stock_lot/view/inventory_line_form.xml b/modules/stock_lot/view/inventory_line_form.xml
new file mode 100644
index 0000000000..6882aa4ecc
--- /dev/null
+++ b/modules/stock_lot/view/inventory_line_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/inventory_line_tree.xml b/modules/stock_lot/view/inventory_line_tree.xml
new file mode 100644
index 0000000000..4f1ec7d31a
--- /dev/null
+++ b/modules/stock_lot/view/inventory_line_tree.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/lot_by_location_context_form.xml b/modules/stock_lot/view/lot_by_location_context_form.xml
new file mode 100644
index 0000000000..09aede248e
--- /dev/null
+++ b/modules/stock_lot/view/lot_by_location_context_form.xml
@@ -0,0 +1,8 @@
+
+
+
diff --git a/modules/stock_lot/view/lot_by_warehouse_context_form.xml b/modules/stock_lot/view/lot_by_warehouse_context_form.xml
new file mode 100644
index 0000000000..e352324fcd
--- /dev/null
+++ b/modules/stock_lot/view/lot_by_warehouse_context_form.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/lot_form.xml b/modules/stock_lot/view/lot_form.xml
new file mode 100644
index 0000000000..a71a859cfb
--- /dev/null
+++ b/modules/stock_lot/view/lot_form.xml
@@ -0,0 +1,14 @@
+
+
+
diff --git a/modules/stock_lot/view/lot_trace_tree.xml b/modules/stock_lot/view/lot_trace_tree.xml
new file mode 100644
index 0000000000..a8b89d709e
--- /dev/null
+++ b/modules/stock_lot/view/lot_trace_tree.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/lot_tree.xml b/modules/stock_lot/view/lot_tree.xml
new file mode 100644
index 0000000000..4f893a670f
--- /dev/null
+++ b/modules/stock_lot/view/lot_tree.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/lots_by_locations_list.xml b/modules/stock_lot/view/lots_by_locations_list.xml
new file mode 100644
index 0000000000..8cba9a32af
--- /dev/null
+++ b/modules/stock_lot/view/lots_by_locations_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/move_form.xml b/modules/stock_lot/view/move_form.xml
new file mode 100644
index 0000000000..0e1169dea6
--- /dev/null
+++ b/modules/stock_lot/view/move_form.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/move_tree.xml b/modules/stock_lot/view/move_tree.xml
new file mode 100644
index 0000000000..475dd4c595
--- /dev/null
+++ b/modules/stock_lot/view/move_tree.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/period_cache_lot_form.xml b/modules/stock_lot/view/period_cache_lot_form.xml
new file mode 100644
index 0000000000..4e532bfa27
--- /dev/null
+++ b/modules/stock_lot/view/period_cache_lot_form.xml
@@ -0,0 +1,15 @@
+
+
+
diff --git a/modules/stock_lot/view/period_cache_lot_list.xml b/modules/stock_lot/view/period_cache_lot_list.xml
new file mode 100644
index 0000000000..9bb28c59c4
--- /dev/null
+++ b/modules/stock_lot/view/period_cache_lot_list.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/product_configuration_form.xml b/modules/stock_lot/view/product_configuration_form.xml
new file mode 100644
index 0000000000..4a1d0d2778
--- /dev/null
+++ b/modules/stock_lot/view/product_configuration_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/stock_move_add_lots_start_form.xml b/modules/stock_lot/view/stock_move_add_lots_start_form.xml
new file mode 100644
index 0000000000..163932fa22
--- /dev/null
+++ b/modules/stock_lot/view/stock_move_add_lots_start_form.xml
@@ -0,0 +1,20 @@
+
+
+
diff --git a/modules/stock_lot/view/stock_move_add_lots_start_lot_list.xml b/modules/stock_lot/view/stock_move_add_lots_start_lot_list.xml
new file mode 100644
index 0000000000..ec98f00cda
--- /dev/null
+++ b/modules/stock_lot/view/stock_move_add_lots_start_lot_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot/view/template_form.xml b/modules/stock_lot/view/template_form.xml
new file mode 100644
index 0000000000..894baf1ec2
--- /dev/null
+++ b/modules/stock_lot/view/template_form.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot_sled/.drone.yml b/modules/stock_lot_sled/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/stock_lot_sled/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_lot_sled/.flake8 b/modules/stock_lot_sled/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_lot_sled/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_lot_sled/.isort.cfg b/modules/stock_lot_sled/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_lot_sled/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_lot_sled/CHANGELOG b/modules/stock_lot_sled/CHANGELOG
new file mode 100644
index 0000000000..10a8e226d3
--- /dev/null
+++ b/modules/stock_lot_sled/CHANGELOG
@@ -0,0 +1,55 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-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
+* Bug fixes (see mercurial logs for details)
+* Change shelf_life_delay into TimeDelta
+
+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 Shelf Life Delay
+
+Version 3.6.0 - 2015-04-20
+* Initial release
diff --git a/modules/stock_lot_sled/COPYRIGHT b/modules/stock_lot_sled/COPYRIGHT
new file mode 100644
index 0000000000..276b2c7518
--- /dev/null
+++ b/modules/stock_lot_sled/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2014-2022 Cédric Krier.
+Copyright (C) 2014-2022 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/stock_lot_sled/LICENSE b/modules/stock_lot_sled/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_lot_sled/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/stock_lot_sled/MANIFEST.in b/modules/stock_lot_sled/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_lot_sled/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_lot_sled/README.rst b/modules/stock_lot_sled/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_lot_sled/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_lot_sled/__init__.py b/modules/stock_lot_sled/__init__.py
new file mode 100644
index 0000000000..b1582f7353
--- /dev/null
+++ b/modules/stock_lot_sled/__init__.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.pool import Pool
+
+from . import product, stock
+from .stock import LotSledMixin
+
+__all__ = ['LotSledMixin', 'register']
+
+
+def register():
+ Pool.register(
+ product.Template,
+ product.Product,
+ stock.Configuration,
+ stock.ConfigurationLotShelfLife,
+ stock.Lot,
+ stock.MoveAddLotsStartLot,
+ stock.Move,
+ stock.Period,
+ module='stock_lot_sled', type_='model')
diff --git a/modules/stock_lot_sled/doc/index.rst b/modules/stock_lot_sled/doc/index.rst
new file mode 100644
index 0000000000..cdca95f0da
--- /dev/null
+++ b/modules/stock_lot_sled/doc/index.rst
@@ -0,0 +1,13 @@
+Stock Lot Shelf Life Expiration Date
+####################################
+
+The stock_lot_sled module adds two fields on lot of products:
+
+ - Shelf Live Expiration Date
+ - Expiration Date
+
+And it defines on the product the default time for those fields and on the
+stock configuration the Shelf Live Delay.
+
+When the shelf life of a lot expires in less than the configured shelf life
+delay, it is no more used to compute the forecast quantity of the stock.
diff --git a/modules/stock_lot_sled/exceptions.py b/modules/stock_lot_sled/exceptions.py
new file mode 100644
index 0000000000..21498fa0b3
--- /dev/null
+++ b/modules/stock_lot_sled/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.exceptions import UserError, UserWarning
+
+
+class LotExpiredError(UserError):
+ pass
+
+
+class LotExpiredWarning(UserWarning):
+ pass
diff --git a/modules/stock_lot_sled/locale/bg.po b/modules/stock_lot_sled/locale/bg.po
new file mode 100644
index 0000000000..a14bbfb301
--- /dev/null
+++ b/modules/stock_lot_sled/locale/bg.po
@@ -0,0 +1,257 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Крайна дата"
+
+#, fuzzy
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Крайна дата"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Крайна дата"
+
+#, fuzzy
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Крайна дата"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Крайна дата"
+
+#, fuzzy
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Крайна дата"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Крайна дата"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Крайна дата"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Крайна дата"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Крайна дата"
+
+#, fuzzy
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "В брой дни"
+
+#, fuzzy
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "В брой дни"
+
+#, fuzzy
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "В брой дни"
+
+#, fuzzy
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "В брой дни"
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Задължителен"
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Задължителен"
+
+#, fuzzy
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Задължителен"
+
+#, fuzzy
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Задължителен"
+
+#, fuzzy
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Задължителен"
+
+#, fuzzy
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Задължителен"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Задължителен"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Няма"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Задължителен"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/ca.po b/modules/stock_lot_sled/locale/ca.po
new file mode 100644
index 0000000000..bb3d237a45
--- /dev/null
+++ b/modules/stock_lot_sled/locale/ca.po
@@ -0,0 +1,233 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Estat caducitat"
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Temps a caducar"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Estat vida útil"
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Temps vida útil"
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Estat caducitat"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Temps a caducar"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Estat vida útil"
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Temps vida útil"
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Retard de la vida útil"
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Retard de la vida útil"
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Data caducitat"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Estat caducitat"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Data fi vida útil"
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Estat vida útil"
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Data caducitat"
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Estat caducitat"
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Data fi vida útil"
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Estat vida útil"
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "En nombre de dies."
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "En nombre de dies."
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "En nombre de dies."
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "En nombre de dies."
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "El retard abans d'eliminar de les previsions."
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "El retard abans d'eliminar de les previsions."
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+"No podeu modificar les dates de caducitat del lot \"%(lot)s\" perquè "
+"s'utilitza en el moviment \"%(move)s\" d'un període tancat."
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+"No podeu processar el moviment \"%(move)s\" perquè el seu lot \"%(lot)s\" ha"
+" expirat."
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+"No podeu tancar períodes abans de l'expiració del lot \"%(lot)s\" "
+"(%(date)s)."
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Forçar caducitats a logística"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr "Configuració del retard de la vida útil"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Obligatori"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Obligatori"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Obligatori"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Obligatori"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Obligatori"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Obligatori"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Obligatori"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Cap"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Obligatori"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr "Vida útil"
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr "Lot"
diff --git a/modules/stock_lot_sled/locale/cs.po b/modules/stock_lot_sled/locale/cs.po
new file mode 100644
index 0000000000..269646e458
--- /dev/null
+++ b/modules/stock_lot_sled/locale/cs.po
@@ -0,0 +1,227 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/de.po b/modules/stock_lot_sled/locale/de.po
new file mode 100644
index 0000000000..c3deb20fa8
--- /dev/null
+++ b/modules/stock_lot_sled/locale/de.po
@@ -0,0 +1,235 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Verfallsstatus"
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Verfallsdauer"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Mindesthaltbarkeitsstatus"
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Mindesthaltbarkeitsdauer"
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Verfallsstatus"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Verfallsdauer"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Mindesthaltbarkeitsstatus"
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Haltbarkeitsdauer"
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Aufschub Mindesthaltbarkeitsablauf"
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Aufschub Mindesthaltbarkeitsablauf"
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Verfallsdatum"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Verfallsstatus"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Mindesthaltbarkeitsdatum"
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Mindesthaltbarkeitsstatus"
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Verfallsdatum"
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Verfallsstatus"
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Mindesthaltbarkeitsdatum"
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Mindesthaltbarkeitsstatus"
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "In Tagen."
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "In Tagen."
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "In Tagen."
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "In Tagen."
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "Der Aufschub vor dem Entfernen aus der Bedarfsermittlung."
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "Der Aufschub vor dem Entfernen aus der Bedarfsermittlung."
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+"Das Verfallsdatum von Charge \"%(lot)s\" kann nicht verändert werden, weil "
+"sie in Warenbewegung \"%(move)s\" in einem geschlossenen "
+"Lagerbuchungszeitraum verwendet wird."
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+"Die Warenbewegung \"%(move)s\" kann nicht ausgeführt werden, weil die "
+"zugewiesene Charge \"%(lot)s\" abgelaufen ist."
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+"Lagerbuchungszeiträume können nicht vor Erreichen des "
+"Mindesthaltbarkeitsdatums der Charge \"%(lot)s\" (%(date)s) geschlossen "
+"werden."
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Lager Erzwingen bei Ablauf Mindesthaltbarkeit"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr "Einstellungen Lager Charge Mindesthaltbarkeit"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Keiner"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Optional"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Erforderlich"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Keiner"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Optional"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Erforderlich"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Keiner"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Optional"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Erforderlich"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Keiner"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Optional"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Erforderlich"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Keiner"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Optional"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Erforderlich"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Keiner"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Optional"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Erforderlich"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Keiner"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Optional"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Erforderlich"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Keiner"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Optional"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Erforderlich"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr "Mindesthaltbarkeit"
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr "Charge"
diff --git a/modules/stock_lot_sled/locale/es.po b/modules/stock_lot_sled/locale/es.po
new file mode 100644
index 0000000000..61531839e3
--- /dev/null
+++ b/modules/stock_lot_sled/locale/es.po
@@ -0,0 +1,233 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Estado caducidad"
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Tiempo a caducar"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Estado vida útil"
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Tiempo vida útil"
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Estado caducidad"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Tiempo a caducar"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Estado vida útil"
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Tiempo vida útil"
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Retraso de la vida útil"
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Retraso de la vida útil"
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Fecha caducidad"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Estado caducidad"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Fecha fin vida útil"
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Estado vida útil"
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Fecha caducidad"
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Estado caducidad"
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Fecha fin vida útil"
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Estado vida útil"
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "En número de días."
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "En número de días."
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "En número de días."
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "En número de días."
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "El retraso antes de eliminar de las previsiones."
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "El retraso antes de eliminar de las previsiones."
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+"No puede modificar las fechas de caducidad del lote \"%(lot)s\" porque se "
+"utiliza en el movimento \"%(move)s\" en un periodo cerrado."
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+"No puede procesar el movimiento \"%(move)s\" porque su \"%(lot)s\" ha "
+"expirado."
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+"No puede cerrar periodos antes de la expiración del lote \"%(lot)s\" "
+"(%(date)s)."
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Forzar caducidades en logística"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr "Configuración del retraso de la vida útil"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Obligatorio"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Obligatorio"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Obligatorio"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Obligatorio"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Obligatorio"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Obligatorio"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Obligatorio"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Ninguno"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Obligatorio"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr "Vida útil"
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr "Lote"
diff --git a/modules/stock_lot_sled/locale/es_419.po b/modules/stock_lot_sled/locale/es_419.po
new file mode 100644
index 0000000000..9d14297188
--- /dev/null
+++ b/modules/stock_lot_sled/locale/es_419.po
@@ -0,0 +1,233 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Estado de caducidad"
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Tiempo de caducidad"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Estado de vida útil"
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Tiempo de vida útil"
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Estado de caducidad"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Tiempo de caducidad"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Estado de vida útil"
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Tiempo de vida útil"
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Fecha de caducidad"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Estado de caducidad"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Fecha de caducidad de vida útil"
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Estado de caducidad de vida útil"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Fecha de caducidad"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Estado de caducidad"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Fecha de caducidad de vida útil"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Estado de caducidad de vida útil"
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr ""
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/et.po b/modules/stock_lot_sled/locale/et.po
new file mode 100644
index 0000000000..2ad24606dc
--- /dev/null
+++ b/modules/stock_lot_sled/locale/et.po
@@ -0,0 +1,241 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Aegumise staatus"
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Aegumistähtaeg"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Aegumise staatus"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Aegumistähtaeg"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Aegumistähtaeg"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Aegumise staatus"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Aegumistähtaeg"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Aegumise staatus"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Aegumistähtaeg"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Aegumise staatus"
+
+#, fuzzy
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "Päevades"
+
+#, fuzzy
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "Päevades"
+
+#, fuzzy
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "Päevades"
+
+#, fuzzy
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "Päevades"
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr ""
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Mitte"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Valikuline"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Nõutud"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Mitte"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Valikuline"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Nõutud"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Mitte"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Valikuline"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Nõutud"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Mitte"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Valikuline"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Nõutud"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Mitte"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Valikuline"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Nõutud"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Mitte"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Valikuline"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Nõutud"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Mitte"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Valikuline"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Nõutud"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Mitte"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Valikuline"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Nõutud"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/fa.po b/modules/stock_lot_sled/locale/fa.po
new file mode 100644
index 0000000000..9be7c7364d
--- /dev/null
+++ b/modules/stock_lot_sled/locale/fa.po
@@ -0,0 +1,246 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "وضعیت انقضاء"
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "زمان انقضاء"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "وضعیت عمر مفید مصرف"
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "عمر مفید مصرف"
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "وضعیت انقضاء"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "زمان انقضاء"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "وضعیت عمر مفید مصرف"
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "عمر مفید مصرف"
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "عمر مفید تاخیر"
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "عمر مفید تاخیر"
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "تاریخ انقضاء"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "وضعیت انقضاء"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "عمر مفید تاریخ انقضاء"
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "وضعیت مفید تاریخ انقضاء"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "تاریخ انقضاء"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "وضعیت انقضاء"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "عمر مفید تاریخ انقضاء"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "وضعیت مفید تاریخ انقضاء"
+
+#, fuzzy
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "در تعداد روزها"
+
+#, fuzzy
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "در تعداد روزها"
+
+#, fuzzy
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "در تعداد روزها"
+
+#, fuzzy
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "در تعداد روزها"
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "تاخیر قبل از حذف از پیش بینی."
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "تاخیر قبل از حذف از پیش بینی."
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+"شما نمیتوانید تاریخ های انقضاء کالاهای: \"%s\" را تغییر دهید چونکه در "
+"جابجایی : \"%s\" در دوره بسته شده استفاده شده است."
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+"شما نمیتوانید جابجایی :\"%(move)s\" را پردازش کنید، چراکه تاریخ اجناس "
+":\"%(lot)s\" منقضی شده است."
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+"شما نمیتوانید دوره ها را قبل از انقضای اجناس :\"%(lot)s\" (%(date)s) ببندید."
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "تاریخ انقضاء موجودی"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr "پیکربندی موجودی ؛ عمرمفید مصرف"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "هیجکدام"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "اختیاری"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "مورد نیاز"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "هیجکدام"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "اختیاری"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "مورد نیاز"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "هیجکدام"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "اختیاری"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "مورد نیاز"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "هیجکدام"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "اختیاری"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "مورد نیاز"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "هیجکدام"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "اختیاری"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "مورد نیاز"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "هیجکدام"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "اختیاری"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "مورد نیاز"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "هیجکدام"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "اختیاری"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "مورد نیاز"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "هیجکدام"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "اختیاری"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "مورد نیاز"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr "عمر مفید مصرف"
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/fi.po b/modules/stock_lot_sled/locale/fi.po
new file mode 100644
index 0000000000..269646e458
--- /dev/null
+++ b/modules/stock_lot_sled/locale/fi.po
@@ -0,0 +1,227 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/fr.po b/modules/stock_lot_sled/locale/fr.po
new file mode 100644
index 0000000000..4a011a7343
--- /dev/null
+++ b/modules/stock_lot_sled/locale/fr.po
@@ -0,0 +1,233 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "État d'expiration"
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Délai d'expiration"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "État de la durée limite d'utilisation optimale"
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Durée limite d'utilisation optimale"
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "État d'expiration"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Délai d'expiration"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "État de la durée limite d'utilisation optimale"
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Durée limite d'utilisation optimale"
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Délai de durée limite d'utilisation optimale"
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Délai de durée limite d'utilisation optimale"
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Date d'expiration"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "État d'expiration"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Date limite d'utilisation optimale"
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "État de la date limite d'utilisation optimale"
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Date d'expiration"
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "État d'expiration"
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Date limite d'utilisation optimale"
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "État de la date limite d'utilisation optimale"
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "En nombre de jours."
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "En nombre de jours."
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "En nombre de jours."
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "En nombre de jours."
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "Le délai avant d'être retiré de la prévision."
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "Le délai avant d'être retiré de la prévision."
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+"Vous ne pouvez pas modifier les dates d'expiration du lot « %(lot)s » car il"
+" est utilisé sur un mouvement « %(move)s » d'une période clôturée."
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+"Vous ne pouvez pas traiter le mouvement « %(move)s » car son lot « %(lot)s »"
+" a expiré."
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+"Vous ne pouvez pas clôturer les périodes avant l'expiration du lot "
+"« %(lot)s » (%(date)s)."
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Force l'expiration des stocks"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr "Configuration de lot de stock Durée limite d'utilisation optimale"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Aucune"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Optionnelle"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Requise"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Aucune"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Optionnelle"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Requise"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Aucune"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Optionnelle"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Requis"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Aucune"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Optionnel"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Requis"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Aucune"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Optionnelle"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Requis"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Aucune"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Optionnelle"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Requis"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Aucune"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Optionnelle"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Requise"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Aucun"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Optionnel"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Requis"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr "Limite d'utilisation optimale"
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr "Lot"
diff --git a/modules/stock_lot_sled/locale/hu.po b/modules/stock_lot_sled/locale/hu.po
new file mode 100644
index 0000000000..70c5d0bfd0
--- /dev/null
+++ b/modules/stock_lot_sled/locale/hu.po
@@ -0,0 +1,256 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Lejárat dátuma"
+
+#, fuzzy
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Lejárat időpontja"
+
+#, fuzzy
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Raktáridő állapota"
+
+#, fuzzy
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Raktáridő"
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Lejárat dátuma"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Lejárat időpontja"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Raktáridő állapota"
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Raktáridő"
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Raktáridő várakozás időtartama"
+
+#, fuzzy
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Raktáridő várakozás időtartama"
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Lejárati dátuma"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Lejárati állapot"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Raktáridő lejárati dátum"
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Raktáridő lejárati dátum"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Lejárati dátuma"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Lejárat dátuma"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Raktáridő lejárati dátum"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Raktáridő lejárati dátum"
+
+#, fuzzy
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "Napok száma"
+
+#, fuzzy
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "Napok száma"
+
+#, fuzzy
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "Napok száma"
+
+#, fuzzy
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "Napok száma"
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+"A Charge \"%(lot)s\" lejárati dátuma nem módosítható, egy zárt raktár "
+"időszakban raktármozgás \"%(move)s\" van."
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Nincs"
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Opcionális"
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Szükséges"
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Nincs"
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Opcionális"
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Szükséges"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Nincs"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Opcionális"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Szükséges"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Nincs"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Opcionális"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Szükséges"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Nincs"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Opcionális"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Szükséges"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Nincs"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Opcionális"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Szükséges"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Nincs"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Opcionális"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Szükséges"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Nincs"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Opcionális"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Szükséges"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr "Raktár idő"
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/id.po b/modules/stock_lot_sled/locale/id.po
new file mode 100644
index 0000000000..a2b02fb465
--- /dev/null
+++ b/modules/stock_lot_sled/locale/id.po
@@ -0,0 +1,233 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr ""
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Tidak ada"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Pilihan"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Wajib"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Tidak ada"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Pilihan"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Wajib"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Tidak ada"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Pilihan"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Wajib"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Tidak ada"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Pilihan"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Wajib"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Tidak ada"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Pilihan"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Wajib"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Tidak ada"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Pilihan"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Wajib"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Tidak ada"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Pilihan"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Wajib"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Tidak ada"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Pilihan"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Wajib"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/it.po b/modules/stock_lot_sled/locale/it.po
new file mode 100644
index 0000000000..f3370f80cc
--- /dev/null
+++ b/modules/stock_lot_sled/locale/it.po
@@ -0,0 +1,243 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Nessuno"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Obbligatorio"
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Nessuno"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Obbligatorio"
+
+#, fuzzy
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Nessuno"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Obbligatorio"
+
+#, fuzzy
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Nessuno"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Obbligatorio"
+
+#, fuzzy
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Nessuno"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Obbligatorio"
+
+#, fuzzy
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Nessuno"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Obbligatorio"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Nessuno"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Obbligatorio"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Nessuno"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Obbligatorio"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr "Lotto"
diff --git a/modules/stock_lot_sled/locale/lo.po b/modules/stock_lot_sled/locale/lo.po
new file mode 100644
index 0000000000..353dd2a5ff
--- /dev/null
+++ b/modules/stock_lot_sled/locale/lo.po
@@ -0,0 +1,243 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "ບໍ່ມີ"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "ຕ້ອງມີ"
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "ບໍ່ມີ"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "ຕ້ອງມີ"
+
+#, fuzzy
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "ບໍ່ມີ"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "ຕ້ອງມີ"
+
+#, fuzzy
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "ບໍ່ມີ"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "ຕ້ອງມີ"
+
+#, fuzzy
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "ບໍ່ມີ"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "ຕ້ອງມີ"
+
+#, fuzzy
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "ບໍ່ມີ"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "ຕ້ອງມີ"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "ບໍ່ມີ"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "ຕ້ອງມີ"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "ບໍ່ມີ"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "ຕ້ອງມີ"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/lt.po b/modules/stock_lot_sled/locale/lt.po
new file mode 100644
index 0000000000..269646e458
--- /dev/null
+++ b/modules/stock_lot_sled/locale/lt.po
@@ -0,0 +1,227 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/nl.po b/modules/stock_lot_sled/locale/nl.po
new file mode 100644
index 0000000000..41087b02a1
--- /dev/null
+++ b/modules/stock_lot_sled/locale/nl.po
@@ -0,0 +1,233 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Houdbaarheid status"
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Houdbaarheidsdatum"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Houdbaarheidstermijn status"
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Houdbaarheidstermijn"
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Houdbaarheid status"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Houdbaarheids datum"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Houdbaarheidstermijn status"
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Houdbaarheidstermijn"
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Houdbaarheidsvertraging"
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Houdbaarheidsvertraging"
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Uiterste houdbaarheidsdatum"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Houdbaarheid status"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Uiterste houdbaarheidstermijn"
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Houdbaarheidstermijn status"
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Uiterste houdbaarheidsdatum"
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Houdbaarheid status"
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Uiterste houdbaarheidstermijn"
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Houdbaarheidstermijn status"
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "In aantal dagen."
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "In aantal dagen."
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "In aantal dagen."
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "In aantal dagen."
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "De vertraging voor de verwijdering uit de prognose."
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "De vertraging voor de verwijdering uit de prognose."
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+"U kunt de houdbaarheidsdatums van batch \"%(lot)s niet wijzigen omdat het "
+"wordt gebruikt bij voorraadboeking \"%(move)s\" in een afgesloten periode."
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+"U kunt de voorraadboeking \"%(move)s\" niet verwerken omdat de batch "
+"\"%(lot)s verlopen is."
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+"U kunt geen periodes afsluiten vóór het verlopen van batch \"%(lot)s\" "
+"(%(date)s)."
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Voorraad dwingt houdbaarheidsdatum af"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr "Voorraadconfiguratie Batch Houdbaarheidstermijn"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Optioneel"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Vereist"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Optioneel"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Vereist"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Optioneel"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Vereist"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Optioneel"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Vereist"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Optioneel"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Vereist"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Optioneel"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Vereist"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Optioneel"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Vereist"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Geen"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Optioneel"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Vereist"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr "Houdbaarheidstermijn"
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr "Batch"
diff --git a/modules/stock_lot_sled/locale/pl.po b/modules/stock_lot_sled/locale/pl.po
new file mode 100644
index 0000000000..29148f17d6
--- /dev/null
+++ b/modules/stock_lot_sled/locale/pl.po
@@ -0,0 +1,242 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Termin ważności"
+
+#, fuzzy
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Termin ważności"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Termin ważności"
+
+#, fuzzy
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Termin ważności"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Termin ważności"
+
+#, fuzzy
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Termin ważności"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Termin ważności"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Termin ważności"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Termin ważności"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Termin ważności"
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Brak"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Opcjonalny"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Wymagany"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Brak"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Opcjonalny"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Wymagany"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Brak"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Opcjonalny"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Wymagany"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Brak"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Opcjonalny"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Wymagany"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Brak"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Opcjonalny"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Wymagany"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Brak"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Opcjonalny"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Wymagany"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Brak"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Opcjonalny"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Wymagany"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Brak"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Opcjonalny"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Wymagany"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/pt.po b/modules/stock_lot_sled/locale/pt.po
new file mode 100644
index 0000000000..2d35193c82
--- /dev/null
+++ b/modules/stock_lot_sled/locale/pt.po
@@ -0,0 +1,245 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Data de Expiração"
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Hora de Expiração"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Estado do Tempo de Vida Útil"
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Tempo de Vida Útil"
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Data de Expiração"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Hora de Expiração"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Estado do Tempo de Vida Útil"
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Tempo de Vida Útil"
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Atraso da Vida Útil"
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Atraso da Vida Útil"
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Data de Expiração"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Estado de Expiração"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Data de Expiração da Vida Útil"
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Estado de Expiração da Vida Útil"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Data de Expiração"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Data de Expiração"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Data de Expiração da Vida Útil"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Estado de Expiração da Vida Útil"
+
+#, fuzzy
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "Em número de dias"
+
+#, fuzzy
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "Em número de dias"
+
+#, fuzzy
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "Em número de dias"
+
+#, fuzzy
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "Em número de dias"
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "O atraso antes da remoção da previsão."
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "O atraso antes da remoção da previsão."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+"Você não pode modificar as datas de expiralção do lote \"%(lot)s\" proque "
+"ele foi usado na movimentação \"%(move)s\" em um período fechado."
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr "Configuração de Estoque Vida Útil do Lote"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Nenhum"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Nenhum"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Nenhum"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Nenhum"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Nenhum"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Nenhum"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Nenhum"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Nenhum"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Opcional"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Requerido"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr "Vida Útil"
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/ro.po b/modules/stock_lot_sled/locale/ro.po
new file mode 100644
index 0000000000..8106d6b0c4
--- /dev/null
+++ b/modules/stock_lot_sled/locale/ro.po
@@ -0,0 +1,227 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr ""
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/ru.po b/modules/stock_lot_sled/locale/ru.po
new file mode 100644
index 0000000000..f3f07e695d
--- /dev/null
+++ b/modules/stock_lot_sled/locale/ru.po
@@ -0,0 +1,257 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Дата окончания"
+
+#, fuzzy
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Дата окончания"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Дата окончания"
+
+#, fuzzy
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Дата окончания"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Дата окончания"
+
+#, fuzzy
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Дата окончания"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Дата окончания"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Дата окончания"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Дата окончания"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Дата окончания"
+
+#, fuzzy
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "После указанного количества дней"
+
+#, fuzzy
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "После указанного количества дней"
+
+#, fuzzy
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "После указанного количества дней"
+
+#, fuzzy
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "После указанного количества дней"
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Обязательный"
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Обязательный"
+
+#, fuzzy
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Обязательный"
+
+#, fuzzy
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Обязательный"
+
+#, fuzzy
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Обязательный"
+
+#, fuzzy
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Обязательный"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Обязательный"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Отсутствует"
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Обязательный"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/sl.po b/modules/stock_lot_sled/locale/sl.po
new file mode 100644
index 0000000000..e680753985
--- /dev/null
+++ b/modules/stock_lot_sled/locale/sl.po
@@ -0,0 +1,245 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "Uporabnost"
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "Rok"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Trajanje"
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Rok"
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "Uporabnost"
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "Rok"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr "Trajanje"
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr "Rok"
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Zakasnitev roka trajanja"
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr "Zakasnitev roka trajanja"
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Rok uporabe"
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Uporabnost"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Rok trajanja"
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Trajanje"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "Rok uporabe"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "Uporabnost"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "Rok trajanja"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "Trajanje"
+
+#, fuzzy
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr "V dnevih"
+
+#, fuzzy
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr "V dnevih"
+
+#, fuzzy
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr "V dnevih"
+
+#, fuzzy
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr "V dnevih"
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "Zakasnitev pred odstranitvijo iz napovedi."
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr "Zakasnitev pred odstranitvijo iz napovedi."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+"Rokov uporabe serije \"%(lot)s\" ni možno popravljati, ker so v knjižbi "
+"\"%(move)s\" zaključenega obdobja."
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr "Konfiguracija roka trajanja serije"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr "Brez"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr "Neobvezno"
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr "Obvezno"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr "Brez"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr "Neobvezno"
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr "Obvezno"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr "Brez"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr "Neobvezno"
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr "Obvezno"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr "Brez"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr "Neobvezno"
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr "Obvezno"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr "Brez"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr "Neobvezno"
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr "Obvezno"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Brez"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Neobvezno"
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Obvezno"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr "Brez"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr "Neobvezno"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr "Obvezno"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr "Brez"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr "Neobvezno"
+
+#, fuzzy
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr "Obvezno"
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr "Rok trajanja"
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/tr.po b/modules/stock_lot_sled/locale/tr.po
new file mode 100644
index 0000000000..269646e458
--- /dev/null
+++ b/modules/stock_lot_sled/locale/tr.po
@@ -0,0 +1,227 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/uk.po b/modules/stock_lot_sled/locale/uk.po
new file mode 100644
index 0000000000..8106d6b0c4
--- /dev/null
+++ b/modules/stock_lot_sled/locale/uk.po
@@ -0,0 +1,227 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr ""
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/locale/zh_CN.po b/modules/stock_lot_sled/locale/zh_CN.po
new file mode 100644
index 0000000000..180626016b
--- /dev/null
+++ b/modules/stock_lot_sled/locale/zh_CN.po
@@ -0,0 +1,237 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+#, fuzzy
+msgctxt "field:product.product,expiration_state:"
+msgid "Expiration State"
+msgstr "失效日期"
+
+#, fuzzy
+msgctxt "field:product.product,expiration_time:"
+msgid "Expiration Time"
+msgstr "失效日期"
+
+msgctxt "field:product.product,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.product,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:product.template,expiration_state:"
+msgid "Expiration State"
+msgstr "失效日期"
+
+#, fuzzy
+msgctxt "field:product.template,expiration_time:"
+msgid "Expiration Time"
+msgstr "失效日期"
+
+msgctxt "field:product.template,shelf_life_state:"
+msgid "Shelf Life Time State"
+msgstr ""
+
+msgctxt "field:product.template,shelf_life_time:"
+msgid "Shelf Life Time"
+msgstr ""
+
+msgctxt "field:stock.configuration,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+msgctxt "field:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "Shelf Life Delay"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "失效日期"
+
+#, fuzzy
+msgctxt "field:stock.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "失效日期"
+
+msgctxt "field:stock.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr ""
+
+msgctxt "field:stock.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_date:"
+msgid "Expiration Date"
+msgstr "失效日期"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Expiration State"
+msgstr "失效日期"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_date:"
+msgid "Shelf Life Expiration Date"
+msgstr "失效日期"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Shelf Life Expiration State"
+msgstr "失效日期"
+
+msgctxt "help:product.product,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.product,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,expiration_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:product.template,shelf_life_time:"
+msgid "In number of days."
+msgstr ""
+
+msgctxt "help:stock.configuration,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "help:stock.location.lot.shelf_life,shelf_life_delay:"
+msgid "The delay before removal from the forecast."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_modify_expiration_date_period_close"
+msgid ""
+"You cannot modify expiration dates of lot \"%(lot)s because it is used on "
+"move \"%(move)s\" in a closed period."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_move_lot_expired"
+msgid "You cannot process move \"%(move)s\" because its lot \"%(lot)s\" has expired."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_period_close_sled"
+msgid ""
+"You cannot close periods before the expiration of lot \"%(lot)s\" "
+"(%(date)s)."
+msgstr ""
+
+msgctxt "model:res.group,name:group_stock_force_expiration"
+msgid "Stock Force Expiration"
+msgstr "Stock Force Expiration"
+
+msgctxt "model:stock.location.lot.shelf_life,name:"
+msgid "Stock Configuration Lot Shelf Life"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.product,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:product.template,shelf_life_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "None"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Optional"
+msgstr ""
+
+msgctxt "selection:stock.move.add.lots.start.lot,shelf_life_expiration_state:"
+msgid "Required"
+msgstr ""
+
+msgctxt "view:product.template:"
+msgid "Shelf Life"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Lot"
+msgstr ""
diff --git a/modules/stock_lot_sled/message.xml b/modules/stock_lot_sled/message.xml
new file mode 100644
index 0000000000..492d37852e
--- /dev/null
+++ b/modules/stock_lot_sled/message.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ You cannot modify expiration dates of lot "%(lot)s because it is used on move "%(move)s" in a closed period.
+
+
+ You cannot process move "%(move)s" because its lot "%(lot)s" has expired.
+
+
+ You cannot close periods before the expiration of lot "%(lot)s" (%(date)s).
+
+
+
diff --git a/modules/stock_lot_sled/product.py b/modules/stock_lot_sled/product.py
new file mode 100644
index 0000000000..3f168291d1
--- /dev/null
+++ b/modules/stock_lot_sled/product.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 fields
+from trytond.pool import PoolMeta
+from trytond.pyson import Eval
+
+from .stock import DATE_STATE
+
+
+class Template(metaclass=PoolMeta):
+ __name__ = 'product.template'
+
+ shelf_life_state = fields.Selection(
+ DATE_STATE, 'Shelf Life Time State', sort=False)
+ shelf_life_time = fields.Integer('Shelf Life Time',
+ states={
+ 'invisible': Eval('shelf_life_state', 'none') == 'none',
+ },
+ help='In number of days.')
+ expiration_state = fields.Selection(
+ DATE_STATE, 'Expiration State', sort=False)
+ expiration_time = fields.Integer('Expiration Time',
+ states={
+ 'invisible': Eval('expiration_state', 'none') == 'none',
+ },
+ help='In number of days.')
+
+ @staticmethod
+ def default_shelf_life_state():
+ return 'none'
+
+ @staticmethod
+ def default_expiration_state():
+ return 'none'
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
diff --git a/modules/stock_lot_sled/product.xml b/modules/stock_lot_sled/product.xml
new file mode 100644
index 0000000000..70184cd889
--- /dev/null
+++ b/modules/stock_lot_sled/product.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ product.template
+
+ template_form
+
+
+
diff --git a/modules/stock_lot_sled/setup.py b/modules/stock_lot_sled/setup.py
new file mode 100755
index 0000000000..c0a4e54063
--- /dev/null
+++ b/modules/stock_lot_sled/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 find_packages, setup
+
+
+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_stock_lot_sled'
+
+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.5']
+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 shelf life expiration date of product lots',
+ 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/stock_lot_sled',
+ },
+ keywords='tryton stock lot',
+ package_dir={'trytond.modules.stock_lot_sled': '.'},
+ packages=(
+ ['trytond.modules.stock_lot_sled']
+ + ['trytond.modules.stock_lot_sled.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_lot_sled': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_lot_sled = trytond.modules.stock_lot_sled
+ """,
+ )
diff --git a/modules/stock_lot_sled/stock.py b/modules/stock_lot_sled/stock.py
new file mode 100644
index 0000000000..111b160821
--- /dev/null
+++ b/modules/stock_lot_sled/stock.py
@@ -0,0 +1,398 @@
+# 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 As, Join, Null, Select, Table, Union
+from sql.conditionals import Greatest
+
+from trytond.i18n import gettext
+from trytond.model import ModelSQL, ModelView, ValueMixin, Workflow, fields
+from trytond.model.exceptions import AccessError
+from trytond.modules.stock.exceptions import PeriodCloseError
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Eval
+from trytond.tools import grouped_slice
+from trytond.transaction import Transaction
+
+from .exceptions import LotExpiredError, LotExpiredWarning
+
+DATE_STATE = [
+ ('none', 'None'),
+ ('optional', 'Optional'),
+ ('required', 'Required'),
+ ]
+shelf_life_delay = fields.TimeDelta(
+ "Shelf Life Delay",
+ help="The delay before removal from the forecast.")
+
+
+class Configuration(metaclass=PoolMeta):
+ __name__ = 'stock.configuration'
+
+ shelf_life_delay = fields.MultiValue(shelf_life_delay)
+
+ @classmethod
+ def multivalue_model(cls, field):
+ pool = Pool()
+ if field == 'shelf_life_delay':
+ return pool.get('stock.location.lot.shelf_life')
+ return super(Configuration, cls).multivalue_model(field)
+
+
+class ConfigurationLotShelfLife(ModelSQL, ValueMixin):
+ "Stock Configuration Lot Shelf Life"
+ __name__ = 'stock.location.lot.shelf_life'
+ shelf_life_delay = shelf_life_delay
+
+
+class LotSledMixin:
+ __slots__ = ()
+ shelf_life_expiration_date = fields.Date('Shelf Life Expiration Date',
+ states={
+ 'required': (
+ Eval('shelf_life_expiration_state', 'none') == 'required'),
+ 'invisible': Eval('shelf_life_expiration_state', 'none') == 'none',
+ })
+ shelf_life_expiration_state = fields.Function(
+ fields.Selection(DATE_STATE, 'Shelf Life Expiration State'),
+ 'on_change_with_shelf_life_expiration_state')
+ expiration_date = fields.Date('Expiration Date',
+ states={
+ 'required': Eval('expiration_state', 'none') == 'required',
+ 'invisible': Eval('expiration_state', 'none') == 'none',
+ })
+ expiration_state = fields.Function(
+ fields.Selection(DATE_STATE, 'Expiration State'),
+ 'on_change_with_expiration_state')
+
+ @fields.depends('product')
+ def on_change_with_shelf_life_expiration_state(self, name=None):
+ if self.product:
+ return self.product.shelf_life_state
+ return 'none'
+
+ @fields.depends('product')
+ def on_change_with_expiration_state(self, name=None):
+ if self.product:
+ return self.product.expiration_state
+ return 'none'
+
+ @fields.depends('product')
+ def on_change_product(self):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ try:
+ super().on_change_product()
+ except AttributeError:
+ pass
+ if self.product:
+ today = Date.today()
+ if (self.product.shelf_life_state != 'none'
+ and self.product.shelf_life_time):
+ self.shelf_life_expiration_date = (today
+ + datetime.timedelta(days=self.product.shelf_life_time))
+ if (self.product.expiration_state != 'none'
+ and self.product.expiration_time):
+ self.expiration_date = (today
+ + datetime.timedelta(days=self.product.expiration_time))
+
+
+class Lot(LotSledMixin, metaclass=PoolMeta):
+ __name__ = 'stock.lot'
+
+ @classmethod
+ def write(cls, *args):
+ super(Lot, cls).write(*args)
+
+ actions = iter(args)
+ for lots, values in zip(actions, actions):
+ if any(f in ['shelf_life_expiration_date', 'expiration_date']
+ for f in values):
+ cls.check_sled_period_closed(lots)
+
+ @classmethod
+ def check_sled_period_closed(cls, lots):
+ Period = Pool().get('stock.period')
+ Move = Pool().get('stock.move')
+ periods = Period.search([
+ ('state', '=', 'closed'),
+ ], order=[('date', 'DESC')], limit=1)
+ if not periods:
+ return
+ period, = periods
+ for lots in grouped_slice(lots):
+ lot_ids = [l.id for l in lots]
+ moves = Move.search([
+ ('lot', 'in', lot_ids),
+ ['OR', [
+ ('effective_date', '=', None),
+ ('planned_date', '<=', period.date),
+ ],
+ ('effective_date', '<=', period.date),
+ ]], limit=1)
+ if moves:
+ move, = moves
+ raise AccessError(
+ gettext('stock_lot_sled'
+ '.msg_lot_modify_expiration_date_period_close',
+ lot=move.lot.rec_name,
+ move=move.rec_name))
+
+
+class MoveAddLotsStartLot(LotSledMixin, metaclass=PoolMeta):
+ __name__ = 'stock.move.add.lots.start.lot'
+
+ @fields.depends('shelf_life_expiration_date', 'expiration_date')
+ def _set_lot_values(self, lot):
+ super()._set_lot_values(lot)
+ self.shelf_life_expiration_date = lot.shelf_life_expiration_date
+ self.expiration_date = lot.expiration_date
+
+ def _get_lot_values(self, move):
+ values = super()._get_lot_values(move)
+ values['shelf_life_expiration_date'] = self.shelf_life_expiration_date
+ values['expiration_date'] = self.expiration_date
+ return values
+
+
+class Move(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def do(cls, moves):
+ super(Move, cls).do(moves)
+ cls.check_expiration_dates(moves)
+
+ @classmethod
+ def check_expiration_dates_types(cls):
+ "Location types to check for expiration dates"
+ return ['supplier', 'customer', 'production']
+
+ @classmethod
+ def check_expiration_dates_locations(cls):
+ pool = Pool()
+ Location = pool.get('stock.location')
+ # Prevent pack expired products
+ warehouses = Location.search([
+ ('type', '=', 'warehouse'),
+ ])
+ return [w.output_location for w in warehouses]
+
+ @property
+ def to_check_expiration(self):
+ if (self.lot
+ and self.lot.shelf_life_expiration_date
+ and self.effective_date > self.lot.shelf_life_expiration_date):
+ return True
+ return False
+
+ @classmethod
+ def check_expiration_dates(cls, moves):
+ pool = Pool()
+ Group = pool.get('res.group')
+ User = pool.get('res.user')
+ ModelData = pool.get('ir.model.data')
+ Warning = pool.get('res.user.warning')
+
+ types = cls.check_expiration_dates_types()
+ locations = cls.check_expiration_dates_locations()
+
+ def in_group():
+ group = Group(ModelData.get_id('stock_lot_sled',
+ 'group_stock_force_expiration'))
+ transition = Transaction()
+ user_id = transition.user
+ if user_id == 0:
+ user_id = transition.context.get('user', user_id)
+ if user_id == 0:
+ return True
+ user = User(user_id)
+ return group in user.groups
+
+ for move in moves:
+ if not move.to_check_expiration:
+ continue
+ if (move.from_location.type in types
+ or move.to_location.type in types
+ or move.from_location in locations
+ or move.to_location in locations):
+ values = {
+ 'move': move.rec_name,
+ 'lot': move.lot.rec_name if move.lot else '',
+ }
+ if not in_group():
+ raise LotExpiredError(
+ gettext('stock_lot_sled.msg_move_lot_expired',
+ **values))
+ else:
+ warning_name = '%s.check_expiration_dates' % move
+ if Warning.check(warning_name):
+ raise LotExpiredWarning(warning_name,
+ gettext('stock_lot_sled.msg_move_lot_expired',
+ **values))
+
+ @classmethod
+ def compute_quantities_query(cls, location_ids, with_childs=False,
+ grouping=('product',), grouping_filter=None):
+ pool = Pool()
+ Date = pool.get('ir.date')
+ Lot = pool.get('stock.lot')
+ Config = pool.get('stock.configuration')
+
+ query = super(Move, cls).compute_quantities_query(
+ location_ids, with_childs=with_childs, grouping=grouping,
+ grouping_filter=grouping_filter)
+
+ context = Transaction().context
+ today = Date.today()
+
+ stock_date_end = context.get('stock_date_end') or datetime.date.max
+ if (query and not context.get('skip_lot_sled')
+ and ((stock_date_end == today and context.get('forecast'))
+ or stock_date_end > today)):
+
+ config = Config(1)
+ shelf_life_delay = config.get_multivalue('shelf_life_delay')
+ if shelf_life_delay:
+ try:
+ expiration_date = stock_date_end + shelf_life_delay
+ except OverflowError:
+ if shelf_life_delay >= datetime.timedelta(0):
+ expiration_date = datetime.date.max
+ else:
+ expiration_date = datetime.date.min
+ else:
+ expiration_date = stock_date_end
+
+ def join(move, lot):
+ return move.join(lot, 'LEFT',
+ condition=move.lot == lot.id)
+
+ def find_table(join):
+ if not isinstance(join, Join):
+ return
+ for pos in ['left', 'right']:
+ item = getattr(join, pos)
+ if isinstance(item, Table):
+ if item._name == cls._table:
+ return join, pos, item
+ else:
+ found = find_table(item)
+ if found:
+ return found
+
+ def find_queries(query):
+ if isinstance(query, Union):
+ for sub_query in query.queries:
+ for q in find_queries(sub_query):
+ yield q
+ elif isinstance(query, Select):
+ yield query
+ for table in query.from_:
+ for q in find_queries(table):
+ yield q
+ elif isinstance(query, Join):
+ for pos in ['left', 'right']:
+ item = getattr(query, pos)
+ for q in find_queries(item):
+ yield q
+
+ def add_join(from_, lot):
+ # Find move table
+ for i, table in enumerate(from_):
+ if isinstance(table, Table) and table._name == cls._table:
+ sub_query.from_[i] = join(table, lot)
+ break
+ found = find_table(table)
+ if found:
+ join_, pos, table = found
+ setattr(join_, pos, join(table, lot))
+ break
+ else:
+ # Not query on move table
+ return False
+ return True
+
+ union, = query.from_
+ for sub_query in find_queries(union):
+ lot = Lot.__table__()
+ if add_join(sub_query.from_, lot):
+ clause = (
+ (lot.shelf_life_expiration_date == Null)
+ | (lot.shelf_life_expiration_date >= expiration_date))
+ if sub_query.where:
+ sub_query.where &= clause
+ else:
+ sub_query.where = clause
+
+ stock_date_start = context.get('stock_date_start')
+ if stock_date_start:
+ with Transaction().set_context(
+ stock_date_start=None,
+ skip_lot_sled=True):
+ query_expired = cls.compute_quantities_query(
+ location_ids, with_childs=with_childs,
+ grouping=grouping, grouping_filter=grouping_filter)
+ union_expired, = query_expired.from_
+ for sub_query in find_queries(union_expired):
+ lot = Lot.__table__()
+ if add_join(sub_query.from_, lot):
+ # only lot expiring during the period
+ clause = (
+ (lot.shelf_life_expiration_date
+ >= stock_date_start)
+ & (lot.shelf_life_expiration_date
+ < stock_date_end))
+ if sub_query.where:
+ sub_query.where &= clause
+ else:
+ sub_query.where = clause
+ # Inverse quantity
+ for column in sub_query._columns:
+ if (isinstance(column, As)
+ and column.output_name == 'quantity'):
+ column.expression = -column.expression
+ union.queries += union_expired.queries
+ return query
+
+
+class Period(metaclass=PoolMeta):
+ __name__ = 'stock.period'
+
+ @classmethod
+ @ModelView.button
+ def close(cls, periods):
+ pool = Pool()
+ Move = pool.get('stock.move')
+ Lot = pool.get('stock.lot')
+ Date = pool.get('ir.date')
+ Lang = pool.get('ir.lang')
+ cursor = Transaction().connection.cursor()
+ move = Move.__table__()
+ lot = Lot.__table__()
+
+ super(Period, cls).close(periods)
+
+ # Don't allow to close a period if all products at this date
+ # are not yet expired
+ recent_date = max(period.date for period in periods)
+ today = Date.today()
+
+ query = move.join(lot, 'INNER',
+ condition=move.lot == lot.id).select(lot.id,
+ where=(Greatest(move.effective_date, move.planned_date)
+ <= recent_date)
+ & (lot.shelf_life_expiration_date >= today)
+ )
+ cursor.execute(*query)
+ lot_id = cursor.fetchone()
+ if lot_id:
+ lot_id, = lot_id
+ lot = Lot(lot_id)
+ lang = Lang.get()
+ raise PeriodCloseError(
+ gettext('stock_lot_sled.msg_period_close_sled',
+ lot=lot.rec_name,
+ date=lang.strftime(lot.shelf_life_expiration_date)))
diff --git a/modules/stock_lot_sled/stock.xml b/modules/stock_lot_sled/stock.xml
new file mode 100644
index 0000000000..7f563dea7e
--- /dev/null
+++ b/modules/stock_lot_sled/stock.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+ Stock Force Expiration
+
+
+
+
+
+
+
+ stock.configuration
+
+ configuration_form
+
+
+
+ stock.lot
+
+ lot_form
+
+
+ stock.lot
+
+ lot_tree
+
+
+
+ stock.move.add.lots.start.lot
+
+ lot_tree
+
+
+
diff --git a/modules/stock_lot_sled/tests/__init__.py b/modules/stock_lot_sled/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_lot_sled/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_lot_sled/tests/test_module.py b/modules/stock_lot_sled/tests/test_module.py
new file mode 100644
index 0000000000..9464ff3c3c
--- /dev/null
+++ b/modules/stock_lot_sled/tests/test_module.py
@@ -0,0 +1,161 @@
+# 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 trytond.modules.company.tests import (
+ CompanyTestMixin, create_company, set_company)
+from trytond.pool import Pool
+from trytond.tests.test_tryton import ModuleTestCase, with_transaction
+from trytond.transaction import Transaction
+
+
+class StockLotSLEDTestCase(CompanyTestMixin, ModuleTestCase):
+ 'Test Stock Lot SLED module'
+ module = 'stock_lot_sled'
+ longMessage = True
+
+ @with_transaction()
+ def test_sled(self):
+ 'Test SLED'
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Template = pool.get('product.template')
+ Product = pool.get('product.product')
+ Location = pool.get('stock.location')
+ Date = pool.get('ir.date')
+ Move = pool.get('stock.move')
+ Lot = pool.get('stock.lot')
+ Period = pool.get('stock.period')
+ Config = pool.get('stock.configuration')
+
+ u, = Uom.search([('name', '=', 'Unit')])
+ template = Template(
+ name='Test SLED',
+ type='goods',
+ default_uom=u,
+ shelf_life_state='optional',
+ )
+ template.save()
+ product = Product(template=template)
+ product.save()
+
+ supplier, = Location.search([('code', '=', 'SUP')])
+ storage, = Location.search([('code', '=', 'CUS')])
+
+ company = create_company()
+ with set_company(company):
+ today = Date.today()
+
+ lot = Lot(
+ number='Test',
+ product=product,
+ shelf_life_expiration_date=today + datetime.timedelta(days=5),
+ )
+ lot.save()
+
+ move = Move(
+ product=product,
+ uom=u,
+ quantity=5,
+ from_location=supplier,
+ to_location=storage,
+ planned_date=today,
+ company=company,
+ unit_price=0,
+ currency=company.currency,
+ lot=lot,
+ )
+ move.save()
+
+ period = Period(date=today + datetime.timedelta(days=-10),
+ company=company)
+ period.save()
+ Period.close([period])
+
+ config = Config(1)
+
+ empty = {}
+ computed = {(storage.id, product.id): 5}
+ delta = {(storage.id, product.id): -5}
+ for context, result in [
+ ({'stock_date_end': datetime.date.min}, empty),
+ ({'stock_date_end': today + datetime.timedelta(days=-1)},
+ empty),
+ ({'stock_date_end': today}, empty),
+ ({'stock_date_end': today, 'forecast': True}, computed),
+ ({'stock_date_end': today + datetime.timedelta(days=3)},
+ computed),
+ ({'stock_date_end': today + datetime.timedelta(days=5)},
+ computed),
+ ({'stock_date_end': today + datetime.timedelta(days=6)},
+ empty),
+ ({}, empty),
+ ({'stock_date_start': today, 'stock_date_end': today},
+ empty),
+ ({'stock_date_start': today + datetime.timedelta(days=1),
+ 'stock_date_end': today + datetime.timedelta(days=7)},
+ delta),
+ ({'stock_date_start': today + datetime.timedelta(days=1),
+ 'stock_date_end': today + datetime.timedelta(days=2)},
+ empty),
+ ({'stock_date_start': today + datetime.timedelta(days=1),
+ 'stock_date_end': today + datetime.timedelta(days=5)},
+ empty),
+ ({'stock_date_start': today + datetime.timedelta(days=5),
+ 'stock_date_end': today + datetime.timedelta(days=6)},
+ delta),
+ ({'stock_date_start': today + datetime.timedelta(days=5),
+ 'stock_date_end': today + datetime.timedelta(days=7)},
+ delta),
+ ({'stock_date_start': today + datetime.timedelta(days=6),
+ 'stock_date_end': today + datetime.timedelta(days=7)},
+ empty),
+ ({'stock_date_end': datetime.date.max}, empty),
+ ]:
+ with Transaction().set_context(context=context,
+ locations=[storage.id]):
+ quantity = Product.products_by_location(
+ [storage.id], grouping_filter=([product.id],))
+ self.assertEqual(quantity, result,
+ msg='context: %s' % repr(context))
+
+ quantity = Product.products_by_location(
+ [storage.id], grouping_filter=([product.id],),
+ with_childs=True)
+ self.assertEqual(quantity, result,
+ msg='context: %s, with childs' % repr(context))
+
+ quantity = Product.products_by_location(
+ [storage.id],
+ grouping=('product.template',),
+ grouping_filter=([product.template.id],),)
+ self.assertEqual(quantity, result,
+ msg='template, context: %s' % repr(context))
+
+ quantity = Product.products_by_location(
+ [storage.id],
+ grouping=('product.template',),
+ grouping_filter=([product.template.id],),
+ with_childs=True)
+ self.assertEqual(quantity, result,
+ msg='template, context: %s, with_childs' %
+ repr(context))
+
+ for context, delay, result in [
+ ({'stock_date_end': datetime.date.min},
+ datetime.timedelta(days=-1), empty),
+ ({'stock_date_end': datetime.date.max},
+ datetime.timedelta(days=1), empty),
+ ]:
+ config.shelf_life_delay = delay
+ config.save()
+ with Transaction().set_context(context=context,
+ locations=[storage.id]):
+ quantity = Product.products_by_location(
+ [storage.id], grouping_filter=([product.id],))
+ self.assertEqual(quantity, result,
+ msg='context: %s; shelf_life_delay: %s' %
+ (repr(context), delay))
+
+
+del ModuleTestCase
diff --git a/modules/stock_lot_sled/tox.ini b/modules/stock_lot_sled/tox.ini
new file mode 100644
index 0000000000..40913d4cdb
--- /dev/null
+++ b/modules/stock_lot_sled/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_lot_sled/* -m unittest discover -s tests
+ coverage report --include=./**/stock_lot_sled/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_lot_sled/tryton.cfg b/modules/stock_lot_sled/tryton.cfg
new file mode 100644
index 0000000000..33acb9d245
--- /dev/null
+++ b/modules/stock_lot_sled/tryton.cfg
@@ -0,0 +1,11 @@
+[tryton]
+version=6.7.0
+depends:
+ ir
+ product
+ stock
+ stock_lot
+xml:
+ stock.xml
+ product.xml
+ message.xml
diff --git a/modules/stock_lot_sled/view/configuration_form.xml b/modules/stock_lot_sled/view/configuration_form.xml
new file mode 100644
index 0000000000..27e5c931a8
--- /dev/null
+++ b/modules/stock_lot_sled/view/configuration_form.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot_sled/view/lot_form.xml b/modules/stock_lot_sled/view/lot_form.xml
new file mode 100644
index 0000000000..11acbc1b05
--- /dev/null
+++ b/modules/stock_lot_sled/view/lot_form.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot_sled/view/lot_tree.xml b/modules/stock_lot_sled/view/lot_tree.xml
new file mode 100644
index 0000000000..911d8c805b
--- /dev/null
+++ b/modules/stock_lot_sled/view/lot_tree.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot_sled/view/template_form.xml b/modules/stock_lot_sled/view/template_form.xml
new file mode 100644
index 0000000000..cf4ffa3955
--- /dev/null
+++ b/modules/stock_lot_sled/view/template_form.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot_unit/.drone.yml b/modules/stock_lot_unit/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/stock_lot_unit/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_lot_unit/.flake8 b/modules/stock_lot_unit/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_lot_unit/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_lot_unit/.isort.cfg b/modules/stock_lot_unit/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_lot_unit/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_lot_unit/CHANGELOG b/modules/stock_lot_unit/CHANGELOG
new file mode 100644
index 0000000000..edf72b86be
--- /dev/null
+++ b/modules/stock_lot_unit/CHANGELOG
@@ -0,0 +1,30 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-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
+* Initial release
diff --git a/modules/stock_lot_unit/COPYRIGHT b/modules/stock_lot_unit/COPYRIGHT
new file mode 100644
index 0000000000..b075873b71
--- /dev/null
+++ b/modules/stock_lot_unit/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2018-2022 Cédric Krier
+Copyright (C) 2017-2022 Nicolas Évrard
+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/stock_lot_unit/LICENSE b/modules/stock_lot_unit/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_lot_unit/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/stock_lot_unit/MANIFEST.in b/modules/stock_lot_unit/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_lot_unit/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_lot_unit/README.rst b/modules/stock_lot_unit/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_lot_unit/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_lot_unit/__init__.py b/modules/stock_lot_unit/__init__.py
new file mode 100644
index 0000000000..124ac6867c
--- /dev/null
+++ b/modules/stock_lot_unit/__init__.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 Pool
+
+from . import product, stock
+from .stock import LotUnitMixin
+
+__all__ = ['LotUnitMixin', 'register']
+
+
+def register():
+ Pool.register(
+ product.Template,
+ product.Product,
+ stock.Lot,
+ stock.MoveAddLotsStartLot,
+ stock.Move,
+ stock.Inventory,
+ stock.ShipmentIn,
+ stock.ShipmentInReturn,
+ stock.ShipmentOut,
+ stock.ShipmentOutReturn,
+ module='stock_lot_unit', type_='model')
+ Pool.register(
+ stock.Production,
+ module='stock_lot_unit', type_='model',
+ depends=['production'])
+ Pool.register(
+ stock.InventoryCount,
+ module='stock_lot_unit', type_='wizard')
diff --git a/modules/stock_lot_unit/doc/index.rst b/modules/stock_lot_unit/doc/index.rst
new file mode 100644
index 0000000000..f8858c1371
--- /dev/null
+++ b/modules/stock_lot_unit/doc/index.rst
@@ -0,0 +1,14 @@
+Stock Lot Unit Module
+#####################
+
+The `stock_lot_unit` module allows to define a unit and quantity on stock lot.
+
+Lots with unit have the following properties:
+
+ - no shipment may contain a summed quantity for a lot greater than the
+ quantity of the lot.
+ - no move related to a lot with a unit may concern a quantity greater than
+ the quantity of the lot.
+
+The *Lot Unit* field is added to the product. This defines the unit to set on
+new lot.
diff --git a/modules/stock_lot_unit/exceptions.py b/modules/stock_lot_unit/exceptions.py
new file mode 100644
index 0000000000..1f4b167d61
--- /dev/null
+++ b/modules/stock_lot_unit/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 LotUnitQuantityError(ValidationError):
+ pass
diff --git a/modules/stock_lot_unit/locale/bg.po b/modules/stock_lot_unit/locale/bg.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/bg.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/ca.po b/modules/stock_lot_unit/locale/ca.po
new file mode 100644
index 0000000000..4df5e1d58d
--- /dev/null
+++ b/modules/stock_lot_unit/locale/ca.po
@@ -0,0 +1,76 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr "Unitat del lot"
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr "Unitat del lot"
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Categoria UdM del producte"
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Quantitat unitària"
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Categoria UdM del producte"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr "Unitat"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Quantitat unitària"
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr "La unitat per defecte del lot."
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr "La unitat per defecte del lot."
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "La major unitat del lot."
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "La quantitat màxima del lot."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "La major unitat del lot."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "La quantitat màxima del lot."
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr "No podeu canviar la unitat d'un lot que té moviments d'existències."
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+"No podeu canviar la quantitat d'un lot que té moviments d'existències."
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
+"No podeu utililizar més de %(quantity)s%(unit)s del lot \"%(lot)s\" en "
+"\"%(name)s\"."
diff --git a/modules/stock_lot_unit/locale/cs.po b/modules/stock_lot_unit/locale/cs.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/cs.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/de.po b/modules/stock_lot_unit/locale/de.po
new file mode 100644
index 0000000000..4274eff3ed
--- /dev/null
+++ b/modules/stock_lot_unit/locale/de.po
@@ -0,0 +1,79 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr "Chargeneinheit"
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr "Chargeneinheit"
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Standardmaßeinheitenkategorie"
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Maßeinheit Menge"
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Standardmaßeinheitenkategorie"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr "Einheit"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Maßeinheit Menge"
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr "Standardmaßeinheit für Chargen."
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr "Standardmaßeinheit für Chargen."
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "Die größte Maßeinheit für die Charge."
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "Die maximale Menge für die Charge."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "Die größte Maßeinheit für die Charge."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "Die maximale Menge für die Charge."
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+"Die Einheit einer Charge, für die es Warenbewegungen gibt, kann nicht "
+"geändert werden."
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+"Die Menge einer Charge, für die es Warenbewegungen gibt, kann nicht gändert "
+"werden."
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
+"In \"%(name)s\" kann nicht mehr als %(quantity)s%(unit)s von Charge "
+"\"%(lot)s\" verwendet werden."
diff --git a/modules/stock_lot_unit/locale/es.po b/modules/stock_lot_unit/locale/es.po
new file mode 100644
index 0000000000..1e43d29539
--- /dev/null
+++ b/modules/stock_lot_unit/locale/es.po
@@ -0,0 +1,76 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr "Unidad del lote"
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr "Unidad del lote"
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Cateogría de UdM de producto"
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Cantidad unitaria"
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Cateogoría de UdM del producto"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr "Unidad"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Cantidad unitaria"
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr "La unidad por defecto del lote."
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr "La unidad por defecto del lote."
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "La mayor unidad del lote."
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "La cantidad máxima del lote."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "La mayor unidad del lote."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "La cantidad máxima del lote."
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+"No puede cambiar la unidad de un lote que tiene movimientos de existencias."
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+"No puede cambiar la cantidad de un lote que tiene movimientos de "
+"existencias."
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr "No puede usar más de %(quantity)s%(unit)s del \"%(lot)s\" en \"%(name)s\"."
diff --git a/modules/stock_lot_unit/locale/es_419.po b/modules/stock_lot_unit/locale/es_419.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/es_419.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/et.po b/modules/stock_lot_unit/locale/et.po
new file mode 100644
index 0000000000..7aed091b1e
--- /dev/null
+++ b/modules/stock_lot_unit/locale/et.po
@@ -0,0 +1,81 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr "Partii ühik"
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr "Partii ühik"
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Vaikimisi toote mõõtühiku kategooria"
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr "Ühik"
+
+#, fuzzy
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Kogus"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Vaikimisi toote mõõtühiku kategooria"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr "Ühik"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Kogus"
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr "Partii vaikeühik."
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr "Partii vaikeühik."
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "Partii suurim ühik."
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "Suurim partiikogus."
+
+#, fuzzy
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "Partii suurim ühik."
+
+#, fuzzy
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "Suurim partiikogus."
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr "Laoliikumistega seotud partii ühikut ei saa muuta."
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr "Laoliikumistega seotud partii kogust ei saa muuta."
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
+"\"%(name)s\" ei saa kasutada suuremat partii \"%(lot)s\" kogust "
+"%(quantity)s%(unit)s"
diff --git a/modules/stock_lot_unit/locale/fa.po b/modules/stock_lot_unit/locale/fa.po
new file mode 100644
index 0000000000..7b224eca4d
--- /dev/null
+++ b/modules/stock_lot_unit/locale/fa.po
@@ -0,0 +1,81 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr "واحد قطعه"
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr "واحد قطعه"
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "دسته بندی واحد اندازه گیری محصول پیشفرض"
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr "واحد"
+
+#, fuzzy
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "مقدار"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "دسته بندی واحد اندازه گیری محصول پیشفرض"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr "واحد"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "مقدار"
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr "واحد پیشفرض قطعه."
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr "واحد پیشفرض قطعه."
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "بزرگترین واحد برای قطعه"
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "حداکثر مقدار برای قطعه."
+
+#, fuzzy
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "بزرگترین واحد برای قطعه"
+
+#, fuzzy
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "حداکثر مقدار برای قطعه."
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr "شما نمی توانید یک واحد جنس را تغییر دهید که جابجایی اجناس داشته باشد."
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr "شما نمی توانید مقدار جنس را تغییر دهید که جابجایی اجناس داشته باشد."
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
+"شما نمی توانید بیش از:\"%(quantity)s%(unit)s\" از قطعه :\"%(lot)s\" "
+"در:\"%(name)s\" استفاده کنید."
diff --git a/modules/stock_lot_unit/locale/fi.po b/modules/stock_lot_unit/locale/fi.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/fi.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/fr.po b/modules/stock_lot_unit/locale/fr.po
new file mode 100644
index 0000000000..ed4bde21de
--- /dev/null
+++ b/modules/stock_lot_unit/locale/fr.po
@@ -0,0 +1,78 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr "Unité de lot"
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr "Unité de lot"
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Catégorie d'unité de mesure par défaut"
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Quantité Unitaire"
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Catégorie d'unité de mesure par défaut"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr "Unité"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Quantité Unitaire"
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr "L'unité par défaut pour le lot."
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr "L'unité par défaut pour le lot."
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "La plus grande unité pour le lot."
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "La quantité maximal pour le lot."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "La plus grande unité pour le lot."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "La quantité maximal pour le lot."
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+"Vous ne pouvez pas changer l'unité d'un lot qui a des mouvements de stock."
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+"Vous ne pouvez pas changer la quantité d'un lot qui a des mouvements de "
+"stock."
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
+"Vous ne pouvez pas utiliser plus que %(quantity)s%(unit)s du lot « %(lot)s »"
+" sur « %(name)s »."
diff --git a/modules/stock_lot_unit/locale/hu.po b/modules/stock_lot_unit/locale/hu.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/hu.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/id.po b/modules/stock_lot_unit/locale/id.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/id.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/it.po b/modules/stock_lot_unit/locale/it.po
new file mode 100644
index 0000000000..821d0290a1
--- /dev/null
+++ b/modules/stock_lot_unit/locale/it.po
@@ -0,0 +1,81 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr "Lotto Unità"
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr "Lotto Unità"
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Categoria UdM prodotto predefinita"
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr "Unità"
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Quantità unitaria"
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Categoria UdM prodotto predefinita"
+
+#, fuzzy
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr "Unità"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Quantità unitaria"
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr "L'unità predefinita per il lotto."
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr "L'unità predefinita per il lotto."
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "L'unità più grande per il lotto."
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "La quantità massima per il lotto."
+
+#, fuzzy
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "L'unità più grande per il lotto."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "La quantità massima per il lotto."
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+"Non è possibile modificare l'unità di un lotto di stock che ha movimenti di "
+"stock."
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+"Non è possibile modificare la quantità di un lotto di stock che ha movimenti"
+" di stock."
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
+"Non è possibile utilizzare più di %(quantity)s%(unit)s del lotto \"%(lot)s\""
+" in \"%(name)s\"."
diff --git a/modules/stock_lot_unit/locale/lo.po b/modules/stock_lot_unit/locale/lo.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/lo.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/lt.po b/modules/stock_lot_unit/locale/lt.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/lt.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/nl.po b/modules/stock_lot_unit/locale/nl.po
new file mode 100644
index 0000000000..81eb65b0b0
--- /dev/null
+++ b/modules/stock_lot_unit/locale/nl.po
@@ -0,0 +1,78 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr "Batch eenheid"
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr "Batch eenheid"
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Standaard Product Maateenheid Categorie"
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Eenheid Hoeveelheid"
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr "Standaard Product Maateenheid Categorie"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr "Eenheid"
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr "Eenheid Hoeveelheid"
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr "De standaard eenheid voor een batch."
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr "De standaard eenheid voor een batch."
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "De grootste eenheid voor een batch."
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "De maximale hoeveelheid voor een batch."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr "De grootste eenheid voor het lot."
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr "De maximale hoeveelheid voor een batch."
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+"U kunt de eenheid van een batch die voorraadbewegingen heeft niet wijzigen."
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+"U kunt de hoeveelheid van een batch die voorraadbewegingen heeft niet "
+"wijzigen."
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
+"U kunt niet meer dan %(quantity)s%(unit)s van batch \"%(lot)s\" in \"% "
+"(name)s\" gebruiken."
diff --git a/modules/stock_lot_unit/locale/pl.po b/modules/stock_lot_unit/locale/pl.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/pl.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/pt.po b/modules/stock_lot_unit/locale/pt.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/pt.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/ro.po b/modules/stock_lot_unit/locale/ro.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/ro.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/ru.po b/modules/stock_lot_unit/locale/ru.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/ru.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/sl.po b/modules/stock_lot_unit/locale/sl.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/sl.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/tr.po b/modules/stock_lot_unit/locale/tr.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/tr.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/uk.po b/modules/stock_lot_unit/locale/uk.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/uk.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/locale/zh_CN.po b/modules/stock_lot_unit/locale/zh_CN.po
new file mode 100644
index 0000000000..fab9cb6cc5
--- /dev/null
+++ b/modules/stock_lot_unit/locale/zh_CN.po
@@ -0,0 +1,73 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:product.product,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:product.template,lot_unit:"
+msgid "Lot Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,product_default_uom_category:"
+msgid "Default Product UoM Category"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit:"
+msgid "Unit"
+msgstr ""
+
+msgctxt "field:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "Unit Quantity"
+msgstr ""
+
+msgctxt "help:product.product,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:product.template,lot_unit:"
+msgid "The default unit for lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit:"
+msgid "The biggest unit for the lot."
+msgstr ""
+
+msgctxt "help:stock.move.add.lots.start.lot,unit_quantity:"
+msgid "The maximal quantity for the lot."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit"
+msgid "You cannot change the unit of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_change_unit_quantity"
+msgid "You cannot change the quantity of a stock lot which has stock moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_lot_unit_quantity_greater"
+msgid ""
+"You cannot use more than %(quantity)s%(unit)s of lot \"%(lot)s\" in "
+"\"%(name)s\"."
+msgstr ""
diff --git a/modules/stock_lot_unit/message.xml b/modules/stock_lot_unit/message.xml
new file mode 100644
index 0000000000..f0412ef39d
--- /dev/null
+++ b/modules/stock_lot_unit/message.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ You cannot change the unit of a stock lot which has stock moves.
+
+
+ You cannot change the quantity of a stock lot which has stock moves.
+
+
+ You cannot use more than %(quantity)s%(unit)s of lot "%(lot)s" in "%(name)s".
+
+
+
diff --git a/modules/stock_lot_unit/product.py b/modules/stock_lot_unit/product.py
new file mode 100644
index 0000000000..f03700f435
--- /dev/null
+++ b/modules/stock_lot_unit/product.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.model import fields
+from trytond.pool import PoolMeta
+from trytond.pyson import Eval
+
+
+class Template(metaclass=PoolMeta):
+ __name__ = 'product.template'
+
+ lot_unit = fields.Many2One('product.uom', "Lot Unit",
+ domain=[
+ ('category', '=', Eval('default_uom_category', -1)),
+ ],
+ states={
+ 'invisible': Eval('type') == 'service',
+ },
+ help="The default unit for lot.")
+
+
+class Product(metaclass=PoolMeta):
+ __name__ = 'product.product'
diff --git a/modules/stock_lot_unit/product.xml b/modules/stock_lot_unit/product.xml
new file mode 100644
index 0000000000..70184cd889
--- /dev/null
+++ b/modules/stock_lot_unit/product.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+ product.template
+
+ template_form
+
+
+
diff --git a/modules/stock_lot_unit/setup.py b/modules/stock_lot_unit/setup.py
new file mode 100755
index 0000000000..b7f3e30593
--- /dev/null
+++ b/modules/stock_lot_unit/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 find_packages, setup
+
+
+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_stock_lot_unit'
+
+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_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 to define unit on stock lot',
+ 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/stock_lot_unit',
+ },
+ keywords='tryton stock lot unit serial',
+ package_dir={'trytond.modules.stock_lot_unit': '.'},
+ packages=(
+ ['trytond.modules.stock_lot_unit']
+ + ['trytond.modules.stock_lot_unit.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_lot_unit': (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 :: 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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_lot_unit = trytond.modules.stock_lot_unit
+ """,
+ )
diff --git a/modules/stock_lot_unit/stock.py b/modules/stock_lot_unit/stock.py
new file mode 100644
index 0000000000..939244a9ff
--- /dev/null
+++ b/modules/stock_lot_unit/stock.py
@@ -0,0 +1,213 @@
+# 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.i18n import gettext
+from trytond.model import ModelView, Workflow, fields
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Bool, Eval
+
+from .exceptions import LotUnitQuantityError
+
+
+class LotUnitMixin:
+ __slots__ = ()
+ unit = fields.Many2One(
+ 'product.uom', "Unit",
+ domain=[
+ ('category', '=', Eval('product_default_uom_category', -1)),
+ ],
+ help="The biggest unit for the lot.")
+ unit_quantity = fields.Float(
+ "Unit Quantity", digits='unit',
+ states={
+ 'required': Bool(Eval('unit')),
+ 'invisible': ~Eval('unit'),
+ },
+ help="The maximal quantity for the lot.")
+
+ product_default_uom_category = fields.Function(
+ fields.Many2One(
+ 'product.uom.category', "Default Product UoM Category"),
+ 'on_change_with_product_default_uom_category')
+
+ @fields.depends('product', methods=['on_change_unit'])
+ def on_change_product(self):
+ try:
+ super().on_change_product()
+ except AttributeError:
+ pass
+ if self.product and self.product.lot_unit:
+ self.unit = self.product.lot_unit
+ self.on_change_unit()
+
+ @fields.depends('unit')
+ def on_change_unit(self):
+ if self.unit:
+ self.unit_quantity = self.unit.rounding
+
+ @fields.depends('product')
+ def on_change_with_product_default_uom_category(self, name=None):
+ if self.product:
+ category = self.product.default_uom_category
+ return category.id if category else None
+
+
+class Lot(LotUnitMixin, metaclass=PoolMeta):
+ __name__ = 'stock.lot'
+
+ @classmethod
+ def __setup__(cls):
+ super(Lot, cls).__setup__()
+ cls._modify_no_move += [
+ ('unit', 'done', 'stock_lot_unit.msg_change_unit'),
+ ('unit_quantity', 'done',
+ 'stock_lot_unit.msg_change_unit_quantity'),
+ ]
+
+
+class MoveAddLotsStartLot(LotUnitMixin, metaclass=PoolMeta):
+ __name__ = 'stock.move.add.lots.start.lot'
+
+ @fields.depends(
+ 'unit', 'unit_quantity', 'quantity', 'parent', '_parent_parent.unit')
+ def _set_lot_values(self, lot):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ super()._set_lot_values(lot)
+ self.unit = lot.unit
+ self.unit_quantity = lot.unit_quantity
+ if self.parent.unit:
+ maximum_quantity = Uom.compute_qty(
+ lot.unit, lot.unit_quantity, self.parent.unit, round=False)
+ if self.quantity > maximum_quantity:
+ self.quantity = self.parent.unit.round(maximum_quantity)
+
+ def _get_lot_values(self, move):
+ values = super()._get_lot_values(move)
+ values['unit'] = self.unit
+ values['unit_quantity'] = self.unit_quantity
+ return values
+
+
+class Move(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+
+ def check_lot(self):
+ pool = Pool()
+ UoM = pool.get('product.uom')
+ super(Move, self).check_lot()
+ if (self.state == 'done'
+ and self.lot
+ and self.lot.unit):
+ quantity = UoM.compute_qty(
+ self.uom, self.quantity,
+ self.lot.unit, round=False)
+ if quantity > self.lot.unit_quantity:
+ raise LotUnitQuantityError(
+ gettext('stock_lot_unit.msg_lot_unit_quantity_greater',
+ quantity=self.lot.unit_quantity,
+ unit=self.lot.unit.symbol,
+ lot=self.lot.rec_name,
+ name=self.rec_name))
+
+
+class Inventory(metaclass=PoolMeta):
+ __name__ = 'stock.inventory'
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def confirm(cls, inventories):
+ for inventory in inventories:
+ for line in inventory.lines:
+ if (line.quantity is not None
+ and line.lot
+ and line.lot.unit
+ and line.quantity > line.lot.unit_quantity):
+ raise LotUnitQuantityError(
+ gettext('stock_lot_unit.msg_lot_unit_quantity_greater',
+ quantity=line.lot.unit_quantity,
+ unit=line.lot.unit.symbol,
+ lot=line.lot.rec_name,
+ name=line.rec_name))
+ super(Inventory, cls).confirm(inventories)
+
+
+class InventoryCount(metaclass=PoolMeta):
+ __name__ = 'stock.inventory.count'
+
+ def default_quantity(self, fields):
+ pool = Pool()
+ InventoryLine = pool.get('stock.inventory.line')
+ UoM = pool.get('product.uom')
+ values = super(InventoryCount, self).default_quantity(fields)
+ line = InventoryLine(values['line'])
+ if line.lot and line.lot.unit:
+ values['quantity'] = UoM.compute_qty(
+ line.lot.unit, line.lot.unit_quantity,
+ line.uom)
+ return values
+
+
+class LotUnitMixin(object):
+ __slots__ = ()
+ _lot_unit_moves = None
+
+ @classmethod
+ def validate(cls, shipments):
+ pool = Pool()
+ UoM = pool.get('product.uom')
+
+ super(LotUnitMixin, cls).validate(shipments)
+
+ for shipment in shipments:
+ for move_attribute in cls._lot_unit_moves:
+ lot_quantities = defaultdict(int)
+ for move in getattr(shipment, move_attribute):
+ if move.state != 'done':
+ continue
+ if not move.lot or not move.lot.unit:
+ continue
+ lot_quantities[move.lot] += UoM.compute_qty(
+ move.uom, move.quantity,
+ move.lot.unit, round=False)
+ for lot, quantity in lot_quantities.items():
+ if quantity > lot.unit_quantity:
+ raise LotUnitQuantityError(
+ gettext('stock_lot_unit'
+ '.msg_lot_unit_quantity_greater',
+ quantity=lot.unit_quantity,
+ unit=lot.unit.symbol,
+ lot=lot.rec_name,
+ name=shipment.rec_name))
+
+
+class ShipmentIn(LotUnitMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in'
+ _lot_unit_moves = ['incoming_moves', 'inventory_moves']
+
+
+class ShipmentInReturn(LotUnitMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in.return'
+ _lot_unit_moves = ['moves']
+
+
+class ShipmentOut(LotUnitMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out'
+ _lot_unit_moves = ['outgoing_moves', 'inventory_moves']
+
+
+class ShipmentOutReturn(LotUnitMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out.return'
+ _lot_unit_moves = ['incoming_moves', 'inventory_moves']
+
+
+class ShipmentInternal(LotUnitMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.internal'
+ _lot_unit_moves = ['incoming_moves', 'outgoing_moves']
+
+
+class Production(LotUnitMixin, metaclass=PoolMeta):
+ __name__ = 'production'
+ _lot_unit_moves = ['inputs', 'outputs']
diff --git a/modules/stock_lot_unit/stock.xml b/modules/stock_lot_unit/stock.xml
new file mode 100644
index 0000000000..59e5a2d692
--- /dev/null
+++ b/modules/stock_lot_unit/stock.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+ stock.lot
+
+ lot_form
+
+
+
+ stock.lot
+
+ lot_list
+
+
+
+ stock.move.add.lots.start.lot
+
+ lot_list
+
+
+
diff --git a/modules/stock_lot_unit/tests/__init__.py b/modules/stock_lot_unit/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_lot_unit/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_lot_unit/tests/scenario_stock_lot_unit.rst b/modules/stock_lot_unit/tests/scenario_stock_lot_unit.rst
new file mode 100644
index 0000000000..dce1906b4c
--- /dev/null
+++ b/modules/stock_lot_unit/tests/scenario_stock_lot_unit.rst
@@ -0,0 +1,191 @@
+=======================
+Stock Lot Unit Scenario
+=======================
+
+Imports::
+
+ >>> import datetime
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from proteus import config, 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('stock_lot_unit')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create supplier::
+
+ >>> supplier = Party(name='Supplier')
+ >>> supplier.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.lot_unit = unit
+ >>> template.save()
+ >>> product, = template.products
+ >>> product.cost_price = Decimal('8')
+ >>> product.save()
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> input_loc, = Location.find([('code', '=', 'IN')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+
+Create an incoming shipment without lot::
+
+ >>> ShipmentIn = Model.get('stock.shipment.in')
+ >>> shipment = ShipmentIn()
+ >>> shipment.supplier = supplier
+ >>> move1 = shipment.incoming_moves.new()
+ >>> move1.product = product
+ >>> move1.quantity = 60
+ >>> move1.unit_price = Decimal('8')
+ >>> move1.currency = company.currency
+ >>> move1.from_location = supplier_loc
+ >>> move1.to_location = input_loc
+ >>> move2 = shipment.incoming_moves.new()
+ >>> move2.product = product
+ >>> move2.quantity = 40
+ >>> move2.unit_price = Decimal('8')
+ >>> move2.currency = company.currency
+ >>> move2.from_location = supplier_loc
+ >>> move2.to_location = input_loc
+ >>> shipment.click('receive')
+ >>> shipment.click('done')
+
+Let's ship a product with a lot::
+
+ >>> Lot = Model.get('stock.lot')
+ >>> lot = Lot(number='00001', product=product)
+ >>> lot.unit == unit
+ True
+ >>> lot.unit_quantity
+ 1.0
+ >>> lot.save()
+
+ >>> ShipmentOut = Model.get('stock.shipment.out')
+ >>> shipment = ShipmentOut()
+ >>> shipment.customer = customer
+ >>> move = shipment.outgoing_moves.new()
+ >>> move.product = product
+ >>> move.quantity = 1
+ >>> move.unit_price = Decimal('20')
+ >>> move.currency = company.currency
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> shipment.click('wait')
+ >>> shipment.click('assign_try')
+ True
+ >>> move.lot = lot
+ >>> shipment.click('pick')
+ >>> shipment.click('pack')
+ >>> shipment.click('done')
+
+Let's ship now two times the same lot::
+
+ >>> lot = Lot(number='00002', product=product)
+ >>> lot.save()
+
+ >>> shipment = ShipmentOut()
+ >>> shipment.customer = customer
+ >>> move1 = shipment.outgoing_moves.new()
+ >>> move1.product = product
+ >>> move1.quantity = 1
+ >>> move1.unit_price = Decimal('20')
+ >>> move1.currency = company.currency
+ >>> move1.from_location = output_loc
+ >>> move1.to_location = customer_loc
+ >>> move2 = shipment.outgoing_moves.new()
+ >>> move2.product = product
+ >>> move2.quantity = 1
+ >>> move2.unit_price = Decimal('20')
+ >>> move2.currency = company.currency
+ >>> move2.from_location = output_loc
+ >>> move2.to_location = customer_loc
+ >>> shipment.click('wait')
+ >>> shipment.click('assign_try')
+ True
+ >>> move1, move2 = shipment.inventory_moves
+ >>> move1.lot = lot
+ >>> move2.lot = lot
+ >>> shipment.save()
+ >>> shipment.click('pick') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ LotUnitQuantityError: ...
+
+Now let's ship one move with a quantity bigger than lot unit quantity::
+
+ >>> lot = Lot(number='00003', product=product)
+ >>> lot.unit_quantity = 3
+ >>> lot.save()
+
+ >>> shipment = ShipmentOut()
+ >>> shipment.customer = customer
+ >>> move = shipment.outgoing_moves.new()
+ >>> move.product = product
+ >>> move.quantity = 4
+ >>> move.unit_price = Decimal('20')
+ >>> move.currency = company.currency
+ >>> move.from_location = output_loc
+ >>> move.to_location = customer_loc
+ >>> shipment.click('wait')
+ >>> shipment.click('assign_try')
+ True
+ >>> move, = shipment.inventory_moves
+ >>> move.lot = lot
+ >>> shipment.click('pick') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ LotUnitQuantityError: ...
+
+Make an inventory::
+
+ >>> lot = Lot(number='00004', product=product)
+ >>> lot.unit_quantity = 2
+ >>> lot.save()
+
+ >>> Inventory = Model.get('stock.inventory')
+ >>> inventory = Inventory()
+ >>> inventory.location = storage_loc
+ >>> line = inventory.lines.new()
+ >>> line.product = product
+ >>> line.lot = lot
+ >>> line.quantity = 3
+ >>> inventory.save()
+ >>> inventory.click('confirm') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ LotUnitQuantityError: ...
+
+ >>> line, = inventory.lines
+ >>> line.quantity = 2
+ >>> inventory.click('confirm')
diff --git a/modules/stock_lot_unit/tests/scenario_stock_lot_unit_move_add.rst b/modules/stock_lot_unit/tests/scenario_stock_lot_unit_move_add.rst
new file mode 100644
index 0000000000..74f1a9801d
--- /dev/null
+++ b/modules/stock_lot_unit/tests/scenario_stock_lot_unit_move_add.rst
@@ -0,0 +1,75 @@
+================================
+Stock Lot Unit Move Add 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_lot_unit')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+
+Create a move::
+
+ >>> Move = Model.get('stock.move')
+ >>> move = Move()
+ >>> move.from_location = storage_loc
+ >>> move.to_location = customer_loc
+ >>> move.product = product
+ >>> move.quantity = 5
+ >>> move.unit_price = Decimal('20')
+ >>> move.currency = company.currency
+ >>> move.save()
+
+Create a lot::
+
+ >>> Lot = Model.get('stock.lot')
+ >>> lot = Lot(number='01', product=product)
+ >>> lot.unit = unit
+ >>> lot.unit_quantity = 1
+ >>> lot.save()
+
+Add a lot::
+
+ >>> add_lots = Wizard('stock.move.add.lots', [move])
+ >>> lot = add_lots.form.lots.new()
+ >>> lot.quantity
+ 5.0
+ >>> lot.product = product # proteus does not set reverse domain
+ >>> lot.number = '01'
+ >>> lot.unit == unit
+ True
+ >>> lot.unit_quantity
+ 1.0
+ >>> lot.quantity
+ 1.0
diff --git a/modules/stock_lot_unit/tests/test_module.py b/modules/stock_lot_unit/tests/test_module.py
new file mode 100644
index 0000000000..0c20ccf123
--- /dev/null
+++ b/modules/stock_lot_unit/tests/test_module.py
@@ -0,0 +1,13 @@
+# 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.tests.test_tryton import ModuleTestCase
+
+
+class StockLotUnitTestCase(ModuleTestCase):
+ 'Test Stock Lot Unit module'
+ module = 'stock_lot_unit'
+ extras = ['production']
+
+
+del ModuleTestCase
diff --git a/modules/stock_lot_unit/tests/test_scenario.py b/modules/stock_lot_unit/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/stock_lot_unit/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock_lot_unit/tox.ini b/modules/stock_lot_unit/tox.ini
new file mode 100644
index 0000000000..eb3a1d6a76
--- /dev/null
+++ b/modules/stock_lot_unit/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_lot_unit/* -m unittest discover -s tests
+ coverage report --include=./**/stock_lot_unit/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_lot_unit/tryton.cfg b/modules/stock_lot_unit/tryton.cfg
new file mode 100644
index 0000000000..63b1795d5e
--- /dev/null
+++ b/modules/stock_lot_unit/tryton.cfg
@@ -0,0 +1,14 @@
+[tryton]
+version=6.7.0
+depends:
+ ir
+ res
+ product
+ stock
+ stock_lot
+extras_depend:
+ production
+xml:
+ product.xml
+ stock.xml
+ message.xml
diff --git a/modules/stock_lot_unit/view/lot_form.xml b/modules/stock_lot_unit/view/lot_form.xml
new file mode 100644
index 0000000000..c01f8e1b22
--- /dev/null
+++ b/modules/stock_lot_unit/view/lot_form.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot_unit/view/lot_list.xml b/modules/stock_lot_unit/view/lot_list.xml
new file mode 100644
index 0000000000..25d4788b43
--- /dev/null
+++ b/modules/stock_lot_unit/view/lot_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_lot_unit/view/template_form.xml b/modules/stock_lot_unit/view/template_form.xml
new file mode 100644
index 0000000000..e302b3507f
--- /dev/null
+++ b/modules/stock_lot_unit/view/template_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package/.drone.yml b/modules/stock_package/.drone.yml
new file mode 100644
index 0000000000..cb4fbecb4d
--- /dev/null
+++ b/modules/stock_package/.drone.yml
@@ -0,0 +1,70 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_package/.flake8 b/modules/stock_package/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_package/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_package/.isort.cfg b/modules/stock_package/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_package/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_package/CHANGELOG b/modules/stock_package/CHANGELOG
new file mode 100644
index 0000000000..229e80a85f
--- /dev/null
+++ b/modules/stock_package/CHANGELOG
@@ -0,0 +1,67 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Allow package type to be deactivated
+* Add volume dimensions to package
+* Filter out moves without quantity from package
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-01
+* Bug fixes (see mercurial logs for details)
+* Remove dummy label report
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+* Include package weight to weight parcel
+* Add package weight
+
+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)
+* Add open/closed state on package
+
+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)
+* Check package also when packing shipment
+
+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
+Version 3.4.0 - 2014-10-20
+* Bug fixes (see mercurial logs for details)
+
+Version 3.2.0 - 2014-04-21
+* Initial release
diff --git a/modules/stock_package/COPYRIGHT b/modules/stock_package/COPYRIGHT
new file mode 100644
index 0000000000..983ad2cd2f
--- /dev/null
+++ b/modules/stock_package/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/stock_package/LICENSE b/modules/stock_package/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_package/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/stock_package/MANIFEST.in b/modules/stock_package/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_package/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_package/README.rst b/modules/stock_package/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_package/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_package/__init__.py b/modules/stock_package/__init__.py
new file mode 100644
index 0000000000..17f468e7ac
--- /dev/null
+++ b/modules/stock_package/__init__.py
@@ -0,0 +1,18 @@
+# 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 stock
+
+
+def register():
+ Pool.register(
+ stock.Configuration,
+ stock.ConfigurationSequence,
+ stock.Type,
+ stock.Package,
+ stock.Move,
+ stock.ShipmentOut,
+ stock.ShipmentInReturn,
+ module='stock_package', type_='model')
diff --git a/modules/stock_package/doc/index.rst b/modules/stock_package/doc/index.rst
new file mode 100644
index 0000000000..dadaff3115
--- /dev/null
+++ b/modules/stock_package/doc/index.rst
@@ -0,0 +1,13 @@
+Stock Package Module
+####################
+
+The stock package module allows to store packaging information about customer
+and supplier return shipments.
+
+Package
+*******
+
+A package groups together some moves from the same shipment.
+The packages can be organized in a tree structure.
+If a package is defined on a shipment, this one could be set to *Done* only if
+all moves are packaged.
diff --git a/modules/stock_package/exceptions.py b/modules/stock_package/exceptions.py
new file mode 100644
index 0000000000..5a473d8170
--- /dev/null
+++ b/modules/stock_package/exceptions.py
@@ -0,0 +1,13 @@
+# 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
+from trytond.model.exceptions import ValidationError
+
+
+class PackageError(UserError):
+ pass
+
+
+class PackageValidationError(ValidationError):
+ pass
diff --git a/modules/stock_package/locale/bg.po b/modules/stock_package/locale/bg.po
new file mode 100644
index 0000000000..07bb701237
--- /dev/null
+++ b/modules/stock_package/locale/bg.po
@@ -0,0 +1,257 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Наследници"
+
+#, fuzzy
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Код"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Движения"
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Родител"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Вид"
+
+#, fuzzy
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Условие за плащане"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+#, fuzzy
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Package Types"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/ca.po b/modules/stock_package/locale/ca.po
new file mode 100644
index 0000000000..b1f6e1a1a6
--- /dev/null
+++ b/modules/stock_package/locale/ca.po
@@ -0,0 +1,253 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "Seqüència de paquet"
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "Seqüència de paquet"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "Paquet"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Fills"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Codi"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Moviments"
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "Alçada del paquet"
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "UdM de l'alçada del paquet"
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "Longitud del paquet"
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "UdM de la longitud del paquet"
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Volum del paquet"
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "UdM del volum del paquet"
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Pes del paquet"
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "UdM del pes del paquet"
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "Amplada del paquet"
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "UdM de l'amplada del paquet"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Albarà"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr "Estat"
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Tipus"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "Alçada del paquet"
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "UdM de l'alçada del paquet"
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "Longitud del paquet"
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "UdM de la longitud del paquet"
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Volum del paquet"
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "UdM del volum del paquet"
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Pes del paquet"
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "UdM del pes del paquet"
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "Amplada del paquet"
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "UdM de l'amplada del paquet"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "Paquets"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "Paquets"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "Paquets"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "Paquets"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr "L'alçada del paquet."
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr "La longitud del paquet."
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr "El volum del paquet."
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr "El pes del paquet quan està buit."
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr "L'amplada del paquet."
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr "L'alçada del paquet."
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr "La longitud del paquet."
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr "El volum del paquet."
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr "El pes del paquet quan està buit."
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr "L'amplada del paquet."
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Tipus de paquet"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+"Per a processar l'albarà \"%(shipment)s\", heu d'empaquetar tots els seus "
+"moviments."
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+"El volum (%(volume)s) del paquet \"%(package)s\" és massa petit per al volum"
+" total (%(children_volume)s) dels seus paquets fills."
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr "Usuari a les empreses"
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Paquet"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Paquet"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Tipus de paquet"
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Paquet"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "Tipus de paquet"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr "Tancat"
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr "Obert"
+
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Paquet"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Seqüència"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr "Mesures"
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr "Mesures"
diff --git a/modules/stock_package/locale/cs.po b/modules/stock_package/locale/cs.po
new file mode 100644
index 0000000000..194689ace9
--- /dev/null
+++ b/modules/stock_package/locale/cs.po
@@ -0,0 +1,252 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+#, fuzzy
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Package Types"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/de.po b/modules/stock_package/locale/de.po
new file mode 100644
index 0000000000..3d2f24d6c6
--- /dev/null
+++ b/modules/stock_package/locale/de.po
@@ -0,0 +1,254 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "Nummernkreis Paket"
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "Nummernkreis Paket"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "Paket"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Untergeordnet (Paket)"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Warenbewegungen"
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "Verpackungshöhe"
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Maßeinheit Verpackungshöhe"
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "Verpackungslänge"
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Maßeinheit Verpackungslänge"
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Verpackungsvolumen"
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Maßeinheit Verpackungsvolumen"
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Verpackungsgewicht"
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Maßeinheit Verpackungsgewicht"
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "Verpackungsbreite"
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Maßeinheit Verpackungsbreite"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Übergeordnet (Paket)"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Lieferungen"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "Verpackungshöhe"
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Maßeinheit Verpackungshöhe"
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "Verpackungslänge"
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Maßeinheit Verpackungslänge"
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Verpackungsvolumen"
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Maßeinheit Verpackungsvolumen"
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Verpackungsgewicht"
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Maßeinheit Verpackungsgewicht"
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "Verpackungsbreite"
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Maßeinheit Verpackungsbreite"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "Pakete"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "Pakete"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "Pakete"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "Pakete"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr "Die Höhe der Verpackung."
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr "Die Länge der Verpackung."
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr "Das Volumen der Verpackung."
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr "Das Leergewicht der Verpackung."
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr "Die Breite der Verpackung."
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr "Die Höhe der Verpackung."
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr "Die Länge der Verpackung."
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr "Das Volumen der Verpackung."
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr "Das Leergewicht der Verpackung."
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr "Die Breite der Verpackung."
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Packstücktypen"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+"Damit die Lieferung \"%(shipment)s\" ausgeführt werden kann, müssen zuerst "
+"alle zugehörigen Warenbewegung gepackt werden."
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+"Das Volumen (%(volume)s) des Pakets \"%(package)s\" ist zu niedrig im "
+"Vergleich zum aufsummierten Volumen (%(children_volume)s) der "
+"untergeordneten Pakete."
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr "Benutzer im Unternehmen"
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Lager Paket"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Lager Paket"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Packstücktypen"
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Lager Paket"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "Lager Packstücktyp"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr "Geschlossen"
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr "Offen"
+
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Paket"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Nummernkreis"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr "Abmessungen"
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr "Abmessungen"
diff --git a/modules/stock_package/locale/es.po b/modules/stock_package/locale/es.po
new file mode 100644
index 0000000000..285a775e0b
--- /dev/null
+++ b/modules/stock_package/locale/es.po
@@ -0,0 +1,253 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "Secuencia de paquete"
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "Secuencia de paquete"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "Paquete"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Hijos"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Movimientos"
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "Altura del paquete"
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "UdM de la altura del paquete"
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "Longitud del paquete"
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "UdM de la longitud del paquete"
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Volumen del paquete"
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "UdM del volumen del paquete"
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Peso del paquete"
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "UdM del peso del paquete"
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "Ancho del paquete"
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "UdM del ancho del paquete"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Albarán"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr "Estado"
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "Altura del paquete"
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "UdM de la altura del paquete"
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "Longitud del paquete"
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "UdM de la longitud del paquete"
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Volumen del paquete"
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "UdM del volumen del paquete"
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Peso del paquete"
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "UdM del peso del paquete"
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "Ancho del paquete"
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "UdM del ancho del paquete"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "Paquetes"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "Paquetes"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "Paquetes"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "Paquetes"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr "La altura del paquete."
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr "La longitud del paquete."
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr "El volumen del paquete."
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr "El peso del paquete cuando esta vacío."
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr "El ancho del paquete."
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr "La altura del paquete."
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr "La longitud del paquete."
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr "El volumen del paquete."
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr "El peso del paquete cuando esta vacío."
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr "El ancho del paquete."
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Tipos de paquete"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+"Para procesar el albarán \"%(shipment)s\", debe empaquetar todos sus "
+"movimientos."
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+"El volumen (%(volume)s) del paquete \"%(package)s\" es demasiado pequeño "
+"respecto el volumen total (%(children_volume)s) de sus paquetes hijos."
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr "Usuario en las empresas"
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Paquete"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Paquete"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Tipos de paquete"
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Paquete"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "Tipo de paquete"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr "Cerrado"
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr "Abierto"
+
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Paquete"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr "Medidas"
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr "Medidas"
diff --git a/modules/stock_package/locale/es_419.po b/modules/stock_package/locale/es_419.po
new file mode 100644
index 0000000000..780276f826
--- /dev/null
+++ b/modules/stock_package/locale/es_419.po
@@ -0,0 +1,252 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Envío"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Empaquetado de stock"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Empaquetado de stock"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr ""
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Empaquetado de stock"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "Tipo de empaquetado de stock"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Empaquetado de stock"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/et.po b/modules/stock_package/locale/et.po
new file mode 100644
index 0000000000..4bce8bb708
--- /dev/null
+++ b/modules/stock_package/locale/et.po
@@ -0,0 +1,271 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "Pakendamise jada"
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "Pakendamise jada"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "Pakend"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Alamjaotus"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Kood"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Kanded"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Pakend"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Ülemjaotus"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Tarne"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr "Olek"
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Tüüp"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Nimi"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Pakend"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "Pakendid"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "Pakendid"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "Pakendid"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "Pakendid"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Pakendi tüüp"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Laopakend"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Laopakend"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Pakendi tüüp"
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Laopakend"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "Laopakendi tüüp"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr "Suletud"
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr "Avatud"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Pakend"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Pakendamise jada"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/fa.po b/modules/stock_package/locale/fa.po
new file mode 100644
index 0000000000..8e00d07fc9
--- /dev/null
+++ b/modules/stock_package/locale/fa.po
@@ -0,0 +1,273 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "ادامه بسته"
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "ادامه بسته"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "بسته"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "زیر مجموعه"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "کد"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "جابجایی ها"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "بسته"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "منبع"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "محموله"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "نوع"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "نام"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "بسته"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "بسته ها"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "بسته ها"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "بسته ها"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "بسته ها"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "انواع بسته"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+"برای پردازش محموله :\"%(shipment)s\"، شما باید همه جابجایی های آن را بسته "
+"بندی کنید."
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "بسته کالا"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "بسته کالا"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "انواع بسته"
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "بسته کالا"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "نوع بسته کالا"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "بسته"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "ادامه بسته"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/fi.po b/modules/stock_package/locale/fi.po
new file mode 100644
index 0000000000..4664a56f4d
--- /dev/null
+++ b/modules/stock_package/locale/fi.po
@@ -0,0 +1,251 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+#, fuzzy
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Package Types"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/fr.po b/modules/stock_package/locale/fr.po
new file mode 100644
index 0000000000..2be950cd6e
--- /dev/null
+++ b/modules/stock_package/locale/fr.po
@@ -0,0 +1,253 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "Séquence d'emballage"
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "Séquence d'emballage"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "Emballage"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Enfants"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Mouvements"
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "Hauteur de l'emballage"
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Hauteur de l'emballage UDM"
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "Longueur de l'emballage"
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Longueur de l'emballage UDM"
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Volume de l'emballage"
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Volume de l'emballage UDM"
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Poids de l'emballage"
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Poids de l'emballage UDM"
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "Largeur de l'emballage"
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Largeur de l'emballage UDM"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Expédition"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr "État"
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "Hauteur de l'emballage"
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Hauteur de l'emballage UDM"
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "Longueur de l'emballage"
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Longueur de l'emballage UDM"
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Volume de l'emballage"
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Volume de l'emballage UDM"
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Poids de l'emballage"
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Poids de l'emballage UDM"
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "Largeur de l'emballage"
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Largeur de l'emballage UDM"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "Emballages"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "Emballages"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "Emballages"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "Emballages"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr "La hauteur de l'emballage."
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr "La longueur de l'emballage."
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr "Le volume de l'emballage."
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr "Le poids du colis vide."
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr "La largeur de l'emballage."
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr "La hauteur de l'emballage."
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr "La longueur de l'emballage."
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr "Le volume de l'emballage."
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr "Le poids du colis vide."
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr "La largeur de l'emballage."
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Types d'emballage"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+"Pour traiter l’expédition « %(shipment)s », vous devez emballer tous ces "
+"mouvements."
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+"Le volume (%(volume)s) de l'emballage « %(package)s » est trop petit pour le"
+" volume additionné (%(children_volume)s) de ses colis enfants."
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr "Utilisateur dans les sociétés"
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Emballage de stock"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Emballage de stock"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Types d'emballage"
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Emballage de stock"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "Type d'emballage de stock"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr "Fermé"
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr "Ouvert"
+
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Emballage"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr "Mesures"
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr "Mesures"
diff --git a/modules/stock_package/locale/hu.po b/modules/stock_package/locale/hu.po
new file mode 100644
index 0000000000..fbc6f56794
--- /dev/null
+++ b/modules/stock_package/locale/hu.po
@@ -0,0 +1,276 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "Csomag számkör"
+
+#, fuzzy
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "Csomag számkör"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "Csomag"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Gyermek (csomag)"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Kód"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Raktár mozgatás"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Csomag"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Szülő (csomag)"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Szállítási tétel"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Típus"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Név"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Csomag"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "Csomagok"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "Csomagok"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "Csomagok"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "Csomagok"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Raktár csomag"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "Raktár csomag típus"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Csomag"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Csomag számkör"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/id.po b/modules/stock_package/locale/id.po
new file mode 100644
index 0000000000..866e489bac
--- /dev/null
+++ b/modules/stock_package/locale/id.po
@@ -0,0 +1,249 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Cabang"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Kode"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Perpindahan"
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Induk"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Nama"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr ""
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr ""
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr "Buka"
+
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Urutan"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/it.po b/modules/stock_package/locale/it.po
new file mode 100644
index 0000000000..0bdd108f22
--- /dev/null
+++ b/modules/stock_package/locale/it.po
@@ -0,0 +1,255 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Figlio"
+
+#, fuzzy
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Codice"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Movimenti"
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr "Stato"
+
+#, fuzzy
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Nome"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+#, fuzzy
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Package Types"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/lo.po b/modules/stock_package/locale/lo.po
new file mode 100644
index 0000000000..bbc64154d4
--- /dev/null
+++ b/modules/stock_package/locale/lo.po
@@ -0,0 +1,257 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "ໝວດຍ່ອຍ"
+
+#, fuzzy
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "ລະຫັດແຂວງ"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "ຕັດບັນຊີສາງ"
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "ຮ່ວງ"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "ຮູບແບບ"
+
+#, fuzzy
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "ຊື່"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+#, fuzzy
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Package Types"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/lt.po b/modules/stock_package/locale/lt.po
new file mode 100644
index 0000000000..194689ace9
--- /dev/null
+++ b/modules/stock_package/locale/lt.po
@@ -0,0 +1,252 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Namu"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+#, fuzzy
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Package Types"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/nl.po b/modules/stock_package/locale/nl.po
new file mode 100644
index 0000000000..96f5fb2b7d
--- /dev/null
+++ b/modules/stock_package/locale/nl.po
@@ -0,0 +1,253 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "Pakketvolgorde"
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "Pakketvolgorde"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "Pakket"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Onderliggende niveaus"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Code"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Mutaties"
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "Hoogte verpakking"
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Maateenheid hoogte verpakking"
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "Lengte verpakking"
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Maateenheid lengte verpakking"
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Volume verpakking"
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Maateenheid volume verpakking"
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Gewicht verpakking"
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Maateenheid gewicht verpakking"
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "Breedte verpakking"
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Maateenheid breedte verpakking"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Levering"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr "Status"
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Type"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Naam"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "Hoogte verpakking"
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Maateenheid hoogte verpakking"
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "Lengte verpakking"
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Maateenheid lengte verpakking"
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Volume verpakking"
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Maateenheid volume verpakking"
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Gewicht verpakking"
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Maateenheid gewicht verpakking"
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "Breedte verpakking"
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Maateenheid breedte verpakking"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "Pakketten"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "Pakketten"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "Pakketten"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "Pakketten"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr "De hoogte van de verpakking."
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr "De lengte van de verpakking."
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr "Het volume van de verpakking."
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr "Het gewicht van de lege verpakking."
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr "De breedte van de verpakking."
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr "De hoogte van de verpakking."
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr "De lengte van de verpakking."
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr "Het volume van de verpakking."
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr "Het gewicht van de lege verpakking."
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr "De breedte van de verpakking."
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Pakket Soorten"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+"Om zending \"%(shipment)s\" te verwerken, moet u alle voorraadmutaties "
+"inpakken."
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+"Het volume (%(volume)s) van verpakking \"%(package)s\" is te klein voor het "
+"totale volume (%(children_volume)s) van de onderliggende verpakkingen."
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr "Gebruiker in het bedrijf"
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Voorraad Verpakking"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Voorraad Verpakking"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Pakket Soorten"
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Voorraad Verpakking"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "Voorraad Pakket Soort"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr "Afgesloten"
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr "Open"
+
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Verpakking"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr "Afmetingen"
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr "Afmetingen"
diff --git a/modules/stock_package/locale/pl.po b/modules/stock_package/locale/pl.po
new file mode 100644
index 0000000000..6a0c5d1efb
--- /dev/null
+++ b/modules/stock_package/locale/pl.po
@@ -0,0 +1,276 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "Sekwencja paczki"
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "Sekwencja paczki"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "Paczka"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Podrzędne paczki"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Kod"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Ruchy"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Paczka"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Paczka nadrzędna"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Wysyłka"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Typ"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Nazwa"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Paczka"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "Paczki"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "Paczki"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "Paczki"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "Paczki"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+#, fuzzy
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Paczka"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Sekwencja paczki"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/pt.po b/modules/stock_package/locale/pt.po
new file mode 100644
index 0000000000..0677caf38b
--- /dev/null
+++ b/modules/stock_package/locale/pt.po
@@ -0,0 +1,275 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "Sequência das Embalagens"
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "Sequência dos Pacotes"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "Pacote"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Filhos"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Código"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Movimentações"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Pacote"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Pai"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Remessa"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Tipo"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Nome"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Pacote"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "Pacotes"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "Pacotes"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "Pacotes"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "Pacotes"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Estoque de Pacote"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "Tipo de Estoque de Pacote"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Pacote"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Sequência das Embalagens"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/ro.po b/modules/stock_package/locale/ro.po
new file mode 100644
index 0000000000..f44f6b29db
--- /dev/null
+++ b/modules/stock_package/locale/ro.po
@@ -0,0 +1,249 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Copii"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Cod"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Părinte"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Expediere"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr ""
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr ""
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr "Închis"
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Secvenţă"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/ru.po b/modules/stock_package/locale/ru.po
new file mode 100644
index 0000000000..8ec21e585c
--- /dev/null
+++ b/modules/stock_package/locale/ru.po
@@ -0,0 +1,258 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Подчиненый"
+
+#, fuzzy
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Код языка"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Перемещения"
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Предок"
+
+#, fuzzy
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Доставка"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Тип"
+
+#, fuzzy
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Правило оплаты"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+#, fuzzy
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Package Types"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/sl.po b/modules/stock_package/locale/sl.po
new file mode 100644
index 0000000000..f62909b36a
--- /dev/null
+++ b/modules/stock_package/locale/sl.po
@@ -0,0 +1,275 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr "Štetje paketov"
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr "Štetje paketov"
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr "Paket"
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "Podpaketi"
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "Šifra"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr "Promet"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Paket"
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "Matični paket"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr "Pošiljka"
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "Tip"
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "Naziv"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr "Paket"
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr "Paketi"
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr "Paketi"
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr "Paketi"
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr "Paketi"
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+#, fuzzy
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Paket"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr "Vrsta paketa"
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Paket"
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr "Štetje paketov"
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/tr.po b/modules/stock_package/locale/tr.po
new file mode 100644
index 0000000000..4664a56f4d
--- /dev/null
+++ b/modules/stock_package/locale/tr.po
@@ -0,0 +1,251 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+#, fuzzy
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Package Types"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/uk.po b/modules/stock_package/locale/uk.po
new file mode 100644
index 0000000000..34465616a2
--- /dev/null
+++ b/modules/stock_package/locale/uk.po
@@ -0,0 +1,249 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr ""
+
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr ""
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr ""
+
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr ""
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr ""
+
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr ""
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr ""
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/locale/zh_CN.po b/modules/stock_package/locale/zh_CN.po
new file mode 100644
index 0000000000..84be1dbca7
--- /dev/null
+++ b/modules/stock_package/locale/zh_CN.po
@@ -0,0 +1,256 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:stock.configuration,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.configuration.sequence,package_sequence:"
+msgid "Package Sequence"
+msgstr ""
+
+msgctxt "field:stock.move,package:"
+msgid "Package"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,children:"
+msgid "Children"
+msgstr "子项"
+
+#, fuzzy
+msgctxt "field:stock.package,code:"
+msgid "Code"
+msgstr "语言编码"
+
+msgctxt "field:stock.package,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:stock.package,moves:"
+msgid "Moves"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,parent:"
+msgid "Parent"
+msgstr "上级"
+
+msgctxt "field:stock.package,shipment:"
+msgid "Shipment"
+msgstr ""
+
+msgctxt "field:stock.package,state:"
+msgid "State"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,type:"
+msgid "Type"
+msgstr "类型"
+
+#, fuzzy
+msgctxt "field:stock.package.type,name:"
+msgid "Name"
+msgstr "纳木"
+
+msgctxt "field:stock.package.type,packaging_height:"
+msgid "Packaging Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_height_uom:"
+msgid "Packaging Height UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length:"
+msgid "Packaging Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_length_uom:"
+msgid "Packaging Length UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume:"
+msgid "Packaging Volume"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_volume_uom:"
+msgid "Packaging Volume UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight:"
+msgid "Packaging Weight"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_weight_uom:"
+msgid "Packaging Weight UOM"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width:"
+msgid "Packaging Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,packaging_width_uom:"
+msgid "Packaging Width UOM"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,root_packages:"
+msgid "Packages"
+msgstr ""
+
+msgctxt "help:stock.package,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_height:"
+msgid "The height of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_length:"
+msgid "The length of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_volume:"
+msgid "The volume of the package."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_weight:"
+msgid "The weight of the package when empty."
+msgstr ""
+
+msgctxt "help:stock.package.type,packaging_width:"
+msgid "The width of the package."
+msgstr ""
+
+msgctxt "model:ir.action,name:act_package_type_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+msgctxt "model:ir.message,text:msg_package_mismatch"
+msgid "To process shipment \"%(shipment)s\", you must pack all its moves."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_package_volume_too_small"
+msgid ""
+"The volume (%(volume)s) of package \"%(package)s\" is too small for summed "
+"volume (%(children_volume)s) of its children packages."
+msgstr ""
+
+msgctxt "model:ir.rule.group,name:rule_group_package_companies"
+msgid "User in companies"
+msgstr ""
+
+msgctxt "model:ir.sequence,name:sequence_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.sequence.type,name:sequence_type_package"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:ir.ui.menu,name:menu_package_form"
+msgid "Package Types"
+msgstr "Package Types"
+
+#, fuzzy
+msgctxt "model:stock.package,name:"
+msgid "Stock Package"
+msgstr "Stock Package"
+
+msgctxt "model:stock.package.type,name:"
+msgid "Stock Package Type"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Closed"
+msgstr ""
+
+msgctxt "selection:stock.package,state:"
+msgid "Open"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:stock.configuration:"
+msgid "Package"
+msgstr "Package Types"
+
+msgctxt "view:stock.configuration:"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "view:stock.package.type:"
+msgid "Measurements"
+msgstr ""
+
+msgctxt "view:stock.package:"
+msgid "Measurements"
+msgstr ""
diff --git a/modules/stock_package/message.xml b/modules/stock_package/message.xml
new file mode 100644
index 0000000000..e5cf5e964c
--- /dev/null
+++ b/modules/stock_package/message.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ To process shipment "%(shipment)s", you must pack all its moves.
+
+
+ The volume (%(volume)s) of package "%(package)s" is too small for summed volume (%(children_volume)s) of its children packages.
+
+
+
diff --git a/modules/stock_package/setup.py b/modules/stock_package/setup.py
new file mode 100755
index 0000000000..4751817723
--- /dev/null
+++ b/modules/stock_package/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 find_packages, setup
+
+
+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_stock_package'
+
+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')]
+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 stock packaging',
+ 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/stock_package',
+ },
+ keywords='tryton stock packaging',
+ package_dir={'trytond.modules.stock_package': '.'},
+ packages=(
+ ['trytond.modules.stock_package']
+ + ['trytond.modules.stock_package.%s' % p for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_package': (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',
+ '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 :: Spanish',
+ 'Natural Language :: Turkish',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_package = trytond.modules.stock_package
+ """,
+ )
diff --git a/modules/stock_package/stock.py b/modules/stock_package/stock.py
new file mode 100644
index 0000000000..0d24d77cb0
--- /dev/null
+++ b/modules/stock_package/stock.py
@@ -0,0 +1,528 @@
+# 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 sql import Cast, Literal
+from sql.functions import CharLength, Position, Substring
+
+from trytond import backend
+from trytond.i18n import gettext
+from trytond.model import (
+ DeactivableMixin, ModelSQL, ModelView, Workflow, fields, tree)
+from trytond.pool import Pool, PoolMeta
+from trytond.pyson import Bool, Eval, Id, If
+from trytond.transaction import Transaction
+
+from .exceptions import PackageError, PackageValidationError
+
+
+class Configuration(metaclass=PoolMeta):
+ __name__ = 'stock.configuration'
+ package_sequence = fields.MultiValue(fields.Many2One(
+ 'ir.sequence', "Package Sequence", required=True,
+ domain=[
+ ('company', 'in', [
+ Eval('context', {}).get('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock_package', 'sequence_type_package')),
+ ]))
+
+ @classmethod
+ def multivalue_model(cls, field):
+ pool = Pool()
+ if field == 'package_sequence':
+ return pool.get('stock.configuration.sequence')
+ return super(Configuration, cls).multivalue_model(field)
+
+ @classmethod
+ def default_package_sequence(cls, **pattern):
+ return cls.multivalue_model(
+ 'package_sequence').default_package_sequence()
+
+
+class ConfigurationSequence(metaclass=PoolMeta):
+ __name__ = 'stock.configuration.sequence'
+ package_sequence = fields.Many2One(
+ 'ir.sequence', "Package Sequence", required=True,
+ domain=[
+ ('company', 'in', [Eval('company', -1), None]),
+ ('sequence_type', '=',
+ Id('stock_package', 'sequence_type_package')),
+ ])
+
+ @classmethod
+ def __register__(cls, module_name):
+ exist = backend.TableHandler.table_exist(cls._table)
+ if exist:
+ table = cls.__table_handler__(module_name)
+ exist &= table.column_exist('package_sequence')
+
+ 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('package_sequence')
+ value_names.append('package_sequence')
+ super(ConfigurationSequence, cls)._migrate_property(
+ field_names, value_names, fields)
+
+ @classmethod
+ def default_package_sequence(cls):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ try:
+ return ModelData.get_id('stock_package', 'sequence_package')
+ except KeyError:
+ return None
+
+
+class MeasurementsMixin:
+ __slots__ = ()
+
+ packaging_length = fields.Float(
+ "Packaging Length", digits='packaging_length_uom',
+ help="The length of the package.")
+ packaging_length_uom = fields.Many2One(
+ 'product.uom', "Packaging Length UOM",
+ domain=[('category', '=', Id('product', 'uom_cat_length'))],
+ states={
+ 'required': Bool(Eval('packaging_length')),
+ },
+ depends=['packaging_length'])
+ packaging_height = fields.Float(
+ "Packaging Height", digits='packaging_height_uom',
+ help="The height of the package.")
+ packaging_height_uom = fields.Many2One(
+ 'product.uom', "Packaging Height UOM",
+ domain=[('category', '=', Id('product', 'uom_cat_length'))],
+ states={
+ 'required': Bool(Eval('packaging_height')),
+ },
+ depends=['packaging_height'])
+ packaging_width = fields.Float(
+ "Packaging Width", digits='packaging_width_uom',
+ help="The width of the package.")
+ packaging_width_uom = fields.Many2One(
+ 'product.uom', "Packaging Width UOM",
+ domain=[('category', '=', Id('product', 'uom_cat_length'))],
+ states={
+ 'required': Bool(Eval('packaging_width')),
+ },
+ depends=['packaging_width'])
+
+ packaging_volume = fields.Float(
+ "Packaging Volume", digits='packaging_volume_uom',
+ states={
+ 'readonly': (
+ Bool(Eval('packaging_length'))
+ & Bool(Eval('packaging_height'))
+ & Bool(Eval('packaging_width'))),
+ },
+ depends=['packaging_length', 'packaging_height', 'packaging_width'],
+ help="The volume of the package.")
+ packaging_volume_uom = fields.Many2One(
+ 'product.uom', "Packaging Volume UOM",
+ domain=[('category', '=', Id('product', 'uom_cat_volume'))],
+ states={
+ 'required': Bool(Eval('packaging_volume')),
+ },
+ depends=['packaging_volume'])
+
+ packaging_weight = fields.Float(
+ "Packaging Weight", digits='packaging_weight_uom',
+ help="The weight of the package when empty.")
+ packaging_weight_uom = fields.Many2One(
+ 'product.uom', "Packaging Weight UOM",
+ domain=[('category', '=', Id('product', 'uom_cat_weight'))],
+ states={
+ 'required': Bool(Eval('packaging_weight')),
+ })
+
+ @fields.depends(
+ 'packaging_volume', 'packaging_volume_uom',
+ 'packaging_length', 'packaging_length_uom',
+ 'packaging_height', 'packaging_height_uom',
+ 'packaging_width', 'packaging_width_uom')
+ def on_change_with_packaging_volume(self):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ Uom = pool.get('product.uom')
+
+ if not all([self.packaging_volume_uom,
+ self.packaging_length, self.packaging_length_uom,
+ self.packaging_height, self.packaging_height_uom,
+ self.packaging_width, self.packaging_width_uom]):
+ if all([
+ self.packaging_length,
+ self.packaging_height,
+ self.packaging_width]):
+ return
+ return self.packaging_volume
+
+ meter = Uom(ModelData.get_id('product', 'uom_meter'))
+ cubic_meter = Uom(ModelData.get_id('product', 'uom_cubic_meter'))
+
+ length = Uom.compute_qty(
+ self.packaging_length_uom, self.packaging_length, meter,
+ round=False)
+ height = Uom.compute_qty(
+ self.packaging_height_uom, self.packaging_height, meter,
+ round=False)
+ width = Uom.compute_qty(
+ self.packaging_width_uom, self.packaging_width, meter,
+ round=False)
+
+ return Uom.compute_qty(
+ cubic_meter, length * height * width, self.packaging_volume_uom)
+
+
+class Package(tree(), MeasurementsMixin, ModelSQL, ModelView):
+ 'Stock Package'
+ __name__ = 'stock.package'
+ _rec_name = 'code'
+ code = fields.Char('Code', readonly=True, required=True)
+ company = fields.Many2One('company.company', "Company", required=True)
+ type = fields.Many2One(
+ 'stock.package.type', "Type", required=True,
+ states={
+ 'readonly': Eval('state') == 'closed',
+ })
+ shipment = fields.Reference(
+ "Shipment", selection='get_shipment',
+ states={
+ 'readonly': Eval('state') == 'closed',
+ },
+ domain={
+ 'stock.shipment.out': [
+ ('company', '=', Eval('company', -1)),
+ ],
+ 'stock.shipment.in.return': [
+ ('company', '=', Eval('company', -1)),
+ ],
+ })
+ moves = fields.One2Many('stock.move', 'package', 'Moves',
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ('shipment', '=', Eval('shipment')),
+ ('to_location.type', 'in', ['customer', 'supplier']),
+ ('state', '!=', 'cancelled'),
+ ],
+ filter=[
+ ('quantity', '!=', 0),
+ ],
+ add_remove=[
+ ('package', '=', None),
+ ],
+ states={
+ 'readonly': Eval('state') == 'closed',
+ })
+ parent = fields.Many2One(
+ 'stock.package', "Parent", ondelete='CASCADE',
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ('shipment', '=', Eval('shipment')),
+ ],
+ states={
+ 'readonly': Eval('state') == 'closed',
+ })
+ children = fields.One2Many(
+ 'stock.package', 'parent', 'Children',
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ('shipment', '=', Eval('shipment')),
+ ],
+ states={
+ 'readonly': Eval('state') == 'closed',
+ })
+ state = fields.Function(fields.Selection([
+ ('open', "Open"),
+ ('closed', "Closed"),
+ ], "State"), 'on_change_with_state')
+
+ @classmethod
+ def __setup__(cls):
+ cls.code.search_unaccented = False
+ super().__setup__()
+
+ @classmethod
+ def __register__(cls, module):
+ pool = Pool()
+ table_h = cls.__table_handler__(module)
+ table = cls.__table__()
+ company_exist = table_h.column_exist('company')
+ cursor = Transaction().connection.cursor()
+
+ super().__register__(module)
+
+ # Migration from 5.8: add company
+ if not company_exist:
+ shipment_id = Cast(Substring(
+ table.shipment,
+ Position(',', table.shipment) + Literal(1)),
+ cls.id.sql_type().base)
+ for name in cls._get_shipment():
+ Shipment = pool.get(name)
+ shipment = Shipment.__table__()
+ value = (shipment
+ .select(shipment.company,
+ where=shipment.id == shipment_id))
+ cursor.execute(*table.update(
+ [table.company], [value],
+ where=table.shipment.like(name + ',%')))
+
+ @classmethod
+ def order_code(cls, tables):
+ table, _ = tables[None]
+ return [CharLength(table.code), table.code]
+
+ @classmethod
+ def default_company(cls):
+ return Transaction().context.get('company')
+
+ @staticmethod
+ def _get_shipment():
+ 'Return list of Model names for shipment Reference'
+ return [
+ 'stock.shipment.out',
+ 'stock.shipment.in.return',
+ ]
+
+ @classmethod
+ def get_shipment(cls):
+ pool = Pool()
+ Model = pool.get('ir.model')
+ get_name = Model.get_name
+ models = cls._get_shipment()
+ return [(None, '')] + [(m, get_name(m)) for m in models]
+
+ @fields.depends('shipment')
+ def on_change_with_state(self, name=None):
+ if (self.shipment
+ and self.shipment.state in {'packed', 'done', 'cancelled'}):
+ return 'closed'
+ return 'open'
+
+ @fields.depends('type')
+ def on_change_type(self):
+ if self.type:
+ for name in dir(MeasurementsMixin):
+ if isinstance(getattr(MeasurementsMixin, name), fields.Field):
+ setattr(self, name, getattr(self.type, name))
+
+ @classmethod
+ def validate(cls, packages):
+ super().validate(packages)
+ for package in packages:
+ package.check_volume()
+
+ def check_volume(self):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ Lang = pool.get('ir.lang')
+ lang = Lang.get()
+ if not self.packaging_volume:
+ return
+ children_volume = 0
+ for child in self.children:
+ if child.packaging_volume:
+ children_volume += Uom.compute_qty(
+ child.packaging_volume_uom, child.packaging_volume,
+ self.packaging_volume_uom, round=False)
+ if self.packaging_volume < children_volume:
+ raise PackageValidationError(
+ gettext('stock_package.msg_package_volume_too_small',
+ package=self.rec_name,
+ volume=lang.format_number_symbol(
+ self.packaging_volume, self.packaging_volume_uom),
+ children_volume=lang.format_number_symbol(
+ children_volume, self.packaging_volume_uom)))
+
+ @classmethod
+ def create(cls, vlist):
+ pool = Pool()
+ Config = pool.get('stock.configuration')
+
+ vlist = [v.copy() for v in vlist]
+ config = Config(1)
+ default_company = cls.default_company()
+ for values in vlist:
+ values['code'] = config.get_multivalue(
+ 'package_sequence',
+ company=values.get('company', default_company)).get()
+ return super(Package, cls).create(vlist)
+
+ @classmethod
+ def copy(cls, packages, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('moves')
+ return super().copy(packages, default=default)
+
+
+class Type(MeasurementsMixin, DeactivableMixin, ModelSQL, ModelView):
+ 'Stock Package Type'
+ __name__ = 'stock.package.type'
+ name = fields.Char('Name', required=True)
+
+
+class Move(metaclass=PoolMeta):
+ __name__ = 'stock.move'
+ package = fields.Many2One(
+ 'stock.package', "Package", readonly=True,
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ],
+ states={
+ 'readonly': Eval('state') == 'cancelled',
+ })
+
+ @property
+ def package_path(self):
+ path = []
+ package = self.package
+ while package:
+ path.append(package)
+ package = package.parent
+ path.reverse()
+ return path
+
+ @classmethod
+ def copy(cls, moves, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('package')
+ return super().copy(moves, default=default)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('cancelled')
+ def cancel(cls, moves):
+ cls.write([m for m in moves if m.package], {'package': None})
+ super().cancel(moves)
+
+
+class PackageMixin(object):
+ __slots__ = ()
+ packages = fields.One2Many('stock.package', 'shipment', 'Packages',
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ])
+ root_packages = fields.Function(fields.One2Many('stock.package',
+ 'shipment', 'Packages',
+ domain=[
+ ('company', '=', Eval('company', -1)),
+ ('parent', '=', None),
+ ]),
+ 'get_root_packages', setter='set_root_packages')
+
+ def get_root_packages(self, name):
+ return [p.id for p in self.packages if not p.parent]
+
+ @classmethod
+ def set_root_packages(cls, shipments, name, value):
+ if not value:
+ return
+ cls.write(shipments, {
+ 'packages': value,
+ })
+
+ @classmethod
+ def check_packages(cls, shipments):
+ for shipment in shipments:
+ if not shipment.packages:
+ continue
+ length = sum(len(p.moves) for p in shipment.packages)
+ if len(shipment.packages_moves) != length:
+ raise PackageError(
+ gettext('stock_package.msg_package_mismatch',
+ shipment=shipment.rec_name))
+
+ @property
+ def packages_moves(self):
+ raise NotImplementedError
+
+
+class ShipmentOut(PackageMixin, object, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ packages_readonly = If(
+ Eval('warehouse_storage') == Eval('warehouse_output'),
+ Eval('state') != 'waiting',
+ Eval('state') != 'picked')
+ for field in [cls.packages, cls.root_packages]:
+ field.states['readonly'] = packages_readonly
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('packed')
+ def pack(cls, shipments):
+ super(ShipmentOut, cls).pack(shipments)
+ cls.check_packages(shipments)
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def done(cls, shipments):
+ super(ShipmentOut, cls).done(shipments)
+ cls.check_packages(shipments)
+
+ @property
+ def packages_moves(self):
+ return [
+ m for m in self.outgoing_moves
+ if m.state != 'cancelled' and m.quantity]
+
+ def _group_parcel_key(self, lines, line):
+ try:
+ root_package = line.package_path[0]
+ except IndexError:
+ root_package = None
+ return super()._group_parcel_key(lines, line) + (
+ ('root_package', root_package),)
+
+ @fields.depends('carrier')
+ def _parcel_weight(self, parcel):
+ pool = Pool()
+ Uom = pool.get('product.uom')
+ weight = super()._parcel_weight(parcel)
+ if self.carrier:
+ carrier_uom = self.carrier.weight_uom
+ packages = {p for l in parcel for p in l.package_path}
+ for package in packages:
+ if package.packaging_weight:
+ weight += Uom.compute_qty(
+ package.packaging_weight_uom, package.packaging_weight,
+ carrier_uom, round=False)
+ return weight
+
+
+class ShipmentInReturn(PackageMixin, object, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in.return'
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ packages_readonly = ~Eval('state').in_(['waiting', 'assigned'])
+ for field in [cls.packages, cls.root_packages]:
+ field.states['readonly'] = packages_readonly
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def done(cls, shipments):
+ super(ShipmentInReturn, cls).done(shipments)
+ cls.check_packages(shipments)
+
+ @property
+ def packages_moves(self):
+ return [
+ m for m in self.moves
+ if m.state != 'cancelled' and m.quantity]
diff --git a/modules/stock_package/stock.xml b/modules/stock_package/stock.xml
new file mode 100644
index 0000000000..71123c23c3
--- /dev/null
+++ b/modules/stock_package/stock.xml
@@ -0,0 +1,148 @@
+
+
+
+
+
+ Stock Package
+
+
+
+
+
+
+
+
+
+
+
+ Stock Package
+
+
+
+
+ stock.configuration
+
+ configuration_form
+
+
+
+ stock.package
+ form
+ package_form
+
+
+
+ stock.package
+ tree
+ children
+ package_tree
+
+
+
+ stock.package
+ tree
+ package_list
+
+
+
+ User in companies
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.package.type
+ form
+ package_type_form
+
+
+
+ stock.package.type
+ tree
+ package_type_list
+
+
+
+ Package Types
+ stock.package.type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ stock.move
+
+ stock_move_form
+
+
+
+ stock.shipment.out
+
+ shipment_out_form
+
+
+
+ stock.shipment.in.return
+
+ shipment_in_return_form
+
+
+
diff --git a/modules/stock_package/tests/__init__.py b/modules/stock_package/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_package/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_package/tests/scenario_stock_package.rst b/modules/stock_package/tests/scenario_stock_package.rst
new file mode 100644
index 0000000000..1e88c98b48
--- /dev/null
+++ b/modules/stock_package/tests/scenario_stock_package.rst
@@ -0,0 +1,130 @@
+======================
+Stock Package 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.exceptions import UserError
+ >>> from trytond.modules.company.tests.tools import create_company, \
+ ... get_company
+ >>> today = datetime.date.today()
+
+Activate modules::
+
+ >>> config = activate_modules('stock_package')
+
+Create company::
+
+ >>> _ = create_company()
+ >>> company = get_company()
+
+Create customer::
+
+ >>> Party = Model.get('party.party')
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+
+Create product::
+
+ >>> ProductUom = Model.get('product.uom')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'Product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.list_price = Decimal('20')
+ >>> template.save()
+ >>> product, = template.products
+
+Get stock locations::
+
+ >>> Location = Model.get('stock.location')
+ >>> warehouse_loc, = Location.find([('code', '=', 'WH')])
+ >>> supplier_loc, = Location.find([('code', '=', 'SUP')])
+ >>> customer_loc, = Location.find([('code', '=', 'CUS')])
+ >>> output_loc, = Location.find([('code', '=', 'OUT')])
+ >>> storage_loc, = Location.find([('code', '=', 'STO')])
+
+Create Shipment Out::
+
+ >>> ShipmentOut = Model.get('stock.shipment.out')
+ >>> shipment_out = ShipmentOut()
+ >>> shipment_out.planned_date = today
+ >>> shipment_out.customer = customer
+ >>> shipment_out.warehouse = warehouse_loc
+ >>> shipment_out.company = company
+
+Add two shipment lines of same product::
+
+ >>> StockMove = Model.get('stock.move')
+ >>> shipment_out.outgoing_moves.extend([StockMove(), StockMove()])
+ >>> for move in shipment_out.outgoing_moves:
+ ... move.product = product
+ ... move.uom =unit
+ ... move.quantity = 1
+ ... move.from_location = output_loc
+ ... move.to_location = customer_loc
+ ... move.company = company
+ ... move.unit_price = Decimal('1')
+ ... move.currency = company.currency
+ >>> shipment_out.save()
+
+Pack shipment::
+
+ >>> shipment_out.click('wait')
+ >>> shipment_out.click('assign_force')
+ >>> shipment_out.click('pick')
+
+Package products::
+
+ >>> PackageType = Model.get('stock.package.type')
+ >>> box = PackageType(name='box')
+ >>> box.packaging_length = 80
+ >>> box.packaging_length_uom, = ProductUom.find([('name', '=', "Centimeter")])
+ >>> box.packaging_width = 1
+ >>> box.packaging_width_uom, = ProductUom.find([('name', '=', "Meter")])
+ >>> box.packaging_height_uom = box.packaging_length_uom
+ >>> box.packaging_volume
+ >>> box.packaging_volume_uom, = ProductUom.find([('name', '=', "Cubic meter")])
+ >>> box.save()
+ >>> package1 = shipment_out.packages.new(type=box)
+ >>> package1.packaging_length
+ 80.0
+ >>> package1.packaging_height = 50
+ >>> package1.packaging_volume
+ 0.4
+ >>> package_child = package1.children.new(shipment=shipment_out, type=box)
+ >>> package_child.packaging_height = 100
+ >>> moves = package_child.moves.find()
+ >>> len(moves)
+ 2
+ >>> package_child.moves.append(moves[0])
+
+ >>> shipment_out.save() # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ PackageValidationError: ...
+
+ >>> package1.packaging_height = 120
+ >>> package1.packaging_volume
+ 0.96
+
+ >>> shipment_out.click('pack') # doctest: +IGNORE_EXCEPTION_DETAIL
+ Traceback (most recent call last):
+ ...
+ PackageError: ...
+
+ >>> package2 = shipment_out.packages.new(type=box)
+ >>> moves = package2.moves.find()
+ >>> len(moves)
+ 1
+ >>> package2.moves.append(moves[0])
+
+ >>> shipment_out.click('pack')
diff --git a/modules/stock_package/tests/test_module.py b/modules/stock_package/tests/test_module.py
new file mode 100644
index 0000000000..9cb0598b20
--- /dev/null
+++ b/modules/stock_package/tests/test_module.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.tests.test_tryton import ModuleTestCase
+
+
+class StockPackageTestCase(ModuleTestCase):
+ 'Test Stock Package module'
+ module = 'stock_package'
+
+
+del ModuleTestCase
diff --git a/modules/stock_package/tests/test_scenario.py b/modules/stock_package/tests/test_scenario.py
new file mode 100644
index 0000000000..dc1d23e7e5
--- /dev/null
+++ b/modules/stock_package/tests/test_scenario.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.tests.test_tryton import load_doc_tests
+
+
+def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock_package/tox.ini b/modules/stock_package/tox.ini
new file mode 100644
index 0000000000..ca515eb9f8
--- /dev/null
+++ b/modules/stock_package/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_package/* -m unittest discover -s tests
+ coverage report --include=./**/stock_package/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_package/tryton.cfg b/modules/stock_package/tryton.cfg
new file mode 100644
index 0000000000..0d1929652b
--- /dev/null
+++ b/modules/stock_package/tryton.cfg
@@ -0,0 +1,13 @@
+[tryton]
+version=6.7.0
+depends:
+ company
+ ir
+ product
+ res
+ stock
+extras_depend:
+ carrier_weight
+xml:
+ stock.xml
+ message.xml
diff --git a/modules/stock_package/view/configuration_form.xml b/modules/stock_package/view/configuration_form.xml
new file mode 100644
index 0000000000..ef9f56c1a3
--- /dev/null
+++ b/modules/stock_package/view/configuration_form.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package/view/package_form.xml b/modules/stock_package/view/package_form.xml
new file mode 100644
index 0000000000..f149fc19d9
--- /dev/null
+++ b/modules/stock_package/view/package_form.xml
@@ -0,0 +1,46 @@
+
+
+
diff --git a/modules/stock_package/view/package_list.xml b/modules/stock_package/view/package_list.xml
new file mode 100644
index 0000000000..90fad2532c
--- /dev/null
+++ b/modules/stock_package/view/package_list.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package/view/package_tree.xml b/modules/stock_package/view/package_tree.xml
new file mode 100644
index 0000000000..0d22e557f5
--- /dev/null
+++ b/modules/stock_package/view/package_tree.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package/view/package_type_form.xml b/modules/stock_package/view/package_type_form.xml
new file mode 100644
index 0000000000..4b786518f2
--- /dev/null
+++ b/modules/stock_package/view/package_type_form.xml
@@ -0,0 +1,32 @@
+
+
+
diff --git a/modules/stock_package/view/package_type_list.xml b/modules/stock_package/view/package_type_list.xml
new file mode 100644
index 0000000000..b4d89538b1
--- /dev/null
+++ b/modules/stock_package/view/package_type_list.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/modules/stock_package/view/shipment_in_return_form.xml b/modules/stock_package/view/shipment_in_return_form.xml
new file mode 100644
index 0000000000..20332f6659
--- /dev/null
+++ b/modules/stock_package/view/shipment_in_return_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/modules/stock_package/view/shipment_out_form.xml b/modules/stock_package/view/shipment_out_form.xml
new file mode 100644
index 0000000000..8b2d43a96c
--- /dev/null
+++ b/modules/stock_package/view/shipment_out_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/modules/stock_package/view/stock_move_form.xml b/modules/stock_package/view/stock_move_form.xml
new file mode 100644
index 0000000000..a98335d02b
--- /dev/null
+++ b/modules/stock_package/view/stock_move_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping/.drone.yml b/modules/stock_package_shipping/.drone.yml
new file mode 100644
index 0000000000..b45ef267ef
--- /dev/null
+++ b/modules/stock_package_shipping/.drone.yml
@@ -0,0 +1,78 @@
+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/*
+ volumes:
+ - cache:/root/.cache
+ check_doc:
+ image: ${IMAGE}
+ commands:
+ - pip install sphinx
+ - python -m sphinx -T -E -W -n -b html doc _build/html
+ - python -m sphinx -T -E -W -n -b linkcheck doc _build
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_package_shipping/.flake8 b/modules/stock_package_shipping/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_package_shipping/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_package_shipping/.isort.cfg b/modules/stock_package_shipping/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_package_shipping/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_package_shipping/CHANGELOG b/modules/stock_package_shipping/CHANGELOG
new file mode 100644
index 0000000000..95c820da2b
--- /dev/null
+++ b/modules/stock_package_shipping/CHANGELOG
@@ -0,0 +1,61 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+
+Version 6.4.0 - 2022-05-02
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-01
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add wizard to print shipping labels
+
+Version 6.0.0 - 2021-05-03
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add tracking URL
+* Allow updating dimensions on package
+* Add configuration option to store label in filestore
+* Manage supplier shipment returns
+
+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)
+* Move package weight to stock_shipment_measurements module
+
+Version 4.2.0 - 2016-11-28
+--------------------------
+* Initial release
diff --git a/modules/stock_package_shipping/COPYRIGHT b/modules/stock_package_shipping/COPYRIGHT
new file mode 100644
index 0000000000..507bb67d3e
--- /dev/null
+++ b/modules/stock_package_shipping/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2016-2022 Nicolas Évrard.
+Copyright (C) 2016-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/stock_package_shipping/LICENSE b/modules/stock_package_shipping/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_package_shipping/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/stock_package_shipping/MANIFEST.in b/modules/stock_package_shipping/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_package_shipping/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_package_shipping/README.rst b/modules/stock_package_shipping/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_package_shipping/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_package_shipping/__init__.py b/modules/stock_package_shipping/__init__.py
new file mode 100644
index 0000000000..93565afe2c
--- /dev/null
+++ b/modules/stock_package_shipping/__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 carrier, stock
+
+
+def register():
+ Pool.register(
+ stock.PackageType,
+ stock.Package,
+ stock.ShipmentOut,
+ stock.ShipmentInReturn,
+ carrier.Carrier,
+ module='stock_package_shipping', type_='model')
+ Pool.register(
+ stock.CreateShipping,
+ stock.PrintShippingLabel,
+ module='stock_package_shipping', type_='wizard')
+ Pool.register(
+ stock.ShippingLabel,
+ module='stock_package_shipping', type_='report')
diff --git a/modules/stock_package_shipping/carrier.py b/modules/stock_package_shipping/carrier.py
new file mode 100644
index 0000000000..7012df7128
--- /dev/null
+++ b/modules/stock_package_shipping/carrier.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.model import fields
+from trytond.pool import PoolMeta
+
+
+class Carrier(metaclass=PoolMeta):
+ __name__ = 'carrier'
+
+ shipping_service = fields.Selection([
+ (None, ''),
+ ], 'Shipping Service')
+
+ @property
+ def shipping_label_mimetype(self):
+ return 'application/octet-stream'
diff --git a/modules/stock_package_shipping/carrier.xml b/modules/stock_package_shipping/carrier.xml
new file mode 100644
index 0000000000..cb69bd1376
--- /dev/null
+++ b/modules/stock_package_shipping/carrier.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ carrier
+
+ carrier_form
+
+
+ carrier
+
+ carrier_tree
+
+
+
diff --git a/modules/stock_package_shipping/doc/conf.py b/modules/stock_package_shipping/doc/conf.py
new file mode 100644
index 0000000000..8513b72dd2
--- /dev/null
+++ b/modules/stock_package_shipping/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/stock_package_shipping/doc/configuration.rst b/modules/stock_package_shipping/doc/configuration.rst
new file mode 100644
index 0000000000..97fd2d25ff
--- /dev/null
+++ b/modules/stock_package_shipping/doc/configuration.rst
@@ -0,0 +1,29 @@
+*************
+Configuration
+*************
+
+The *Stock Package Shipping Module* uses some settings from the
+``[stock_package_shipping]`` section of the :doc:`configuration file
+`.
+
+.. _config-stock_package_shipping.filestore:
+
+``filestore``
+=============
+
+This configuration value indicates whether the shipping label should be stored
+in the :py:mod:`trytond:trytond.filestore` (``True``) or the database
+(``False``).
+
+The default value is: ``False``
+
+.. _config-stock_package_shipping.store_prefix:
+
+``store_prefix``
+================
+
+This is the prefix to use with the :py:mod:`trytond:trytond.filestore`.
+This value is only used when the `filestore
+` setting is in use.
+
+The default value is: ``None``
diff --git a/modules/stock_package_shipping/doc/index.rst b/modules/stock_package_shipping/doc/index.rst
new file mode 100644
index 0000000000..a207b008b5
--- /dev/null
+++ b/modules/stock_package_shipping/doc/index.rst
@@ -0,0 +1,60 @@
+Stock Package Shipping Module
+#############################
+
+This module is the base module required to interact with shipping service
+providers.
+
+Carrier
+*******
+
+The Carrier model adds the following field:
+
+- *Shipping Service*: The shipping service of the carrier.
+
+This field is programmatically filled by the modules providing support for
+shipping companies.
+
+Package Type
+************
+
+The Package Type model has been added the following fields:
+
+- *Length*: The length of the packages of this type
+- *Length Unit*: The unit of measure of this length
+- *Length Digits*: The precision of length
+- *Height*: The height of the packages of this type
+- *Height Unit*: The unit of measure of this height
+- *Height Digits*: The precision of height
+- *Width*: The width of the packages of this type
+- *Width Unit*: The unit of measure of this width
+- *Width Digits*: The precision of width
+
+Package
+*******
+
+The Package model has been added the following fields:
+
+- *Shipping Reference*: The shipping reference provided by the shipping service
+- *Shipping Label*: The shipping label provided by the shipping service
+- *Weight*: A function field computing the weight of the package with its
+ content
+
+Shipment Out
+************
+
+The Shipment Out model will check once in the Packed state if the shipment is a
+valid shipment for the shipping service. He does that by calling a method that
+is by convention named ``validate_packing_``.
+
+Once a shipment is packed, the user can create the shipping for each packages
+with the shipping service by clicking on the *Create Shipping* button. This
+button triggers a wizard that is overridden in shipping service specific
+modules. The starting state of the wizard is a ``StateTransition``. Its linked
+method is overridden in shipping service modules in order to communicate with
+the service.
+
+.. toctree::
+ :maxdepth: 2
+
+ configuration
+ releases
diff --git a/modules/stock_package_shipping/doc/releases.rst b/modules/stock_package_shipping/doc/releases.rst
new file mode 100644
index 0000000000..21b13c4745
--- /dev/null
+++ b/modules/stock_package_shipping/doc/releases.rst
@@ -0,0 +1,7 @@
+.. _releases-index:
+
+=============
+Release notes
+=============
+
+.. include:: ../CHANGELOG
diff --git a/modules/stock_package_shipping/exceptions.py b/modules/stock_package_shipping/exceptions.py
new file mode 100644
index 0000000000..dc0bc7edb2
--- /dev/null
+++ b/modules/stock_package_shipping/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.exceptions import UserError, UserWarning
+
+
+class PackWarning(UserWarning):
+ pass
+
+
+class PackingValidationError(UserError):
+ pass
diff --git a/modules/stock_package_shipping/locale/bg.po b/modules/stock_package_shipping/locale/bg.po
new file mode 100644
index 0000000000..7191f2b906
--- /dev/null
+++ b/modules/stock_package_shipping/locale/bg.po
@@ -0,0 +1,165 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Височина"
+
+#, fuzzy
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Цифри за височина"
+
+#, fuzzy
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Цифри за височина"
+
+#, fuzzy
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Дължина"
+
+#, fuzzy
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Цифри за дължина"
+
+#, fuzzy
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Цифри за дължина"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Ширина"
+
+#, fuzzy
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Цифри за ширина"
+
+#, fuzzy
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Цифри за ширина"
+
+#, fuzzy
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Височина"
+
+#, fuzzy
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Цифри за височина"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Дължина"
+
+#, fuzzy
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Цифри за дължина"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Ширина"
+
+#, fuzzy
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Цифри за ширина"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/ca.po b/modules/stock_package_shipping/locale/ca.po
new file mode 100644
index 0000000000..390ef2d3ab
--- /dev/null
+++ b/modules/stock_package_shipping/locale/ca.po
@@ -0,0 +1,146 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr "Servei d'enviament"
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Decimals de l'altura"
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Unitat de l'altura"
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Longitud"
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Decimals de la longitud"
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Unitat de la longitud"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr "Etiqueta d'enviament"
+
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "ID de l'etiqueta d'enviament"
+
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Tipus MIME d'etiqueta d'enviament"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr "Referència d'enviament"
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr "URL de seguiment de l'enviament"
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Amplada"
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Decimals de l'amplada"
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Unitat de l'amplada"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Decimals de l'altura"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr "Unitat de l'altura"
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Longitud"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Decimals de la longitud"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr "Unitat de la longitud"
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Amplada"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Decimals de l'amplada"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr "Unitat de l'amplada"
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr "Transportista"
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr "Descripció de l'enviament"
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr "Descripció d'enviament"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Crea enviament"
+
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Etiqueta d'enviament"
+
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Etiquetes d'enviament"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+"Per crear etiquetes d'enviament per l'albarà \"%(shipment)s\", l'heu "
+"d'empaquetar."
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr "L'albarà \"%(shipment)s\" no té assignat un transportista."
+
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Etiqueta d'enviament"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Crea enviament per paquets"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Crea enviament per paquets"
diff --git a/modules/stock_package_shipping/locale/cs.po b/modules/stock_package_shipping/locale/cs.po
new file mode 100644
index 0000000000..02461bcfeb
--- /dev/null
+++ b/modules/stock_package_shipping/locale/cs.po
@@ -0,0 +1,150 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/de.po b/modules/stock_package_shipping/locale/de.po
new file mode 100644
index 0000000000..e8ec0533ef
--- /dev/null
+++ b/modules/stock_package_shipping/locale/de.po
@@ -0,0 +1,146 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr "Versanddienst"
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Höhe"
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Nachkommastellen Höhe"
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Einheit Höhe"
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Länge"
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Nachkommastellen Länge"
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Einheit Länge"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr "Versandetikett"
+
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "ID Versandetikett"
+
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "MIME-Typ Versandetikett"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr "Versandbeleg"
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr "Versand Tracking URL"
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Breite"
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Nachkommastellen Breite"
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Einheit Breite"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Höhe"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Nachkommastellen Höhe"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr "Einheit Höhe"
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Länge"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Nachkommastellen Länge"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr "Einheit Länge"
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Breite"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Nachkommastellen Breite"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr "Einheit Breite"
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr "Versanddienstleister"
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr "Versandbeschreibung"
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr "Versandbeschreibung"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Versand erstellen"
+
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Versandetikett"
+
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Versandetiketten"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+"Damit die Versandaufkleber für die Lieferung \"%(shipment)s\" generiert "
+"werden können, muss die Lieferung zuerst gepackt werden."
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr "Der Lieferung \"%(shipment)s\" ist kein Versanddienstleister zugeordnet."
+
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Versandetikett"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Versand für Pakete erstellen"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Versand erstellen"
diff --git a/modules/stock_package_shipping/locale/es.po b/modules/stock_package_shipping/locale/es.po
new file mode 100644
index 0000000000..b8fb874106
--- /dev/null
+++ b/modules/stock_package_shipping/locale/es.po
@@ -0,0 +1,146 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr "Servicio de envío"
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Decimales de la altura"
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Unidad de la altura"
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Longitud"
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Decimales de la longitud"
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Unidad de la longitud"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr "Etiqueta de envío"
+
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "ID de la etiqueta de envío"
+
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Tipo MIME de la etiqueta de envío"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr "Referencia de envío"
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr "URL Seguimiento del envío"
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Ancho"
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Decimales del ancho"
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Unidad del ancho"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Decimales de la altura"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr "Unidad de la altura"
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Longitud"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Decimales de la longitud"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr "Unidad de la longitud"
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Ancho"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Decimales del ancho"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr "Unidad del ancho"
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr "Transportista"
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr "Descripción del envío"
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr "Descripción del envío"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Crear envío"
+
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Etiqueta de envío"
+
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Etiquetas de envío"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+"Para crear etiquetas de envío para el albarán \"%(shipment)s\", debe "
+"empaquetar-lo."
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr "El albarán \"%(shipment)s\" no tiene asignado ningún transportista."
+
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Etiqueta de envío"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Crear envío para paquetes"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Crear envío de paquetes"
diff --git a/modules/stock_package_shipping/locale/es_419.po b/modules/stock_package_shipping/locale/es_419.po
new file mode 100644
index 0000000000..7c27edfcca
--- /dev/null
+++ b/modules/stock_package_shipping/locale/es_419.po
@@ -0,0 +1,145 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr "El envío \"%(shipment)s\" no tiene asignado ningún transportista."
+
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr ""
diff --git a/modules/stock_package_shipping/locale/et.po b/modules/stock_package_shipping/locale/et.po
new file mode 100644
index 0000000000..1d117906f1
--- /dev/null
+++ b/modules/stock_package_shipping/locale/et.po
@@ -0,0 +1,160 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr "Tarne teenus"
+
+#, fuzzy
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Kõrgus"
+
+#, fuzzy
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Kõrguse numbriväärtus"
+
+#, fuzzy
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Kõrguse ühik"
+
+#, fuzzy
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Pikkus"
+
+#, fuzzy
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Pikkuse numbriväärtus"
+
+#, fuzzy
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Pikkuse ühik"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr "Lähetuse etikett"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Lähetuse etikett"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Lähetuse etikett"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr "Lähetuse viide"
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Laius"
+
+#, fuzzy
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Laiuse numbriväärtus"
+
+#, fuzzy
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Laiuse ühik"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Kõrgus"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Kõrguse numbriväärtus"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr "Kõrguse ühik"
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Pikkus"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Pikkuse numbriväärtus"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr "Pikkuse ühik"
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Laius"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Laiuse numbriväärtus"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr "Laiuse ühik"
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr "Lähetuse kirjeldus"
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr "Lähetuse kirjeldus"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Loo lähetus"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Lähetuse etikett"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Lähetuse etikett"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr "Lähetuse \"%(shipment)s\" etikettide loomiseks tuleb see pakkida."
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr "Lähetusel \"%(shipment)s\" ei ole vedajat."
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Lähetuse etikett"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Loo saadetistele lähetus"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Loo saadetistele lähetus"
diff --git a/modules/stock_package_shipping/locale/fa.po b/modules/stock_package_shipping/locale/fa.po
new file mode 100644
index 0000000000..cab38a1d92
--- /dev/null
+++ b/modules/stock_package_shipping/locale/fa.po
@@ -0,0 +1,162 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr "خدمات حمل ونقل"
+
+#, fuzzy
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "ارتفاع"
+
+#, fuzzy
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "ارقام ارتفاع"
+
+#, fuzzy
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "واحد ارتفاع"
+
+#, fuzzy
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "طول"
+
+#, fuzzy
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "ارقام طول"
+
+#, fuzzy
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "واحد طول"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr "برچسب حمل ونقل"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "برچسب حمل ونقل"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "برچسب حمل ونقل"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr "مرجع حمل ونقل"
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "عرض"
+
+#, fuzzy
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "ارقام عرض"
+
+#, fuzzy
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "واحد عرض"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "ارتفاع"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "ارقام ارتفاع"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr "واحد ارتفاع"
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "طول"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "ارقام طول"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr "واحد طول"
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "عرض"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "ارقام عرض"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr "واحد عرض"
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr "شرح حمل ونقل"
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr "شرح حمل ونقل"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "ایجاد حمل ونقل"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "برچسب حمل ونقل"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "برچسب حمل ونقل"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+"برای ایجاد برچسب های حمل و نقل محموله :\"%(shipment)s\"، شما باید آن را بسته"
+" بندی کنید."
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr "هیچ حمل کننده ایی برای محموله : \"%s\" تنظیم نشده است."
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "برچسب حمل ونقل"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/fi.po b/modules/stock_package_shipping/locale/fi.po
new file mode 100644
index 0000000000..02461bcfeb
--- /dev/null
+++ b/modules/stock_package_shipping/locale/fi.po
@@ -0,0 +1,150 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/fr.po b/modules/stock_package_shipping/locale/fr.po
new file mode 100644
index 0000000000..b5ebcce625
--- /dev/null
+++ b/modules/stock_package_shipping/locale/fr.po
@@ -0,0 +1,146 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr "Service de livraison"
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Hauteur"
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Décimales de la hauteur"
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Unité de hauteur"
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Longueur"
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Décimales de la longueur"
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Unité de longueur"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr "Étiquette de livraison"
+
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "ID de l'étiquette de livraison"
+
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Type MIME d'étiquette d'expédition"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr "Référence de livraison"
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr "URL de suivi des envois"
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Largeur"
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Décimales de la largeur"
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Unité de largeur"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Hauteur"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Décimales de la hauteur"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr "Unité de hauteur"
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Longueur"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Décimales de la longueur"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr "Unité de longueur"
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Largeur"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Décimales de la largeur"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr "Unité de largeur"
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr "Transporteur"
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr "Description de la livraison"
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr "Description de la livraison"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Créer la livraison"
+
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Étiquette de livraison"
+
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Étiquettes de livraison"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+"Pour créer les étiquettes de livraison pour l'expédition « %(shipment)s », "
+"vous devez l'emballer."
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr "L'expédition « %(shipment)s » n'a pas de transporteur défini."
+
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Étiquette de livraison"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Créer la livraison pour les emballages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Créer la livraison pour les emballages"
diff --git a/modules/stock_package_shipping/locale/hu.po b/modules/stock_package_shipping/locale/hu.po
new file mode 100644
index 0000000000..dedbc90388
--- /dev/null
+++ b/modules/stock_package_shipping/locale/hu.po
@@ -0,0 +1,165 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Magasság"
+
+#, fuzzy
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Vessző utáni magasság"
+
+#, fuzzy
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Vessző utáni magasság"
+
+#, fuzzy
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Hossz"
+
+#, fuzzy
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Vessző utáni hossz"
+
+#, fuzzy
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Vessző utáni hossz"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Szélesség"
+
+#, fuzzy
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Vessző utáni tömeg"
+
+#, fuzzy
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Vessző utáni tömeg"
+
+#, fuzzy
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Magasság"
+
+#, fuzzy
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Vessző utáni magasság"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Hossz"
+
+#, fuzzy
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Vessző utáni hossz"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Szélesség"
+
+#, fuzzy
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Vessző utáni tömeg"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/id.po b/modules/stock_package_shipping/locale/id.po
new file mode 100644
index 0000000000..e84f76cbca
--- /dev/null
+++ b/modules/stock_package_shipping/locale/id.po
@@ -0,0 +1,144 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Tinggi"
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Panjang"
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Lebar"
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Tinggi"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Panjang"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Lebar"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr ""
diff --git a/modules/stock_package_shipping/locale/it.po b/modules/stock_package_shipping/locale/it.po
new file mode 100644
index 0000000000..2f705c4056
--- /dev/null
+++ b/modules/stock_package_shipping/locale/it.po
@@ -0,0 +1,153 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Larghezza"
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Larghezza"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Larghezza"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr "Vettore"
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/lo.po b/modules/stock_package_shipping/locale/lo.po
new file mode 100644
index 0000000000..a52c7fcf33
--- /dev/null
+++ b/modules/stock_package_shipping/locale/lo.po
@@ -0,0 +1,158 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "ນໍ້າໜັກ"
+
+#, fuzzy
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "ນໍ້າໜັກ"
+
+#, fuzzy
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "ນໍ້າໜັກ"
+
+#, fuzzy
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "ຄວາມຍາວ"
+
+#, fuzzy
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "ຄວາມຍາວ"
+
+#, fuzzy
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "ຄວາມຍາວ"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "ນໍ້າໜັກ"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "ຄວາມຍາວ"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/lt.po b/modules/stock_package_shipping/locale/lt.po
new file mode 100644
index 0000000000..02461bcfeb
--- /dev/null
+++ b/modules/stock_package_shipping/locale/lt.po
@@ -0,0 +1,150 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/nl.po b/modules/stock_package_shipping/locale/nl.po
new file mode 100644
index 0000000000..4504930b34
--- /dev/null
+++ b/modules/stock_package_shipping/locale/nl.po
@@ -0,0 +1,146 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr "Verzendservice"
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Hoogte"
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Hoogte decimalen"
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Hoogte eenheid"
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Lengte"
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Lengte decimalen"
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Lengte-eenheid"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr "Verzendlabel"
+
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Verzendlabel-ID"
+
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Verzendlabel MIME-type"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr "Verzendreferentie"
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr "Tracking-URL verzending"
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Breedte"
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Decimalen breedte"
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Breedte eenheid"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Hoogte"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Hoogte decimalen"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr "Hoogte eenheid"
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Lengte"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Lengte decimalen"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr "Lengte-eenheid"
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Breedte"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Decimalen breedte"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr "Breedte eenheid"
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr "Transporteur"
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr "Verzending omschrijving"
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr "Verzending omschrijving"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Maak zending"
+
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Verzendlabel"
+
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Verzendlabels"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+"Om verzendlabels te maken voor verzending \"%(shipment)s\", moet u deze "
+"verpakken."
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr "De zending \"%(shipment)s\" heeft geen transporteur."
+
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Verzendlabel"
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Maak een verzending voor de pakketten"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Maak een verzending voor de pakketten"
diff --git a/modules/stock_package_shipping/locale/pl.po b/modules/stock_package_shipping/locale/pl.po
new file mode 100644
index 0000000000..c777ad8924
--- /dev/null
+++ b/modules/stock_package_shipping/locale/pl.po
@@ -0,0 +1,159 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Wysokość"
+
+#, fuzzy
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Cyfry wysokości"
+
+#, fuzzy
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Jednostka wysokości"
+
+#, fuzzy
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Długość"
+
+#, fuzzy
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Cyfry długości"
+
+#, fuzzy
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Jednostka długości"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Szerokość"
+
+#, fuzzy
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Cyfry szerokości"
+
+#, fuzzy
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Jednostka szerokości"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Wysokość"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Cyfry wysokości"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr "Jednostka wysokości"
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Długość"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Cyfry długości"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr "Jednostka długości"
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Szerokość"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Cyfry szerokości"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr "Jednostka szerokości"
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/pt.po b/modules/stock_package_shipping/locale/pt.po
new file mode 100644
index 0000000000..8bdb5cdb36
--- /dev/null
+++ b/modules/stock_package_shipping/locale/pt.po
@@ -0,0 +1,162 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr "Serviço de Envio"
+
+#, fuzzy
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Altura"
+
+#, fuzzy
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Dígitos decimais da altura"
+
+#, fuzzy
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Unidade da Altura"
+
+#, fuzzy
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Comprimento"
+
+#, fuzzy
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Dígitos decimais do comprimento"
+
+#, fuzzy
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Unidade do Comprimento"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr "Etiquetas de envio"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Etiquetas de envio"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Etiquetas de envio"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr "Referência de Envio"
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Largura"
+
+#, fuzzy
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Dígitos decimais da largura"
+
+#, fuzzy
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Unidade da Largura"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Altura"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Dígitos decimais da altura"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr "Unidade da Altura"
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Comprimento"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Dígitos decimais do comprimento"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr "Unidade do Comprimento"
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Largura"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Dígitos decimais da largura"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr "Unidade da Largura"
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr "Descrição do Envio"
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr "Descrição do Envio"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Etiquetas de envio"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Etiquetas de envio"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr "A remessa \"%(shipment)s\" não tem uma transportadora definida."
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Etiquetas de envio"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/ro.po b/modules/stock_package_shipping/locale/ro.po
new file mode 100644
index 0000000000..b3090e6bd5
--- /dev/null
+++ b/modules/stock_package_shipping/locale/ro.po
@@ -0,0 +1,144 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr ""
diff --git a/modules/stock_package_shipping/locale/ru.po b/modules/stock_package_shipping/locale/ru.po
new file mode 100644
index 0000000000..624751c956
--- /dev/null
+++ b/modules/stock_package_shipping/locale/ru.po
@@ -0,0 +1,161 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Ширина"
+
+#, fuzzy
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Ширина"
+
+#, fuzzy
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Ширина"
+
+#, fuzzy
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Длина"
+
+#, fuzzy
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Длина"
+
+#, fuzzy
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Длина"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Ширина"
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Ширина"
+
+#, fuzzy
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Ширина"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Длина"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Ширина"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/sl.po b/modules/stock_package_shipping/locale/sl.po
new file mode 100644
index 0000000000..95533a6af8
--- /dev/null
+++ b/modules/stock_package_shipping/locale/sl.po
@@ -0,0 +1,162 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr "Dostavna služba"
+
+#, fuzzy
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr "Višina"
+
+#, fuzzy
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr "Decimalke za višino"
+
+#, fuzzy
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr "Enota višine"
+
+#, fuzzy
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr "Dolžina"
+
+#, fuzzy
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr "Decimalke za dolžino"
+
+#, fuzzy
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr "Enota dolžine"
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr "Nalepka pošiljke"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Nalepka pošiljke"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Nalepka pošiljke"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr "Sklic paketne dostave"
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "Širina"
+
+#, fuzzy
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr "Decimalke za širino"
+
+#, fuzzy
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "Enota širine"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr "Višina"
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr "Decimalke za višino"
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr "Enota višine"
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr "Dolžina"
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr "Decimalke za dolžino"
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr "Enota dolžine"
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "Širina"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr "Decimalke za širino"
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr "Enota širine"
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr "Opis pošiljke"
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr "Opis pošiljke"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Nalepka pošiljke"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Nalepka pošiljke"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr "Za dostavo \"%(shipment)s\" še ni izbran špediter."
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Nalepka pošiljke"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/tr.po b/modules/stock_package_shipping/locale/tr.po
new file mode 100644
index 0000000000..02461bcfeb
--- /dev/null
+++ b/modules/stock_package_shipping/locale/tr.po
@@ -0,0 +1,150 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/locale/uk.po b/modules/stock_package_shipping/locale/uk.po
new file mode 100644
index 0000000000..b3090e6bd5
--- /dev/null
+++ b/modules/stock_package_shipping/locale/uk.po
@@ -0,0 +1,144 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr ""
+
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr ""
+
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr ""
diff --git a/modules/stock_package_shipping/locale/zh_CN.po b/modules/stock_package_shipping/locale/zh_CN.po
new file mode 100644
index 0000000000..1144f0af04
--- /dev/null
+++ b/modules/stock_package_shipping/locale/zh_CN.po
@@ -0,0 +1,153 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,shipping_service:"
+msgid "Shipping Service"
+msgstr ""
+
+msgctxt "field:stock.package,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_label:"
+msgid "Shipping Label"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_id:"
+msgid "Shipping Label ID"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "field:stock.package,shipping_label_mimetype:"
+msgid "Shipping Label MIME Type"
+msgstr "Shipping"
+
+msgctxt "field:stock.package,shipping_reference:"
+msgid "Shipping Reference"
+msgstr ""
+
+msgctxt "field:stock.package,shipping_tracking_url:"
+msgid "Shipping Tracking URL"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width:"
+msgid "Width"
+msgstr "宽"
+
+msgctxt "field:stock.package,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package,width_uom:"
+msgid "Width Unit"
+msgstr "宽"
+
+msgctxt "field:stock.package.type,height:"
+msgid "Height"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_digits:"
+msgid "Height Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,height_uom:"
+msgid "Height Unit"
+msgstr ""
+
+msgctxt "field:stock.package.type,length:"
+msgid "Length"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_digits:"
+msgid "Length Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,length_uom:"
+msgid "Length Unit"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:stock.package.type,width:"
+msgid "Width"
+msgstr "宽"
+
+msgctxt "field:stock.package.type,width_digits:"
+msgid "Width Digits"
+msgstr ""
+
+msgctxt "field:stock.package.type,width_uom:"
+msgid "Width Unit"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:stock.shipment.in.return,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "field:stock.shipment.out,shipping_description:"
+msgid "Shipping Description"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Shipping"
+msgstr "Create Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:report_shipping_label"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_print_shipping_label"
+msgid "Shipping Labels"
+msgstr "Shipping"
+
+msgctxt "model:ir.message,text:msg_shipment_not_packed"
+msgid "To create shipping labels for shipment \"%(shipment)s\", you must pack it."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_without_carrier"
+msgid "The shipment \"%(shipment)s\" does not have a carrier set."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.model.button,string:package_print_shipping_label_button"
+msgid "Shipping Label"
+msgstr "Shipping"
+
+#, fuzzy
+msgctxt ""
+"model:ir.model.button,string:shipment_in_return_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
+
+msgctxt "model:ir.model.button,string:shipment_out_create_shipping_button"
+msgid "Create Shipping for Packages"
+msgstr "Create Shipping for Packages"
diff --git a/modules/stock_package_shipping/message.xml b/modules/stock_package_shipping/message.xml
new file mode 100644
index 0000000000..f9624b8804
--- /dev/null
+++ b/modules/stock_package_shipping/message.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ To create shipping labels for shipment "%(shipment)s", you must pack it.
+
+
+ The shipment "%(shipment)s" does not have a carrier set.
+
+
+
diff --git a/modules/stock_package_shipping/setup.py b/modules/stock_package_shipping/setup.py
new file mode 100755
index 0000000000..bd0037bdf3
--- /dev/null
+++ b/modules/stock_package_shipping/setup.py
@@ -0,0 +1,154 @@
+#!/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 find_packages, setup
+
+
+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_stock_package_shipping'
+
+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=('The package shipping module of the '
+ 'Tryton application platform.'),
+ 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/stock_package_shipping',
+ },
+ keywords='tryton stock package shipping',
+ package_dir={'trytond.modules.stock_package_shipping': '.'},
+ packages=(
+ ['trytond.modules.stock_package_shipping']
+ + ['trytond.modules.stock_package_shipping.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_package_shipping': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_package_shipping = trytond.modules.stock_package_shipping
+ """,
+ )
diff --git a/modules/stock_package_shipping/stock.py b/modules/stock_package_shipping/stock.py
new file mode 100644
index 0000000000..01a5f1264c
--- /dev/null
+++ b/modules/stock_package_shipping/stock.py
@@ -0,0 +1,399 @@
+# 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 mimetypes
+
+from sql import Column
+
+from trytond.config import config
+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.pyson import Bool, Eval, Id
+from trytond.report import Report
+from trytond.transaction import Transaction
+from trytond.wizard import StateAction, StateTransition, Wizard
+
+from .exceptions import PackWarning
+
+if config.getboolean('stock_package_shipping', 'filestore', default=False):
+ file_id = 'shipping_label_id'
+ store_prefix = config.get(
+ 'stock_package_shipping', 'store_prefix', default=None)
+else:
+ file_id = store_prefix = None
+
+
+class DimensionsMixin(object):
+ __slots__ = ()
+
+ length = fields.Float('Length', digits=(16, Eval('length_digits', 2)))
+ length_uom = fields.Many2One('product.uom', 'Length Unit',
+ domain=[
+ ('category', '=', Id('product', 'uom_cat_length')),
+ ],
+ states={
+ 'required': Bool(Eval('length')),
+ },
+ depends={'length_digits'})
+ length_digits = fields.Function(fields.Integer('Length Digits'),
+ 'on_change_with_length_digits')
+ height = fields.Float('Height', digits=(16, Eval('height_digits', 2)))
+ height_uom = fields.Many2One('product.uom', 'Height Unit',
+ domain=[
+ ('category', '=', Id('product', 'uom_cat_length')),
+ ],
+ states={
+ 'required': Bool(Eval('height')),
+ },
+ depends={'height_digits'})
+ height_digits = fields.Function(fields.Integer('Height Digits'),
+ 'on_change_with_height_digits')
+ width = fields.Float('Width', digits=(16, Eval('width_digits', 2)))
+ width_uom = fields.Many2One('product.uom', 'Width Unit',
+ domain=[
+ ('category', '=', Id('product', 'uom_cat_length')),
+ ],
+ states={
+ 'required': Bool(Eval('width')),
+ },
+ depends={'width_digits'})
+ width_digits = fields.Function(fields.Integer('Width Digits'),
+ 'on_change_with_width_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())
+
+ @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())
+
+ @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())
+
+ @classmethod
+ def default_length_digits(cls):
+ return 2
+
+ @classmethod
+ def default_height_digits(cls):
+ return 2
+
+ @classmethod
+ def default_width_digits(cls):
+ return 2
+
+
+class PackageType(DimensionsMixin, metaclass=PoolMeta):
+ __name__ = 'stock.package.type'
+
+
+class Package(DimensionsMixin, metaclass=PoolMeta):
+ __name__ = 'stock.package'
+
+ shipping_reference = fields.Char('Shipping Reference',
+ states={
+ 'readonly': Eval('_parent_shipment', {}).get('carrier', False),
+ })
+ shipping_label = fields.Binary(
+ "Shipping Label", readonly=True,
+ file_id=file_id, store_prefix=store_prefix)
+ shipping_label_id = fields.Char(
+ "Shipping Label ID", readonly=True, strip=False)
+ shipping_label_mimetype = fields.Char(
+ "Shipping Label MIME Type", readonly=True)
+ shipping_tracking_url = fields.Function(
+ fields.Char(
+ "Shipping Tracking URL",
+ states={
+ 'invisible': ~Eval('shipping_tracking_url'),
+ }),
+ 'get_shipping_tracking_url')
+
+ def get_shipping_tracking_url(self, name):
+ return
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._buttons.update(
+ print_shipping_label={
+ 'invisible': ~Eval('shipping_label'),
+ 'depends': ['shipping_label'],
+ })
+
+ @classmethod
+ def __register__(cls, module_name):
+ pool = Pool()
+ PackageType = pool.get('stock.package.type')
+ cursor = Transaction().connection.cursor()
+ table = cls.__table__()
+ package_type = PackageType.__table__()
+ table_h = cls.__table_handler__(module_name)
+ dimension_columns = [
+ 'length', 'length_uom',
+ 'height', 'height_uom',
+ 'width', 'width_uom']
+ dimension_exists = any(
+ table_h.column_exist(c) for c in dimension_columns)
+
+ super().__register__(module_name)
+
+ # Migration from 5.8: Update dimensions on package from package_type
+ if not dimension_exists:
+ columns = []
+ values = []
+ for c in dimension_columns:
+ columns.append(Column(table, c))
+ values.append(package_type.select(
+ Column(package_type, c),
+ where=package_type.id == table.type))
+ cursor.execute(*table.update(
+ columns=columns,
+ values=values))
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ domain = super(Package, cls).search_rec_name(name, clause)
+ return ['OR', domain,
+ ('shipping_reference',) + tuple(clause[1:]),
+ ]
+
+ @fields.depends('type')
+ def on_change_type(self):
+ super().on_change_type()
+ if self.type:
+ self.length = self.type.length
+ self.length_uom = self.type.length_uom
+ self.height = self.type.height
+ self.height_uom = self.type.height_uom
+ self.width = self.type.width
+ self.width_uom = self.type.width_uom
+
+ @classmethod
+ def copy(cls, packages, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('shipping_reference', None)
+ default.setdefault('shipping_label', None)
+ return super(Package, cls).copy(packages, default=default)
+
+ @classmethod
+ @ModelView.button_action('stock_package_shipping.report_shipping_label')
+ def print_shipping_label(cls, packages):
+ pass
+
+
+class ShippingMixin:
+ __slots__ = ()
+ shipping_description = fields.Char('Shipping Description',
+ states={
+ 'readonly': Eval('state').in_(['done', 'packed'])
+ })
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls._buttons.update({
+ 'create_shipping': {
+ 'invisible': (Eval('reference', False)
+ | ~Eval('carrier', False)),
+ 'readonly': (Eval('reference', False)
+ | ~Eval('root_packages', False)
+ | ~Eval('carrier', False)
+ | ~Eval('state').in_(['packed', 'done'])),
+ 'depends': ['state', 'carrier', 'reference',
+ 'root_packages'],
+ },
+ })
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ domain = super().search_rec_name(name, clause)
+ return ['OR', domain,
+ ('reference',) + tuple(clause[1:]),
+ ]
+
+ @classmethod
+ def validate(cls, shipments):
+ super().validate(shipments)
+ for shipment in shipments:
+ if shipment.carrier and shipment.carrier.shipping_service:
+ method_name = ('validate_packing_%s'
+ % shipment.carrier.shipping_service)
+ validator = getattr(shipment, method_name)
+ validator()
+
+ @classmethod
+ def check_no_carrier(cls, shipments):
+ pool = Pool()
+ Warning = pool.get('res.user.warning')
+ for shipment in shipments:
+ if (not shipment.carrier
+ and shipment.delivery_address
+ and shipment.warehouse not in
+ shipment.delivery_address.warehouses):
+ name = 'shipment_out_no_carrier_%s' % shipment
+ if Warning.check(name):
+ raise PackWarning(name,
+ gettext('stock_package_shipping'
+ '.msg_shipment_without_carrier',
+ shipment=shipment.rec_name))
+
+ @classmethod
+ @ModelView.button_action(
+ 'stock_package_shipping.act_create_shipping_wizard')
+ def create_shipping(cls, shipments):
+ for shipment in shipments:
+ if shipment.state not in shipment.shipping_allowed:
+ raise AccessError(
+ gettext('stock_package_shipping.msg_shipment_not_packed',
+ shipment=shipment.rec_name))
+
+ @property
+ def shipping_allowed(self):
+ raise NotImplementedError
+
+ @property
+ def shipping_warehouse(self):
+ raise NotImplementedError
+
+ @property
+ def shipping_to(self):
+ raise NotImplementedError
+
+ @property
+ def shipping_to_address(self):
+ raise NotImplementedError
+
+
+class ShipmentOut(ShippingMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out'
+
+ @classmethod
+ def __register__(cls, module):
+ pool = Pool()
+ ModelData = pool.get('ir.model.data')
+ model_data = ModelData.__table__()
+ cursor = Transaction().connection.cursor()
+ super(ShipmentOut, cls).__register__(module)
+
+ # Migration from 4.6: rename create_shipping xml id
+ if module == 'stock_package_shipping':
+ cursor.execute(*model_data.update(
+ [model_data.fs_id],
+ ['shipment_out_create_shipping_button'],
+ where=(model_data.module == module)
+ & (model_data.model == 'ir.model.button')
+ & (model_data.fs_id == 'create_shipping_button')))
+
+ @classmethod
+ @Workflow.transition('packed')
+ def pack(cls, shipments):
+ super().pack(shipments)
+ cls.check_no_carrier(shipments)
+
+ @property
+ def shipping_allowed(self):
+ return {'packed', 'done'}
+
+ @property
+ def shipping_warehouse(self):
+ return self.warehouse
+
+ @property
+ def shipping_to(self):
+ return self.customer
+
+ @property
+ def shipping_to_address(self):
+ return self.delivery_address
+
+
+class ShipmentInReturn(ShippingMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in.return'
+
+ carrier = fields.Many2One(
+ 'carrier', "Carrier",
+ states={
+ 'readonly': ~Eval('state').in_(['draft', 'waiting', 'assigned']),
+ })
+
+ @classmethod
+ @ModelView.button
+ @Workflow.transition('done')
+ def done(cls, shipments):
+ super().done(shipments)
+ cls.check_no_carrier(shipments)
+
+ @property
+ def shipping_allowed(self):
+ return {'assigned', 'done'}
+
+ @property
+ def shipping_warehouse(self):
+ return self.from_location.warehouse
+
+ @property
+ def shipping_to(self):
+ return self.supplier
+
+ @property
+ def shipping_to_address(self):
+ return self.delivery_address
+
+
+class CreateShipping(Wizard):
+ 'Create Shipping'
+ __name__ = 'stock.shipment.create_shipping'
+
+ start = StateTransition()
+
+ def transition_start(self):
+ shipping_service = self.record.carrier.shipping_service
+ method_name = 'validate_packing_%s' % shipping_service
+ getattr(self.record, method_name)()
+ return 'end'
+
+
+class ShippingLabel(Report):
+ __name__ = 'stock.package.shipping_label'
+
+ @classmethod
+ def render(cls, report, report_context):
+ package = report_context['record']
+ if not package:
+ return '.bin', b''
+ extension = mimetypes.guess_extension(
+ package.shipping_label_mimetype or 'application/octet-stream')
+ # Return with extension so convert has it
+ return extension, package.shipping_label or b''
+
+ @classmethod
+ def convert(cls, report, data, **kwargs):
+ return data
+
+
+class PrintShippingLabel(Wizard):
+ "Print Shipping Label"
+ __name__ = 'stock.shipment.print_shipping_label'
+ start_state = 'print_'
+ print_ = StateAction('stock_package_shipping.report_shipping_label')
+
+ def do_print_(self, action):
+ package_ids = []
+ labels = set()
+ for shipment in self.records:
+ for package in shipment.packages:
+ if (package.shipping_label
+ and package.shipping_label not in labels):
+ package_ids.append(package.id)
+ labels.add(package.shipping_label)
+ return action, {'ids': package_ids}
diff --git a/modules/stock_package_shipping/stock.xml b/modules/stock_package_shipping/stock.xml
new file mode 100644
index 0000000000..812926116c
--- /dev/null
+++ b/modules/stock_package_shipping/stock.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ stock.package.type
+
+ package_type_form
+
+
+
+ stock.package
+
+ package_form
+
+
+ stock.package
+
+ package_list
+
+
+
+ print_shipping_label
+ Shipping Label
+
+
+
+
+ stock.shipment.out
+
+ shipment_out_form
+
+
+
+ create_shipping
+ Create Shipping for Packages
+
+
+
+
+ stock.shipment.in.return
+
+ shipment_in_return_form
+
+
+
+ create_shipping
+ Create Shipping for Packages
+
+
+
+
+ Create Shipping
+ stock.shipment.create_shipping
+
+
+
+ Shipping Label
+ stock.package
+ stock.package.shipping_label
+
+ txt
+
+
+ form_print
+ stock.package,-1
+
+
+
+
+ Shipping Labels
+ stock.shipment.print_shipping_label
+
+
+ form_print
+ stock.shipment.out,-1
+
+
+
+ form_print
+ stock.shipment.in.return,-1
+
+
+
+
diff --git a/modules/stock_package_shipping/tests/__init__.py b/modules/stock_package_shipping/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_package_shipping/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_package_shipping/tests/test_module.py b/modules/stock_package_shipping/tests/test_module.py
new file mode 100644
index 0000000000..b630aa1da0
--- /dev/null
+++ b/modules/stock_package_shipping/tests/test_module.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.tests.test_tryton import ModuleTestCase
+
+
+class StockPackageShippingTestCase(ModuleTestCase):
+ 'Test Stock Package Shipping module'
+ module = 'stock_package_shipping'
+
+
+del ModuleTestCase
diff --git a/modules/stock_package_shipping/tox.ini b/modules/stock_package_shipping/tox.ini
new file mode 100644
index 0000000000..62db059a5c
--- /dev/null
+++ b/modules/stock_package_shipping/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_package_shipping/* -m unittest discover -s tests
+ coverage report --include=./**/stock_package_shipping/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_package_shipping/tryton.cfg b/modules/stock_package_shipping/tryton.cfg
new file mode 100644
index 0000000000..fa8c1f85dc
--- /dev/null
+++ b/modules/stock_package_shipping/tryton.cfg
@@ -0,0 +1,16 @@
+[tryton]
+version=6.7.0
+depends:
+ ir
+ res
+ carrier
+ product
+ stock
+ stock_package
+ stock_shipment_measurements
+ stock_shipment_cost
+ product_measurements
+xml:
+ carrier.xml
+ stock.xml
+ message.xml
diff --git a/modules/stock_package_shipping/view/carrier_form.xml b/modules/stock_package_shipping/view/carrier_form.xml
new file mode 100644
index 0000000000..aeae5348ed
--- /dev/null
+++ b/modules/stock_package_shipping/view/carrier_form.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping/view/carrier_tree.xml b/modules/stock_package_shipping/view/carrier_tree.xml
new file mode 100644
index 0000000000..e4f6c45322
--- /dev/null
+++ b/modules/stock_package_shipping/view/carrier_tree.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping/view/package_form.xml b/modules/stock_package_shipping/view/package_form.xml
new file mode 100644
index 0000000000..dcfc93e15b
--- /dev/null
+++ b/modules/stock_package_shipping/view/package_form.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping/view/package_list.xml b/modules/stock_package_shipping/view/package_list.xml
new file mode 100644
index 0000000000..df6e5598c4
--- /dev/null
+++ b/modules/stock_package_shipping/view/package_list.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping/view/package_type_form.xml b/modules/stock_package_shipping/view/package_type_form.xml
new file mode 100644
index 0000000000..5427708fff
--- /dev/null
+++ b/modules/stock_package_shipping/view/package_type_form.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping/view/shipment_in_return_form.xml b/modules/stock_package_shipping/view/shipment_in_return_form.xml
new file mode 100644
index 0000000000..eefd7637b4
--- /dev/null
+++ b/modules/stock_package_shipping/view/shipment_in_return_form.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping/view/shipment_out_form.xml b/modules/stock_package_shipping/view/shipment_out_form.xml
new file mode 100644
index 0000000000..cb35f40339
--- /dev/null
+++ b/modules/stock_package_shipping/view/shipment_out_form.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping_dpd/.drone.yml b/modules/stock_package_shipping_dpd/.drone.yml
new file mode 100644
index 0000000000..7b87e59d53
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/.drone.yml
@@ -0,0 +1,71 @@
+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 DPD_USER_ID DPD_PASSWORD
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ secrets: [ dpd_user_id, dpd_password ]
+ 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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_package_shipping_dpd/.flake8 b/modules/stock_package_shipping_dpd/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_package_shipping_dpd/.isort.cfg b/modules/stock_package_shipping_dpd/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_package_shipping_dpd/CHANGELOG b/modules/stock_package_shipping_dpd/CHANGELOG
new file mode 100644
index 0000000000..d2b9f23d2a
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/CHANGELOG
@@ -0,0 +1,47 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add notification preference
+* Use contact mechanism from address
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-01
+* Bug fixes (see mercurial logs for details)
+
+Version 6.0.0 - 2021-05-03
+* Bug fixes (see mercurial logs for details)
+* Allow choosing the DPD product and formats
+
+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)
+* Use total weight of package
+
+Version 4.2.0 - 2016-11-28
+* Initial release
diff --git a/modules/stock_package_shipping_dpd/COPYRIGHT b/modules/stock_package_shipping_dpd/COPYRIGHT
new file mode 100644
index 0000000000..1a03f5236a
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2016-2022 B2CK.
+Copyright (C) 2016-2022 Nicolas Évrard.
+
+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/stock_package_shipping_dpd/LICENSE b/modules/stock_package_shipping_dpd/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/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/stock_package_shipping_dpd/MANIFEST.in b/modules/stock_package_shipping_dpd/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_package_shipping_dpd/README.rst b/modules/stock_package_shipping_dpd/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_package_shipping_dpd/__init__.py b/modules/stock_package_shipping_dpd/__init__.py
new file mode 100644
index 0000000000..a4af86cb24
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/__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 carrier, stock
+
+
+def register():
+ Pool.register(
+ carrier.CredentialDPD,
+ carrier.Carrier,
+ stock.Package,
+ stock.ShipmentOut,
+ stock.ShipmentInReturn,
+ module='stock_package_shipping_dpd', type_='model')
+ Pool.register(
+ stock.CreateShipping,
+ stock.CreateDPDShipping,
+ module='stock_package_shipping_dpd', type_='wizard')
diff --git a/modules/stock_package_shipping_dpd/carrier.py b/modules/stock_package_shipping_dpd/carrier.py
new file mode 100644
index 0000000000..a1025d5711
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/carrier.py
@@ -0,0 +1,124 @@
+# 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 locale
+
+from zeep.exceptions import Fault
+
+from trytond.i18n import gettext
+from trytond.model import (
+ MatchMixin, ModelSQL, ModelView, fields, sequence_ordered)
+from trytond.pool import PoolMeta
+from trytond.pyson import Eval
+
+from .configuration import LOGIN_SERVICE, get_client
+from .exceptions import DPDError
+
+
+class CredentialDPD(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
+ 'DPD Credential'
+ __name__ = 'carrier.credential.dpd'
+
+ company = fields.Many2One('company.company', 'Company')
+ user_id = fields.Char('User ID', required=True, strip=False)
+ password = fields.Char('Password', required=True, strip=False)
+ server = fields.Selection([
+ ('testing', 'Testing'),
+ ('production', 'Production'),
+ ], 'Server')
+ depot = fields.Char('Depot', readonly=True, strip=False)
+ token = fields.Char('Token', readonly=True, strip=False)
+
+ @classmethod
+ def default_server(cls):
+ return 'testing'
+
+ def update_token(self):
+ auth_client = get_client(self.server, LOGIN_SERVICE)
+ lang = (self.company.party.lang.code
+ if self.company.party.lang else 'en')
+ lang = locale.normalize(lang)[:5]
+ try:
+ result = auth_client.service.getAuth(
+ delisId=self.user_id, password=self.password,
+ messageLanguage=lang)
+ except Fault as e:
+ error_message = e.detail[0].find('errorMessage')
+ raise DPDError(
+ gettext('stock_package_shipping_dpd.msg_dpd_webservice_error',
+ message=error_message.text)) from e
+
+ self.token = result.authToken
+ self.depot = result.depot
+ self.save()
+
+
+class Carrier(metaclass=PoolMeta):
+ __name__ = 'carrier'
+
+ dpd_product = fields.Selection([
+ (None, ''),
+ ('CL', "DPD CLASSIC"),
+ ('E830', "DPD 8:30"),
+ ('E10', "DPD 10:00"),
+ ('E12', "DPD 12:00"),
+ ('E18', "DPD 18:00"),
+ ('IE2', "DPD EXPRESS"),
+ ('PL', "DPD PARCEL Letter"),
+ ('PL+', "DPD PARCEL Letter Plus"),
+ ('MAIL', "DPD International Mail"),
+ ], "Product", sort=False, translate=False,
+ states={
+ 'required': Eval('shipping_service') == 'dpd',
+ 'invisible': Eval('shipping_service') != 'dpd',
+ })
+ dpd_printer_language = fields.Selection([
+ (None, ''),
+ ('PDF', "PDF"),
+ ('ZPL', "ZPL"),
+ ], "Printer Language", sort=False, translate=False,
+ states={
+ 'required': Eval('shipping_service') == 'dpd',
+ 'invisible': Eval('shipping_service') != 'dpd',
+ })
+ dpd_paper_format = fields.Selection([
+ (None, ''),
+ ('A4', "A4"),
+ ('A6', "A6"),
+ ('A7', "A7"),
+ ], "Paper Format", sort=False, translate=False,
+ states={
+ 'required': Eval('shipping_service') == 'dpd',
+ 'invisible': Eval('shipping_service') != 'dpd',
+ })
+
+ dpd_notification = fields.Selection([
+ (None, ""),
+ ('email', "E-Mail"),
+ ('sms', "SMS"),
+ ], "Notification",
+ states={
+ 'invisible': Eval('shipping_service') != 'dpd',
+ },
+ help="The preferred notification channel.\n"
+ "Leave empty for no notification.")
+
+ @classmethod
+ def __setup__(cls):
+ super(Carrier, cls).__setup__()
+ cls.shipping_service.selection.append(('dpd', 'DPD'))
+
+ @classmethod
+ def view_attributes(cls):
+ return super().view_attributes() + [
+ ("/form/separator[@id='dpd']", 'states', {
+ 'invisible': Eval('shipping_service') != 'dpd',
+ }),
+ ]
+
+ @property
+ def shipping_label_mimetype(self):
+ mimetype = super().shipping_label_mimetype
+ if self.shipping_service == 'dpd':
+ mimetype = 'application/pdf'
+ return mimetype
diff --git a/modules/stock_package_shipping_dpd/carrier.xml b/modules/stock_package_shipping_dpd/carrier.xml
new file mode 100644
index 0000000000..c836e377a4
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/carrier.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+ carrier
+
+ carrier_form
+
+
+
+ carrier.credential.dpd
+ form
+ dpd_credential_form
+
+
+ carrier.credential.dpd
+ tree
+ dpd_credential_list
+
+
+
+ DPD Credentials
+ carrier.credential.dpd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping_dpd/configuration.py b/modules/stock_package_shipping_dpd/configuration.py
new file mode 100644
index 0000000000..ab935f0838
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/configuration.py
@@ -0,0 +1,30 @@
+# 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 urllib.parse import urljoin
+
+from zeep import Client
+from zeep.transports import Transport
+
+from trytond.config import config
+
+SERVER_URLS = {
+ 'testing': 'https://public-ws-stage.dpd.com/services/',
+ 'production': 'https://public-ws.dpd.com/services/',
+ }
+
+LOGIN_SERVICE = 'LoginService/V2_0?wsdl'
+SHIPMENT_SERVICE = 'ShipmentService/V3_2?wsdl'
+TIMEOUT = config.get(
+ 'stock_package_shipping_dpd', 'requests_timeout', default=300)
+
+
+def get_client(server, service):
+ api_base_url = config.get('stock_package_shipping_dpd',
+ server, default=SERVER_URLS[server])
+ url = urljoin(api_base_url, service)
+ # Disable the cache for testing because zeep's bug
+ # https://github.com/mvantellingen/python-zeep/issues/48
+ # which makes testing environments fail
+ transport = (Transport(cache=None, operation_timeout=TIMEOUT)
+ if url.startswith(SERVER_URLS['testing']) else None)
+ return Client(url, transport=transport)
diff --git a/modules/stock_package_shipping_dpd/doc/index.rst b/modules/stock_package_shipping_dpd/doc/index.rst
new file mode 100644
index 0000000000..903254ebfe
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/doc/index.rst
@@ -0,0 +1,31 @@
+Stock Package Shipping DPD Module
+#################################
+
+The Stock Package Shipping DPD module allows you to generate the DPD label
+using the DPD webservices.
+DPD has many different web services, the module supports:
+
+- `LoginService 2.0 `_
+- `ShipmentService 3.2 `_
+
+Carrier Credential
+******************
+
+This model allows to define the credential used to connect the DPD API.
+The credentials will be automatically retrieved based on the company of the
+Shipment.
+
+- *Company*: The company for which those credentials are valid
+- *User ID*: The User ID provided by DPD.
+- *Password*: The Password used to access the DPD API.
+- *Server*: Are those credentials used for accessing the Testing or the
+ Production server.
+
+Carrier
+*******
+
+The Carrier model is extended with the following fields:
+
+- *Product*: The DPD product requested.
+- *Printer Language*: The type of file used for the label sent by DPD
+- *Paper Format*: The format of the label sent by DPD
diff --git a/modules/stock_package_shipping_dpd/exceptions.py b/modules/stock_package_shipping_dpd/exceptions.py
new file mode 100644
index 0000000000..d3cb0d2c64
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/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 DPDError(UserError):
+ pass
diff --git a/modules/stock_package_shipping_dpd/locale/bg.po b/modules/stock_package_shipping_dpd/locale/bg.po
new file mode 100644
index 0000000000..10f4922dcc
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/bg.po
@@ -0,0 +1,121 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Управление на производство"
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Фирма"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Парола"
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Сървър"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Управление на производство"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/ca.po b/modules/stock_package_shipping_dpd/locale/ca.po
new file mode 100644
index 0000000000..419961fb48
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/ca.po
@@ -0,0 +1,123 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr "Notificació"
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr "Format paper"
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr "Idioma de la impressió"
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Producte"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr "Dipòsit"
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Contrasenya"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Servidor"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr "Token"
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "Identificador usuari"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+"El canal de notificació preferit. \n"
+"Deixeu-ho en blanc per desactivar la notificació."
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "Credencial DPD"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Crea enviaments DPD per paquets"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "Credencials DPD"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr "La identificació DPD ha fallat amb les credencials \"%(credential)s\"."
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"La crida al servei web DPD ha fallat amb el següent missatge d'error:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+"No podeu crear el enviament per l'albarà \"%(shipment)s\" perquè ja té un "
+"número de referència."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+"Per validar l'albarà \"%(shipment)s\" heu d'establir una direcció al "
+"magatzem \"%(warehouse)s\"."
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "Credencials DPD"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr "Correu electrònic"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr "Proves"
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr "Informació de les credencials"
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/cs.po b/modules/stock_package_shipping_dpd/locale/cs.po
new file mode 100644
index 0000000000..03b386e84f
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/cs.po
@@ -0,0 +1,116 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/de.po b/modules/stock_package_shipping_dpd/locale/de.po
new file mode 100644
index 0000000000..73ce009582
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/de.po
@@ -0,0 +1,123 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr "Benachrichtigung"
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr "Papierformat"
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr "Druckersprache"
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Artikel"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr "Depot"
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Passwort"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Server"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr "Token"
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "Benutzer ID"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+"Der bevorzugte Benachrichtigungskanal.\n"
+"Leer lassen für keine Benachrichtigung."
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Anmeldedaten"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "DPD Versand für Pakete erstellen"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Anmeldedaten"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr "Der DPD Login mit den Anmeldedaten \"%(credential)s\" ist fehlgeschlagen."
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"Der Aufruf des DPD-Webservice schlug fehl mit der folgenden Fehlermeldung:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+"Für die Lieferung \"%(shipment)s\" kann keine Sendung erstellt werden, da "
+"sie bereits eine Referenznummer hat."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+"Um die Lieferung \"%(shipment)s\" validieren zu können, muss eine Adresse "
+"für den Logistikstandort \"%(warehouse)s\" erfasst werden."
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Anmeldedaten"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr "E-Mail"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Produktivumgebung"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr "Testumgebung"
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr "Anmeldedaten"
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/es.po b/modules/stock_package_shipping_dpd/locale/es.po
new file mode 100644
index 0000000000..6916b93f8d
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/es.po
@@ -0,0 +1,123 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr "Notificación"
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr "Formato papel"
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr "Idioma de la impresión"
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Producto"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr "Deposito"
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Contraseña"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Servidor"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr "Token"
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "Identificador de usuario"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+"El canal de notificación preferido. \n"
+"Dejare en blanco para desactivar la notificación."
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "Credencial DPD"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Crear envíos DPD para paquetes"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "Credenciales DPD"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr "La identificación DPD ha fallado con las credenciales \"%(credential)s\"."
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"La llamada al servicio web DPD ha fallado con el siguiente mensaje de error:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+"No puede crear el envío para el albarán \"%(shipment)s\" porque ya tiene un "
+"número de referencia."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+"Para validar el albarán \"%(shipment)s\" debe establecer una dirección en el"
+" almacén \"%(warehouse)s\"."
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "Credenciales DPD"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr "Correo electrónico"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr "Pruebas"
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr "Información de las credenciales"
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/es_419.po b/modules/stock_package_shipping_dpd/locale/es_419.po
new file mode 100644
index 0000000000..65d046dc27
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/es_419.po
@@ -0,0 +1,115 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr "Depósito"
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/et.po b/modules/stock_package_shipping_dpd/locale/et.po
new file mode 100644
index 0000000000..db0146d2d4
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/et.po
@@ -0,0 +1,117 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Tootmine"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Ettevõte"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Salasõna"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Server"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr "Token"
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "Kasutaja ID"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD viide"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Loo DPD saadetis"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD viide"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD viide"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Tootmine"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr "Testimine"
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr "Viite info"
+
+#, fuzzy
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/fa.po b/modules/stock_package_shipping_dpd/locale/fa.po
new file mode 100644
index 0000000000..bfdd5c7324
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/fa.po
@@ -0,0 +1,124 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "تهیه کننده"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "شرکت"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr "دپو"
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "کلمه عبور"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "سرور"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr "توکن"
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "شناسه کاربر"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "گواهی نامه DPD"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "ایجاد حمل ونقل DPD برای بسته ها"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "گواهی نامه های DPD"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"تماس با وب سرویس DPD با پیغام خطای زیر انجام نشد :\n"
+"\"%s\""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+"شما نمی توانید حمل و نقل را برای حمل و نقل :\"%(shipment)s\" ایجاد کنید زیرا"
+" قبلا یک شماره مرجع است."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+"برای تایید حمل و نقل :\"%(shipment)s\" شما باید یک آدرس را در "
+"انبار:\"%(warehouse)s\" تنظیم کنید."
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "گواهی نامه های DPD"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "تهیه کننده"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr "آزمایش"
+
+#, fuzzy
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr "اطلاعات گواهی نامه"
+
+#, fuzzy
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/fi.po b/modules/stock_package_shipping_dpd/locale/fi.po
new file mode 100644
index 0000000000..03b386e84f
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/fi.po
@@ -0,0 +1,116 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/fr.po b/modules/stock_package_shipping_dpd/locale/fr.po
new file mode 100644
index 0000000000..f6e415e86a
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/fr.po
@@ -0,0 +1,125 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr "Notification"
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr "Format papier"
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr "Langue de l'imprimante"
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Produit"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr "Dépôt"
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Mot de passe"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Serveur"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr "Jeton"
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "ID d'utilisateur"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+"Le canal de notification préféré.\n"
+"Laissez vide pour aucune notification."
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "Identifiant DPD"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Créer la livraison DPD pour les emballages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "Identifiants DPD"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+"La connexion DPD a échoué avec les informations d'identification "
+"« %(credential)s »."
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"L'appel au service web de DPD a échoué avec le message d'erreur suivant :\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+"Vous ne pouvez pas créer de livraison pour l'expédition « %(shipment)s » car"
+" elle a déjà un numéro de référence."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+"Pour valider la livraison « %(shipment)s », vous devez définir une adresse "
+"pour l'entrepôt « %(warehouse)s »."
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "Identifiants DPD"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr "E-Mail"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr "Essai"
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr "Informations d'identification"
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/hu.po b/modules/stock_package_shipping_dpd/locale/hu.po
new file mode 100644
index 0000000000..6ec177b865
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/hu.po
@@ -0,0 +1,120 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Termelés"
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Társaság"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Jelszó"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Termelés"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/id.po b/modules/stock_package_shipping_dpd/locale/id.po
new file mode 100644
index 0000000000..9eca4edbc9
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/id.po
@@ -0,0 +1,116 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Produk"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Kata sandi"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Server"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr "Testing"
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/it.po b/modules/stock_package_shipping_dpd/locale/it.po
new file mode 100644
index 0000000000..de399dc73c
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/it.po
@@ -0,0 +1,117 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Password"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/lo.po b/modules/stock_package_shipping_dpd/locale/lo.po
new file mode 100644
index 0000000000..2e8e21e3fc
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/lo.po
@@ -0,0 +1,119 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "ຜະລິດຕະພັນ"
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "ຫ້ອງການ/ສຳນັກງານ"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "ຜະລິດຕະພັນ"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/lt.po b/modules/stock_package_shipping_dpd/locale/lt.po
new file mode 100644
index 0000000000..0cd345c731
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/lt.po
@@ -0,0 +1,116 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Organizacija"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "Naudotojo ID"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/nl.po b/modules/stock_package_shipping_dpd/locale/nl.po
new file mode 100644
index 0000000000..8b8dfe145b
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/nl.po
@@ -0,0 +1,123 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr "Melding"
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr "Papierformaat"
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr "Printertaal"
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Product"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr "Magazijn"
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Wachtwoord"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Server"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr "Token"
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "Gebruiker ID"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+"Voorkeur welk soort melding te gebruiken.\n"
+"Laat leeg om meldingen uit te schakelen."
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD-referentie"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Maak een DPD-verzending voor de pakketten"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr "DPD-aanmelding is mislukt met referentie %(credential)s\"."
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"DPD webservice-oproep mislukt met het volgende foutbericht:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+"U kunt geen verzending voor zending \"%(shipment)s\" maken omdat deze al een"
+" referentienummer heeft."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+"Om zending \"%(shipment)s\" te valideren, moet u een adres voor magazijn "
+"\"%(warehouse)s\" instellen."
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr "E-mail"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr "Testen"
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr "Referentiegegevens"
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/pl.po b/modules/stock_package_shipping_dpd/locale/pl.po
new file mode 100644
index 0000000000..f4c3185f2b
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/pl.po
@@ -0,0 +1,120 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Produkcja"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Firma"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Hasło"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Serwer"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr "Token"
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "ID użytkownika"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Produkcja"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/pt.po b/modules/stock_package_shipping_dpd/locale/pt.po
new file mode 100644
index 0000000000..3403773c18
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/pt.po
@@ -0,0 +1,125 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Produção"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr "Depósito"
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Senha"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Servidor"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr "Token:"
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "ID de usuário"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "Credencial DPD"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"A chamada ao serviço web DPD falhou com a mensagem de erro:\n"
+"\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Produção"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr "Testando"
+
+#, fuzzy
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr "Informações da Credencial"
+
+#, fuzzy
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/ro.po b/modules/stock_package_shipping_dpd/locale/ro.po
new file mode 100644
index 0000000000..a44566bf05
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/ro.po
@@ -0,0 +1,115 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/ru.po b/modules/stock_package_shipping_dpd/locale/ru.po
new file mode 100644
index 0000000000..5830f30f07
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/ru.po
@@ -0,0 +1,121 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Производство"
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Учет.орг."
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Пароль"
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Сервер"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Производство"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/sl.po b/modules/stock_package_shipping_dpd/locale/sl.po
new file mode 100644
index 0000000000..836cfe065b
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/sl.po
@@ -0,0 +1,125 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr "Produkcijski"
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr "Družba"
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr "Skladišče"
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "Geslo"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr "Strežnik"
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr "Žeton"
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr "Uporabnik"
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD prijava"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"Sporočilo napake pri klicu DPD spletne storitve:\n"
+"\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr "DPD"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr "Produkcijski"
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr "Preizkusni"
+
+#, fuzzy
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr "Prijavni podatki"
+
+#, fuzzy
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr "DPD"
diff --git a/modules/stock_package_shipping_dpd/locale/tr.po b/modules/stock_package_shipping_dpd/locale/tr.po
new file mode 100644
index 0000000000..03b386e84f
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/tr.po
@@ -0,0 +1,116 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/uk.po b/modules/stock_package_shipping_dpd/locale/uk.po
new file mode 100644
index 0000000000..565bab6df3
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/uk.po
@@ -0,0 +1,115 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/locale/zh_CN.po b/modules/stock_package_shipping_dpd/locale/zh_CN.po
new file mode 100644
index 0000000000..ed9c44d692
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/locale/zh_CN.po
@@ -0,0 +1,117 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,dpd_notification:"
+msgid "Notification"
+msgstr ""
+
+msgctxt "field:carrier,dpd_paper_format:"
+msgid "Paper Format"
+msgstr ""
+
+msgctxt "field:carrier,dpd_printer_language:"
+msgid "Printer Language"
+msgstr ""
+
+msgctxt "field:carrier,dpd_product:"
+msgid "Product"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,depot:"
+msgid "Depot"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:carrier.credential.dpd,password:"
+msgid "Password"
+msgstr "密码"
+
+msgctxt "field:carrier.credential.dpd,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,token:"
+msgid "Token"
+msgstr ""
+
+msgctxt "field:carrier.credential.dpd,user_id:"
+msgid "User ID"
+msgstr ""
+
+msgctxt "help:carrier,dpd_notification:"
+msgid ""
+"The preferred notification channel.\n"
+"Leave empty for no notification."
+msgstr ""
+
+#, fuzzy
+msgctxt "model:carrier.credential.dpd,name:"
+msgid "DPD Credential"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.action,name:act_create_shipping_dpd_wizard"
+msgid "Create DPD Shipping for Packages"
+msgstr "Create DPD Shipping for Packages"
+
+msgctxt "model:ir.action,name:act_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "model:ir.message,text:msg_dpd_login_error"
+msgid "DPD login failed with credential \"%(credential)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_dpd_webservice_error"
+msgid ""
+"DPD webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create shipping for shipment \"%(shipment)s\" because it has "
+"already a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on the "
+"warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_dpd_credential_form"
+msgid "DPD Credentials"
+msgstr "DPD Credentials"
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "E-Mail"
+msgstr ""
+
+msgctxt "selection:carrier,dpd_notification:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "DPD"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.dpd,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.dpd:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "DPD"
+msgstr ""
diff --git a/modules/stock_package_shipping_dpd/message.xml b/modules/stock_package_shipping_dpd/message.xml
new file mode 100644
index 0000000000..cc65a45e82
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/message.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+ DPD webservice call failed with the following error message:
+%(message)s
+
+
+ DPD login failed with credential "%(credential)s".
+
+
+ To validate shipment "%(shipment)s" you must set an address on the warehouse "%(warehouse)s".
+
+
+ You cannot create shipping for shipment "%(shipment)s" because it has already a reference number.
+
+
+
diff --git a/modules/stock_package_shipping_dpd/setup.py b/modules/stock_package_shipping_dpd/setup.py
new file mode 100755
index 0000000000..4ce89a5deb
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/setup.py
@@ -0,0 +1,155 @@
+#!/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 find_packages, setup
+
+
+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_stock_package_shipping_dpd'
+
+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 = ['zeep >= 0.12', 'PyPDF2', 'lxml']
+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_sale'),
+ get_require_version('trytond_sale_shipment_cost'),
+ ]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version))
+
+setup(name=name,
+ version=version,
+ description='DPD connector for the Tryton application platform',
+ 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/stock_package_shipping_dpd'),
+ },
+ keywords='tryton stock package shipping dpd',
+ package_dir={'trytond.modules.stock_package_shipping_dpd': '.'},
+ packages=(
+ ['trytond.modules.stock_package_shipping_dpd']
+ + ['trytond.modules.stock_package_shipping_dpd.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_package_shipping_dpd': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_package_shipping_dpd = trytond.modules.stock_package_shipping_dpd
+ """,
+ )
diff --git a/modules/stock_package_shipping_dpd/stock.py b/modules/stock_package_shipping_dpd/stock.py
new file mode 100644
index 0000000000..fd4c0bb843
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/stock.py
@@ -0,0 +1,319 @@
+# 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 locale
+from io import BytesIO
+from itertools import zip_longest
+
+from lxml import etree
+from PyPDF2 import PdfFileReader, PdfFileWriter
+from zeep.exceptions import Fault
+
+from trytond.i18n import gettext
+from trytond.model import fields
+from trytond.model.exceptions import AccessError
+from trytond.modules.stock_package_shipping.exceptions import (
+ PackingValidationError)
+from trytond.pool import Pool, PoolMeta
+from trytond.transaction import Transaction
+from trytond.wizard import StateAction, StateTransition, Wizard
+
+from .configuration import SHIPMENT_SERVICE, get_client
+from .exceptions import DPDError
+
+TRACKING_URL = 'https://tracking.dpd.de/status/%(code)s/parcel/%(reference)s'
+
+
+class Package(metaclass=PoolMeta):
+ __name__ = 'stock.package'
+
+ def get_shipping_tracking_url(self, name):
+ pool = Pool()
+ ShipmentOut = pool.get('stock.shipment.out')
+ ShipmentInReturn = pool.get('stock.shipment.in.return')
+ url = super().get_shipping_tracking_url(name)
+ if (self.shipping_reference
+ and self.shipment
+ and self.shipment.id >= 0
+ and self.shipment.carrier
+ and self.shipment.carrier.shipping_service == 'dpd'):
+ party = address = None
+ if isinstance(self.shipment, ShipmentOut):
+ party = self.shipment.customer
+ address = self.shipment.delivery_address
+ elif isinstance(self.shipment, ShipmentInReturn):
+ party = self.shipment.supplier
+ address = self.shipment.delivery_address
+ if party and party.lang:
+ lang_code = party.lang.code
+ else:
+ lang_code = Transaction().language
+ if address and address.country:
+ code = '_'.join(
+ (lang_code.split('_')[0], address.country.code))
+ else:
+ code = lang_code
+ url = TRACKING_URL % {
+ 'code': code,
+ 'reference': self.shipping_reference,
+ }
+ return url
+
+
+class ShippingDPDMixin:
+ __slots__ = ()
+
+ def validate_packing_dpd(self):
+ warehouse = self.shipping_warehouse
+ if not warehouse.address:
+ raise PackingValidationError(
+ gettext('stock_package_shipping_dpd'
+ '.msg_warehouse_address_required',
+ shipment=self.rec_name,
+ warehouse=warehouse.rec_name))
+
+
+class ShipmentOut(ShippingDPDMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out'
+
+
+class ShipmentInReturn(ShippingDPDMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in.return'
+
+
+class CreateShipping(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.create_shipping'
+
+ dpd = StateAction(
+ 'stock_package_shipping_dpd.act_create_shipping_dpd_wizard')
+
+ def transition_start(self):
+ next_state = super(CreateShipping, self).transition_start()
+ if self.record.carrier.shipping_service == 'dpd':
+ next_state = 'dpd'
+ return next_state
+
+ def do_dpd(self, action):
+ ctx = Transaction().context
+ return action, {
+ 'model': ctx['active_model'],
+ 'id': ctx['active_id'],
+ 'ids': [ctx['active_id']],
+ }
+
+
+class CreateDPDShipping(Wizard):
+ 'Create DPD Shipping'
+ __name__ = 'stock.shipment.create_shipping.dpd'
+
+ start = StateTransition()
+
+ def transition_start(self):
+ pool = Pool()
+ Package = pool.get('stock.package')
+
+ shipment = self.record
+ if shipment.reference:
+ raise AccessError(
+ gettext('stock_package_shipping_dpd'
+ '.msg_shipment_has_reference_number',
+ shipment=shipment.rec_name))
+
+ credential = self.get_credential(shipment)
+ if not credential.depot or not credential.token:
+ credential.update_token()
+
+ carrier = shipment.carrier
+ shipping_client = get_client(credential.server, SHIPMENT_SERVICE)
+ print_options = self.get_print_options(shipment)
+ packages = shipment.root_packages
+ shipment_data = self.get_shipment_data(credential, shipment, packages)
+
+ count = 0
+ while count < 2:
+ lang = (credential.company.party.lang.code
+ if credential.company.party.lang else 'en')
+ lang = locale.normalize(lang)[:5]
+ authentication = {
+ 'delisId': credential.user_id,
+ 'authToken': credential.token,
+ 'messageLanguage': lang,
+ }
+ try:
+ shipment_response = shipping_client.service.storeOrders(
+ print_options, shipment_data, _soapheaders={
+ 'authentication': authentication,
+ })
+ break
+ except Fault as e:
+ if e.detail:
+ tag = etree.QName(e.detail[0].tag)
+ if tag.localname == 'authenticationFault':
+ count += 1
+ credential.update_token()
+ continue
+ raise DPDError(gettext(
+ 'stock_package_shipping_dpd.'
+ 'msg_dpd_webservice_error',
+ message=e.message)) from e
+ else:
+ raise DPDError(
+ gettext('stock_package_shipping_dpd.msg_dpd_login_error',
+ credential=credential.rec_name))
+
+ response, = shipment_response.shipmentResponses
+ if response.faults:
+ message = '\n'.join(f.message for f in response.faults)
+ raise DPDError(
+ gettext('stock_package_shipping_dpd.msg_dpd_webservice_error',
+ message=message))
+
+ labels = []
+ labels_pdf = BytesIO(shipment_response.parcellabelsPDF)
+ reader = PdfFileReader(labels_pdf)
+ for page_num in range(reader.getNumPages()):
+ new_pdf = PdfFileWriter()
+ new_label = BytesIO()
+ new_pdf.addPage(reader.getPage(page_num))
+ new_pdf.write(new_label)
+ labels.append(new_label)
+
+ shipment.reference = response.mpsId
+ parcels = response.parcelInformation
+ for package, label, parcel in zip_longest(packages, labels, parcels):
+ package.shipping_label = fields.Binary.cast(label.getvalue())
+ package.shipping_label_mimetype = (
+ carrier.shipping_label_mimetype)
+ package.shipping_reference = parcel.parcelLabelNumber
+ Package.save(packages)
+ shipment.save()
+
+ return 'end'
+
+ def get_credential_pattern(self, shipment):
+ return {
+ 'company': shipment.company.id,
+ }
+
+ def get_credential(self, shipment):
+ pool = Pool()
+ DPDCredential = pool.get('carrier.credential.dpd')
+
+ credential_pattern = self.get_credential_pattern(shipment)
+ for credential in DPDCredential.search([]):
+ if credential.match(credential_pattern):
+ return credential
+
+ def get_print_options(self, shipment):
+ return {
+ 'printerLanguage': shipment.carrier.dpd_printer_language,
+ 'paperFormat': shipment.carrier.dpd_paper_format,
+ }
+
+ def shipping_party(self, party, address, usage=None):
+ shipping_party = {
+ 'name1': address.party_full_name[:35],
+ 'name2': '',
+ 'street': ' '.join((address.street or '').splitlines())[:35],
+ 'country': address.country.code if address.country else '',
+ 'zipCode': address.postal_code[:9],
+ 'city': address.city[:35],
+ }
+ if party.full_name != address.party_full_name:
+ shipping_party['name2'] = party.full_name[:35]
+
+ phone = address.contact_mechanism_get({'phone', 'mobile'}, usage=usage)
+ if phone and len(phone.value) <= 30:
+ shipping_party['phone'] = phone.value
+ email = address.contact_mechanism_get('email', usage=usage)
+ if email and len(email.value) <= 50:
+ shipping_party['email'] = email.value
+
+ return shipping_party
+
+ def get_parcel(self, package):
+ pool = Pool()
+ UoM = pool.get('product.uom')
+ ModelData = pool.get('ir.model.data')
+
+ cm = UoM(ModelData.get_id('product', 'uom_centimeter'))
+
+ parcel = {}
+
+ if package.total_weight:
+ # in grams rounded in 10 gram units
+ weight = int(package.total_weight * 10) * 10
+ if weight < 1000000000:
+ parcel['weight'] = weight
+
+ if (package.length is not None
+ and package.width is not None
+ and package.height is not None):
+ length = UoM.compute_qty(
+ package.length_uom, package.length, cm)
+ width = UoM.compute_qty(
+ package.width_uom, package.width, cm)
+ height = UoM.compute_qty(
+ package.height_uom, package.height, cm)
+ if length < 1000 and width < 1000 and height < 1000:
+ parcel['volume'] = int(
+ '%03i%03i%03i' % (length, width, height))
+
+ return parcel
+
+ def get_shipment_data(self, credential, shipment, packages):
+ return {
+ 'generalShipmentData': {
+ 'identificationNumber': shipment.number,
+ 'sendingDepot': credential.depot,
+ 'product': shipment.carrier.dpd_product,
+ 'sender': self.shipping_party(
+ shipment.company.party,
+ shipment.shipping_warehouse.address),
+ 'recipient': self.shipping_party(
+ shipment.shipping_to, shipment.shipping_to_address),
+ },
+ 'parcels': [self.get_parcel(p) for p in packages],
+ 'productAndServiceData': {
+ 'orderType': 'consignment',
+ **self.get_notification(shipment),
+ },
+ }
+
+ def get_notification(self, shipment, usage=None):
+ carrier = shipment.carrier
+ if not carrier.dpd_notification:
+ return {}
+ party = shipment.shipping_to
+ if party and party.lang:
+ lang_code = party.lang.code
+ else:
+ lang_code = Transaction().language
+ lang_code = lang_code.upper()
+ channel2type = {
+ 'sms': {'mobile'},
+ }
+
+ channels = [
+ (1, 'email'),
+ (3, 'sms'),
+ ]
+ if carrier.dpd_notification == 'sms':
+ channels = reversed(channels)
+
+ for channel_id, channel in channels:
+ mechanism = party.contact_mechanism_get(
+ channel2type.get(channel, channel), usage=usage)
+ if not mechanism:
+ continue
+ value = mechanism.value
+ if len(value) > 50:
+ continue
+ return {
+ 'predict': {
+ 'channel': channel_id,
+ 'value': value,
+ 'language': lang_code,
+ },
+ }
+ return {}
diff --git a/modules/stock_package_shipping_dpd/stock.xml b/modules/stock_package_shipping_dpd/stock.xml
new file mode 100644
index 0000000000..2c4b020979
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/stock.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+ Create DPD Shipping for Packages
+ stock.shipment.create_shipping.dpd
+
+
+
diff --git a/modules/stock_package_shipping_dpd/tests/__init__.py b/modules/stock_package_shipping_dpd/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_package_shipping_dpd/tests/scenario_shipping_dpd.rst b/modules/stock_package_shipping_dpd/tests/scenario_shipping_dpd.rst
new file mode 100644
index 0000000000..f1179751cd
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/tests/scenario_shipping_dpd.rst
@@ -0,0 +1,231 @@
+========================================
+Stock Package Shipping with DPD scenario
+========================================
+
+Imports::
+
+ >>> import datetime
+ >>> import os
+ >>> from dateutil.relativedelta import relativedelta
+ >>> from decimal import Decimal
+ >>> from operator import attrgetter
+ >>> from proteus import Model, Wizard, Report
+ >>> 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, create_tax
+ >>> from trytond.modules.account_invoice.tests.tools import \
+ ... set_fiscalyear_invoice_sequences, create_payment_term
+ >>> today = datetime.date.today()
+
+Activate modules::
+
+ >>> config = activate_modules(
+ ... ['stock_package_shipping_dpd', 'sale', 'sale_shipment_cost'])
+
+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)
+ >>> revenue = accounts['revenue']
+ >>> expense = accounts['expense']
+
+Create a payment term::
+
+ >>> payment_term = create_payment_term()
+ >>> payment_term.save()
+
+Create parties::
+
+ >>> Party = Model.get('party.party')
+ >>> Country = Model.get('country.country')
+
+ >>> belgium = Country(code='BE', name='Belgium')
+ >>> belgium.save()
+ >>> france = Country(code='FR', name='France')
+ >>> france.save()
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+ >>> customer_address = customer.addresses.new()
+ >>> customer_address.street = 'Champs élysées'
+ >>> customer_address.postal_code = '75008'
+ >>> customer_address.city = 'Paris'
+ >>> customer_address.country = france
+ >>> customer_address.save()
+ >>> customer_phone = customer.contact_mechanisms.new(type='mobile')
+ >>> customer_phone.value = '+33 93 842 8862'
+ >>> customer_phone.save()
+
+Set the warehouse address::
+
+ >>> Address = Model.get('party.address')
+ >>> Location = Model.get('stock.location')
+ >>> warehouse, = Location.find([('type', '=', 'warehouse')])
+ >>> company_address = Address()
+ >>> company_address.party = company.party
+ >>> company_address.street = '2 rue de la Centrale'
+ >>> company_address.postal_code = '4000'
+ >>> company_address.city = 'Sclessin'
+ >>> company_address.country = belgium
+ >>> company_address.save()
+ >>> company_phone = company.party.contact_mechanisms.new()
+ >>> company_phone.type = 'phone'
+ >>> company_phone.value = '+32 4 2522122'
+ >>> company_phone.save()
+ >>> warehouse.address = company_address
+ >>> warehouse.save()
+
+Get some units::
+
+ >>> UoM = Model.get('product.uom')
+ >>> cm, = UoM.find([('symbol', '=', 'cm')])
+ >>> g, = UoM.find([('symbol', '=', 'g')])
+
+Create account category::
+
+ >>> ProductCategory = Model.get('product.category')
+ >>> account_category = ProductCategory(name="Account Category")
+ >>> account_category.accounting = True
+ >>> account_category.account_expense = expense
+ >>> account_category.account_revenue = revenue
+ >>> account_category.save()
+
+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.salable = True
+ >>> template.weight = 100
+ >>> template.weight_uom = g
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+Create an Inventory::
+
+ >>> Inventory = Model.get('stock.inventory')
+ >>> storage, = Location.find([
+ ... ('code', '=', 'STO'),
+ ... ])
+ >>> inventory = Inventory()
+ >>> inventory.location = storage
+ >>> inventory_line = inventory.lines.new(product=product)
+ >>> inventory_line.quantity = 100.0
+ >>> inventory_line.expected_quantity = 0.0
+ >>> inventory.click('confirm')
+ >>> inventory.state
+ 'done'
+
+Create Package Type::
+
+ >>> PackageType = Model.get('stock.package.type')
+ >>> box = PackageType(
+ ... name='Box',
+ ... length=10, length_uom=cm,
+ ... height=8, height_uom=cm,
+ ... width=5, width_uom=cm)
+ >>> box.save()
+
+Create a DPD Carrier and the related credential::
+
+ >>> Carrier = Model.get('carrier')
+ >>> CarrierSelection = Model.get('carrier.selection')
+ >>> DPDCredential = Model.get('carrier.credential.dpd')
+
+ >>> credential = DPDCredential()
+ >>> credential.company = company
+ >>> credential.user_id = os.getenv('DPD_USER_ID')
+ >>> credential.password = os.getenv('DPD_PASSWORD')
+ >>> credential.server = 'testing'
+ >>> credential.save()
+
+ >>> carrier_product_template = ProductTemplate()
+ >>> carrier_product_template.name = 'DPD Delivery'
+ >>> carrier_product_template.default_uom = unit
+ >>> carrier_product_template.type = 'service'
+ >>> carrier_product_template.salable = True
+ >>> carrier_product_template.list_price = Decimal(20)
+ >>> carrier_product_template.account_category = account_category
+ >>> carrier_product_template.save()
+ >>> carrier_product, = carrier_product_template.products
+
+ >>> dpd = Party(name='DPD')
+ >>> dpd.save()
+
+ >>> carrier = Carrier()
+ >>> carrier.party = dpd
+ >>> carrier.carrier_product = carrier_product
+ >>> carrier.shipping_service = 'dpd'
+ >>> carrier.dpd_product = 'CL'
+ >>> carrier.dpd_printer_language = 'PDF'
+ >>> carrier.dpd_paper_format = 'A6'
+ >>> carrier.dpd_notification = 'sms'
+ >>> carrier.save()
+
+ >>> catchall_selection = CarrierSelection(carrier=carrier)
+ >>> catchall_selection.save()
+
+Create a sale and thus a shipment::
+
+ >>> Sale = Model.get('sale.sale')
+ >>> SaleLine = Model.get('sale.line')
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.shipment_address = customer_address
+ >>> sale.payment_term = payment_term
+ >>> sale.invoice_method = 'order'
+ >>> sale.carrier = carrier
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = product
+ >>> sale_line.quantity = 2.0
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.click('process')
+
+Create the packs and ship the shipment::
+
+ >>> Package = Model.get('stock.package')
+ >>> shipment, = sale.shipments
+ >>> shipment.click('assign_try')
+ True
+ >>> shipment.click('pick')
+ >>> pack = shipment.packages.new()
+ >>> pack.type = box
+ >>> pack_move, = pack.moves.find([])
+ >>> pack.moves.append(pack_move)
+ >>> shipment.click('pack')
+
+ >>> create_shipping = Wizard('stock.shipment.create_shipping', [shipment])
+ >>> shipment.reload()
+ >>> shipment.reference != ''
+ True
+ >>> pack, = shipment.root_packages
+ >>> pack.shipping_label is not None
+ True
+ >>> pack.shipping_label_mimetype
+ 'application/pdf'
+ >>> pack.shipping_reference is not None
+ True
+ >>> pack.shipping_tracking_url.startswith('https://tracking.dpd.de/status/')
+ True
+ >>> pack.shipping_tracking_url.endswith(pack.shipping_reference)
+ True
diff --git a/modules/stock_package_shipping_dpd/tests/test_module.py b/modules/stock_package_shipping_dpd/tests/test_module.py
new file mode 100644
index 0000000000..8754bd8c25
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/tests/test_module.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.tests.test_tryton import ModuleTestCase
+
+
+class StockPackageShippingDpdTestCase(ModuleTestCase):
+ 'Test Stock Package Shipping Dpd module'
+ module = 'stock_package_shipping_dpd'
+
+
+del ModuleTestCase
diff --git a/modules/stock_package_shipping_dpd/tests/test_scenario.py b/modules/stock_package_shipping_dpd/tests/test_scenario.py
new file mode 100644
index 0000000000..a32779e0c7
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/tests/test_scenario.py
@@ -0,0 +1,10 @@
+# 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 os
+
+from trytond.tests.test_tryton import load_doc_tests
+
+if os.getenv('DPD_USER_ID') and os.getenv('DPD_PASSWORD'):
+ def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock_package_shipping_dpd/tox.ini b/modules/stock_package_shipping_dpd/tox.ini
new file mode 100644
index 0000000000..817507dc3d
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_package_shipping_dpd/* -m unittest discover -s tests
+ coverage report --include=./**/stock_package_shipping_dpd/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_package_shipping_dpd/tryton.cfg b/modules/stock_package_shipping_dpd/tryton.cfg
new file mode 100644
index 0000000000..d7bf505f7d
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/tryton.cfg
@@ -0,0 +1,15 @@
+[tryton]
+version=6.7.0
+depends:
+ ir
+ res
+ party
+ product
+ stock
+ stock_shipment_measurements
+ stock_package
+ stock_package_shipping
+xml:
+ carrier.xml
+ stock.xml
+ message.xml
diff --git a/modules/stock_package_shipping_dpd/view/carrier_form.xml b/modules/stock_package_shipping_dpd/view/carrier_form.xml
new file mode 100644
index 0000000000..e0be4750eb
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/view/carrier_form.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping_dpd/view/dpd_credential_form.xml b/modules/stock_package_shipping_dpd/view/dpd_credential_form.xml
new file mode 100644
index 0000000000..b17a71a93e
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/view/dpd_credential_form.xml
@@ -0,0 +1,17 @@
+
+
+
diff --git a/modules/stock_package_shipping_dpd/view/dpd_credential_list.xml b/modules/stock_package_shipping_dpd/view/dpd_credential_list.xml
new file mode 100644
index 0000000000..3ea329081b
--- /dev/null
+++ b/modules/stock_package_shipping_dpd/view/dpd_credential_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping_mygls/.drone.yml b/modules/stock_package_shipping_mygls/.drone.yml
new file mode 100644
index 0000000000..f99c626d17
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/.drone.yml
@@ -0,0 +1,79 @@
+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 MYGLS_USERNAME MYGLS_PASSWORD MYGLS_CLIENT_NUMBER
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ secrets: [ mygls_username, mygls_password, mygls_client_number ]
+ 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/*
+ volumes:
+ - cache:/root/.cache
+ check_doc:
+ image: ${IMAGE}
+ commands:
+ - pip install sphinx
+ - python -m sphinx -T -E -W -n -b html doc _build/html
+ - python -m sphinx -T -E -W -n -b linkcheck doc _build
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_package_shipping_mygls/.flake8 b/modules/stock_package_shipping_mygls/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_package_shipping_mygls/.isort.cfg b/modules/stock_package_shipping_mygls/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_package_shipping_mygls/CHANGELOG b/modules/stock_package_shipping_mygls/CHANGELOG
new file mode 100644
index 0000000000..13acbbdca3
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/CHANGELOG
@@ -0,0 +1,14 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Use contact mechanism from address
+
+Version 6.4.0 - 2022-05-02
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-01
+--------------------------
+* Initial release
diff --git a/modules/stock_package_shipping_mygls/COPYRIGHT b/modules/stock_package_shipping_mygls/COPYRIGHT
new file mode 100644
index 0000000000..852c531661
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2021-2022 B2CK
+Copyright (C) 2021-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/stock_package_shipping_mygls/LICENSE b/modules/stock_package_shipping_mygls/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/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/stock_package_shipping_mygls/MANIFEST.in b/modules/stock_package_shipping_mygls/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_package_shipping_mygls/README.rst b/modules/stock_package_shipping_mygls/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_package_shipping_mygls/__init__.py b/modules/stock_package_shipping_mygls/__init__.py
new file mode 100644
index 0000000000..b0b9a91c04
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/__init__.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.pool import Pool
+
+from . import carrier, stock
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ carrier.CredentialMyGLS,
+ carrier.Carrier,
+ stock.Package,
+ stock.ShipmentOut,
+ stock.ShipmentInReturn,
+ module='stock_package_shipping_mygls', type_='model')
+ Pool.register(
+ stock.ShipmentCreateShipping,
+ stock.ShipmentCreateShippingMyGLS,
+ module='stock_package_shipping_mygls', type_='wizard')
diff --git a/modules/stock_package_shipping_mygls/api.py b/modules/stock_package_shipping_mygls/api.py
new file mode 100644
index 0000000000..33e14ef77c
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/api.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.
+import hashlib
+
+from zeep import Client
+from zeep.transports import Transport
+
+from trytond.config import config
+
+URLS = {
+ 'testing': 'https://api.test.mygls.%(country)s/%(service)s.svc?singleWsdl',
+ 'production': 'https://api.mygls.%(country)s/%(service)s.svc?singleWsdl',
+ }
+TIMEOUT = config.get(
+ 'stock_package_shipping_mygls', 'requests_timeout', default=300)
+
+
+def get_client(credential, service):
+ url = URLS[credential.server] % {
+ 'country': credential.country,
+ 'service': service,
+ }
+ return Client(url, transport=Transport(operation_timeout=TIMEOUT))
+
+
+def get_request(credential, name, **kwargs):
+ return {
+ name: {
+ 'Username': credential.username,
+ 'Password': hashlib.sha512(credential.password.encode()).digest(),
+ **kwargs,
+ },
+ }
diff --git a/modules/stock_package_shipping_mygls/carrier.py b/modules/stock_package_shipping_mygls/carrier.py
new file mode 100644
index 0000000000..3b0d680cfe
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/carrier.py
@@ -0,0 +1,110 @@
+# 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 (
+ MatchMixin, ModelSQL, ModelView, fields, sequence_ordered)
+from trytond.pool import PoolMeta
+from trytond.pyson import Eval, If
+
+
+class CredentialMyGLS(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
+ "MyGLS Credential"
+ __name__ = 'carrier.credential.mygls'
+
+ company = fields.Many2One('company.company', "Company")
+ server = fields.Selection([
+ ('testing', "Testing"),
+ ('production', "Production"),
+ ], "Server", required=True)
+ country = fields.Selection([
+ ('hr', "Croatia"),
+ ('cz', "Czechia"),
+ ('hu', "Hungary"),
+ ('ro', "Romania"),
+ ('si', "Slovenia"),
+ ('sk', "Slovakia"),
+ ], "Country", required=True)
+ username = fields.Char("Username", required=True, strip=False)
+ password = fields.Char("Password", required=True, strip=False)
+ client_number = fields.Integer("Client Number", required=True)
+
+ @classmethod
+ def default_server(cls):
+ return 'testing'
+
+
+class Carrier(metaclass=PoolMeta):
+ __name__ = 'carrier'
+
+ mygls_type_of_printer = fields.Selection([
+ (None, ''),
+ ('A4_2x2', "A4 2x2"),
+ ('A4_4x1', "A4 4x1"),
+ ('Connect', "Connect"),
+ ('Thermo', "Thermo"),
+ ], "Type of Printer", sort=False, translate=False,
+ states={
+ 'invisible': Eval('shipping_service') != 'mygls',
+ })
+ mygls_print_position = fields.Integer(
+ "Print Position",
+ domain=[
+ If(Eval('mygls_type_of_printer') == 'A4_2x2',
+ ('mygls_print_position', 'in', [1, 2, 3, 4]),
+ ('mygls_print_position', '=', None)),
+ ],
+ states={
+ 'required': Eval('mygls_type_of_printer') == 'A4_2x2',
+ 'invisible': (
+ (Eval('mygls_type_of_printer') != 'A4_2x2')
+ | (Eval('shipping_service') != 'mygls')),
+ })
+ mygls_services = fields.MultiSelection([
+ ('24h', "Service guaranteed delivery shipment in 24 Hours"),
+ ('AOS', "Addressee Only Service"),
+ ('CS1', "Contact Service"),
+ ('FDS', "Flexible Delivery Service"),
+ ('FSS', "Flexible delivery Sms Service"),
+ ('PRS', "Pick & Return Services"),
+ ('PSS', "Pick & Ship Service"),
+ ('SAT', "Saturday service"),
+ ('SBS', "Stand By Service"),
+ ('SM1', "SMS service"),
+ ('SM2', "SMS pre-advice"),
+ ('T09', "Express service (T09)"),
+ ('T10', "Express service (T10)"),
+ ('T12', "Express service (T12)"),
+ ('TGS', "Think Green Service"),
+ ('XS', "Exchange Service"),
+ ], "Services",
+ states={
+ 'invisible': Eval('shipping_service') != 'mygls',
+ })
+
+ mygls_sms = fields.Char(
+ "SMS", translate=True,
+ states={
+ 'invisible': Eval('shipping_service') != 'mygls',
+ 'required': Eval('mygls_services', []).contains('SM1'),
+ },
+ help="Variables that can be used in the text of the SMS:\n"
+ "ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#")
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.shipping_service.selection.append(('mygls', "MyGLS"))
+
+ @classmethod
+ def view_attributes(cls):
+ return super(Carrier, cls).view_attributes() + [
+ ("/form/separator[@id='mygls']", 'states', {
+ 'invisible': Eval('shipping_service') != 'mygls',
+ }),
+ ]
+
+ @property
+ def shipping_label_mimetype(self):
+ mimetype = super().shipping_label_mimetype
+ if self.shipping_service == 'mygls':
+ mimetype = 'application/pdf'
+ return mimetype
diff --git a/modules/stock_package_shipping_mygls/carrier.xml b/modules/stock_package_shipping_mygls/carrier.xml
new file mode 100644
index 0000000000..10a65d292e
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/carrier.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+ carrier.credential.mygls
+ form
+ credential_form
+
+
+ carrier.credential.mygls
+ tree
+ credential_list
+
+
+
+ MyGLS Credentials
+ carrier.credential.mygls
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ carrier
+
+ carrier_form
+
+
+
diff --git a/modules/stock_package_shipping_mygls/doc/conf.py b/modules/stock_package_shipping_mygls/doc/conf.py
new file mode 100644
index 0000000000..8513b72dd2
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/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/stock_package_shipping_mygls/doc/design.rst b/modules/stock_package_shipping_mygls/doc/design.rst
new file mode 100644
index 0000000000..2d9d077007
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/doc/design.rst
@@ -0,0 +1,36 @@
+******
+Design
+******
+
+The *Stock Package Shipping MyGLS Module* introduces or extends the following
+concepts.
+
+.. _model-carrier.credential.mygls:
+
+MyGLS Credential
+================
+
+This is used to store the credentials needed to connect to the MyGLS API.
+
+.. seealso::
+
+ The credentials can be accessed from the main menu item:
+
+ |Carrier --> Configuration --> MyGLS Credentials|__
+
+ .. |Carrier --> Configuration --> MyGLS Credentials| replace:: :menuselection:`Carrier --> Configuration --> MyGLS Credentials`
+ __ https://demo.tryton.org/model/carrier.credential.mygls
+
+.. _model-carrier:
+
+Carrier
+=======
+
+When the *Stock Package Shipping MyGLS Module* is activated, carriers gain some
+extra properties.
+These include a new shipping server "MyGLS", printer configuration and services.
+
+.. seealso::
+
+ The :doc:`Carrier ` concept is introduced by the
+ :doc:`Carrier Module `.
diff --git a/modules/stock_package_shipping_mygls/doc/index.rst b/modules/stock_package_shipping_mygls/doc/index.rst
new file mode 100644
index 0000000000..0e97424206
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/doc/index.rst
@@ -0,0 +1,12 @@
+###################################
+Stock Package Shipping MyGLS Module
+###################################
+
+The *Stock Package Shipping MyGLS Module* allows package labels to be generated
+for shipments using `MyGLS `_ webservices.
+
+.. toctree::
+ :maxdepth: 2
+
+ design
+ releases
diff --git a/modules/stock_package_shipping_mygls/doc/releases.rst b/modules/stock_package_shipping_mygls/doc/releases.rst
new file mode 100644
index 0000000000..21b13c4745
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/doc/releases.rst
@@ -0,0 +1,7 @@
+.. _releases-index:
+
+=============
+Release notes
+=============
+
+.. include:: ../CHANGELOG
diff --git a/modules/stock_package_shipping_mygls/exceptions.py b/modules/stock_package_shipping_mygls/exceptions.py
new file mode 100644
index 0000000000..5da7ef4d7a
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/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 MyGLSError(UserError):
+ pass
diff --git a/modules/stock_package_shipping_mygls/locale/bg.po b/modules/stock_package_shipping_mygls/locale/bg.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/bg.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/ca.po b/modules/stock_package_shipping_mygls/locale/ca.po
new file mode 100644
index 0000000000..90ef9d49a7
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/ca.po
@@ -0,0 +1,243 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr "Posició d’impressió"
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr "Serveis"
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr "Tipus d’impressora"
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr "Número de client"
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr "País"
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr "Contrasenya"
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr "Servidor"
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr "Nom d'usuari"
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+"Variables que es poden utilitzar al text de l'SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr "Credencial MyGLS"
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr "Crear enviaments MyGLS pels paquets"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr "Credencials MyGLS"
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+"Per validar l'albarà \"%(shipment)s\", heu d'afegir un correu electrònic a "
+"l'adreça \"%(address)s\"."
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+"Per validar l'albarà \"%(shipment)s\", heu d'afegir un número de mòbil a "
+"l'adreça \"%(address)s\"."
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"La crida de l'API MyGLS ha fallat amb el següent missatge d'error:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+"Per validar l'albarà \"%(shipment)s\", heu d'afegir un número de telèfon o "
+"mòbil a l'adreça \"%(address)s\"."
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"No podeu crear una etiqueta d'enviament per l'albarà \"%(shipment)s\" perquè"
+" ja té un número de referència."
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+"Per validar l'albarà \"%(shipment)s\", heu d'establir un codi de país a "
+"l'adreça de destinació."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+"Per validar l'albarà \"%(shipment)s\", heu d'establir un codi de país a "
+"l'adreça del magatzem \"%(warehouse)s\"."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+"Per validar l'albarà \"%(shipment)s\" heu d'establir una adreça al magatzem "
+"\"%(warehouse)s\"."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr "Credencials MyGLS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr "Servei només destinatari"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr "Servei de contacte"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr "Servei d’intercanvi"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr "Servei exprés (T09)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr "Servei exprés (T10)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr "Servei exprés (T12)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr "Servei de lliurament flexible"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr "Servei SMS de lliurament flexible"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr "Serveis de recollida i devolució"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr "Servei de recollida i enviament"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr "Preavís per SMS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr "Servei SMS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr "Servei de dissabte"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr "Servei de lliurament garantit en 24 hores"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr "Servei de guàrdia"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr "Servei de pensa en verd"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr "MyGLS"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr "Croàcia"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr "Txèquia"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr "Hongria"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr "Romania"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr "Eslovàquia"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr "Eslovènia"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr "Producció"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr "Proves"
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr "Informació de les credencials"
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr "MyGLS"
diff --git a/modules/stock_package_shipping_mygls/locale/cs.po b/modules/stock_package_shipping_mygls/locale/cs.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/cs.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/de.po b/modules/stock_package_shipping_mygls/locale/de.po
new file mode 100644
index 0000000000..4edfcd0f5e
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/de.po
@@ -0,0 +1,244 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr "Druckposition"
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr "Dienstleistungen"
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr "Druckertyp"
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr "Kundennummer"
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr "Land"
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr "Passwort"
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr "Server"
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr "Benutzername"
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+"Variablen, die im Text der SMS verwendet werden können:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr "MyGLS Anmeldedaten"
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr "MyGLS Versandauftrag für Pakete erstellen"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr "MyGLS Anmeldedaten"
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+"Damit die Lieferung \"%(shipment)s\" validiert werden kann muss eine E-Mail-"
+"Adresse für Adresse \"%(address)s\" erfasst werden."
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+"Damit die Lieferung \"%(shipment)s\" validiert werden kann, muss eine "
+"Mobilnummer für die Adresse \"%(address)s\" erfasst werden."
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"Beim Aufruf der MyGLS API ist folgender Fehler aufgetreten:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+"Damit die Lieferung \"%(shipment)s\" validiert werden kann muss eine "
+"Telefonnummer oder eine Mobilnummer für die Adresse \"%(address)s\" erfasst "
+"werden."
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"Es kann kein Versandetikett für die Lieferung \"%(shipment)s\" erstellt "
+"werden, weil bereits eine Referenznummer vorhanden ist."
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+"Damit die Lieferung \"%(shipment)s\" validiert werden kann, muss ein Land "
+"auf der Empfängeradresse erfasst werden."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+"Damit die Lieferung \"%(shipment)s\" validiert werden kann, muss ein Land "
+"für Adresse des Logistikstandorts \"%(warehouse)s\" erfasst werden."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+"Damit die Lieferung \"%(shipment)s\" validiert werden kann, muss eine "
+"Adresse für den Logistikstandort \"%(warehouse)s\" erfasst werden."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr "MyGLS Anmeldedaten"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr "Zusatzleistung Eigenhändig"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr "Zusatzleistung Anruf"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr "Austausch"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr "Express (T09)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr "Express (T10)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr "Express (T12)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr "FlexDeliveryService"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr "FlexDeliverySMSService"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr "Pick&ReturnService"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr "Pick&ShipService"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr "SMS Vorankündigung"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr "Zusatzleistung SMS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr "Samstagszustellung"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr "Garantierte Zustellung innerhalb von 24 Stunden"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr "Abholung durch den Empfänger"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr "ThinkGreenService"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr "MyGLS"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr "Kroatien"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr "Tschechien"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr "Ungarn"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr "Rumänien"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr "Slowakei"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr "Slowenien"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr "Produktivumgebung"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr "Testumgebung"
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr "Benutzeranmeldeinformationen"
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr "MyGLS"
diff --git a/modules/stock_package_shipping_mygls/locale/es.po b/modules/stock_package_shipping_mygls/locale/es.po
new file mode 100644
index 0000000000..5a6d82bfef
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/es.po
@@ -0,0 +1,243 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr "Posición de impresión"
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr "Servicios"
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr "Tipo de impresora"
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr "Número de cliente"
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr "País"
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr "Contraseña"
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr "Servidor"
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr "Nombre de usuario"
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+"Variables que se pueden utilizar en el texto del SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr "Credencial MyGLS"
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr "Crear envíos MyGLS para paquetes"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr "Credenciales MyGLS"
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+"Para validar el albarán \"%(shipment)s\" debe agregar un correo electrónico "
+"a la dirección \"%(address)s\"."
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+"Para validar el albarán \"%(shipment)s\" debe agregar un número de móvil a "
+"la dirección \"%(address)s\"."
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"La llamada de la API de MyGLS ha fallado con el siguiente mensaje de error:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+"Para validar el albarán \"%(shipment)s\" debe agregar un número de teléfono "
+"o móvil la dirección \"%(address)s\"."
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"No puedes crear una etiqueta de envío para el albarán \"%(shipment)s\" "
+"porque ya tiene un número de referencia."
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+"Para validar el albarán \"%(shipment)s\" debe establecer un código de país "
+"en la dirección de destino."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+"Para validar el albarán \"%(shipment)s\" debe establecer un código de país "
+"en la dirección del almacén \"%(warehouse)s\"."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+"Para validar el albarán \"%(shipment)s\" debe establecer una dirección en el"
+" almacén \"%(warehouse)s\"."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr "Credenciales MyGLS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr "Servicio solo destinatario"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr "Servicio de contacto"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr "Servicio de intercambio"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr "Servicio exprés (T09)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr "Servicio exprés (T10)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr "Servicio exprés (T12)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr "Servicio de entrega flexible"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr "Servicio SMS de entrega flexible"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr "Servicios de recogida y devolución"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr "Servicio de recogida y envío"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr "Preaviso por SMS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr "Servicio SMS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr "Servicio de sábado"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr "Servicio de entrega garantizada en 24 horas"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr "Servicio de guardia"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr "Servicio de piensa en verde"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr "MyGLS"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr "Croacia"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr "Chequia"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr "Hungría"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr "Rumanía"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr "Eslovaquia"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr "Eslovenia"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr "Producción"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr "Pruebas"
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr "Información de las credenciales"
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr "MyGLS"
diff --git a/modules/stock_package_shipping_mygls/locale/es_419.po b/modules/stock_package_shipping_mygls/locale/es_419.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/es_419.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/et.po b/modules/stock_package_shipping_mygls/locale/et.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/et.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/fa.po b/modules/stock_package_shipping_mygls/locale/fa.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/fa.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/fi.po b/modules/stock_package_shipping_mygls/locale/fi.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/fi.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/fr.po b/modules/stock_package_shipping_mygls/locale/fr.po
new file mode 100644
index 0000000000..3939379e97
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/fr.po
@@ -0,0 +1,243 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr "Position d'impression"
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr "Services"
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr "Type d'imprimante"
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr "Numéro client"
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr "Pays"
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr "Mot de passe"
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr "Serveur"
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+"Variables utilisables dans le texte du SMS :\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr "Identifiant MyGLS"
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr "Créer la livraison MyGLS pour les emballages"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr "Identifiants MyGLS"
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+"Pour valider l'expédition « %(shipment)s », vous devez ajouter un e-mail à "
+"l'adresse « %(address)s »."
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+"Pour valider l'expédition « %(shipment)s », vous devez ajouter un numéro de "
+"téléphone mobile pour l'adresse « %(address)s »."
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"L'appel de l'API MyGLS a échoué avec le message d'erreur suivant :\n"
+"%(messages)s"
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+"Pour valider l'expédition « %(shipment)s », vous devez ajouter un numéro de "
+"téléphone ou mobile à l'adresse « %(address)s »."
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"Vous ne pouvez pas créer d'étiquette de livraison pour l'expédition "
+"« %(shipment)s » car elle a déjà un numéro de référence."
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+"Pour valider l'expédition « %(shipment)s », vous devez remplir un code pays "
+"à l'adresse de destination."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+"Pour valider l'expédition « %(shipment)s », vous devez remplir un code pays "
+"à l'adresse de l'entrepôt « %(warehouse)s »."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+"Pour validé l'expédition « %(shipment)s », vous devez définir une adresse "
+"pour l'entrepôt « %(warehouse)s »."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr "Identifiants MyGLS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr "Service au destinataire uniquement"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr "Service de contact"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr "Service d'échange"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr "Service express (T09)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr "Service express (T10)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr "Service express (T12)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr "Service de livraison flexible"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr "Service de livraison Sms flexible"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr "Services de prélèvement et de retour"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr "Service de prélèvement et d'expédition"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr "Pré-avis SMS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr "Service SMS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr "Service du samedi"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr "Service de livraison garantie expédition en 24 heures"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr "Service d'attente"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr "Service penser vert"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr "MyGLS"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr "Croatie"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr "Tchéquie"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr "Hongrie"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr "Roumanie"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr "Slovaquie"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr "Slovénie"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr "Production"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr "Essai"
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr "Informations d'identification"
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr "MyGLS"
diff --git a/modules/stock_package_shipping_mygls/locale/hu.po b/modules/stock_package_shipping_mygls/locale/hu.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/hu.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/id.po b/modules/stock_package_shipping_mygls/locale/id.po
new file mode 100644
index 0000000000..f895d195f1
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/id.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr "Produksi"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr "Testing"
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/it.po b/modules/stock_package_shipping_mygls/locale/it.po
new file mode 100644
index 0000000000..2a96044316
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/it.po
@@ -0,0 +1,227 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"Non puoi creare un'etichetta di spedizione per la spedizione "
+"\"%(shipment)s\" perché ha già un numero di riferimento."
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/lo.po b/modules/stock_package_shipping_mygls/locale/lo.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/lo.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/lt.po b/modules/stock_package_shipping_mygls/locale/lt.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/lt.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/nl.po b/modules/stock_package_shipping_mygls/locale/nl.po
new file mode 100644
index 0000000000..1031e6ade8
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/nl.po
@@ -0,0 +1,243 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr "Afdrukpositie"
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr "Diensten"
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr "Type printer"
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr "Klantnummer"
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr "Land"
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr "Wachtwoord"
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr "Server"
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+"Variabelen die gebruikt kunnen worden in de tekst van de SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr "MijnGLS-referentie"
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr "Creëer MyGLS-verzending voor pakketten"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr "MyGLS-referentie"
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+"Om zending \"%(shipment)s\" te valideren, moet u een e-mailadres toevoegen "
+"voor adres \"%(address)s\"."
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+"Om zending \"%(shipment)s\" te valideren, moet u een mobiel nummer toevoegen"
+" aan adres\"%(address)s\"."
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"Bij het aanroepen van de MyGLS API is de volgende fout opgetreden:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+"Om zending \"%(shipment)s\"\" te valideren, moet u een telefoon- of mobiel "
+"nummer toevoegen aan adres \"%(address)s\"."
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"U kunt geen verzendlabel maken voor verzending \"%(shipment)s\", omdat deze "
+"al een referentienummer heeft."
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+"Om verzending \"%(shipment)s\" te valideren, moet u een landcode instellen "
+"op het bestemmingsadres."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+"Om verzending \"%(shipment)s\" te valideren, moet u een landcode instellen "
+"op het adres van het magazijn \"%(warehouse)s\"."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+"Om zending \"%(shipment)s\" te valideren, moet u een adres voor magazijn "
+"\"%(warehouse)s\" instellen."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr "MijnGLS-referentie"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr "Service alleen voor geadresseerde"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr "Neem contact op met de dienst"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr "Wissel dienst"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr "Expresdienst (T09)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr "Expresdienst (T10)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr "Expresdienst (T12)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr "Flexibele bezorgservice"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr "Flexibele levering Sms-service"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr "Pick & Return-services"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr "Ophaal- en verzendservice"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr "SMS pre-advies"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr "SMS-dienst"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr "Zaterdagdienst"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr "Service gegarandeerde levering verzending in 24 uur"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr "Stand-by-service"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr "Milieuvriendelijke Dienst"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr "MyGLS"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr "Kroatië"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr "Tsjechië"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr "Hongarije"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr "Roemenië"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr "Slowakije"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr "Slovenië"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr "Productie"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr "Testen"
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr "Referentiegegevens"
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr "MyGLS"
diff --git a/modules/stock_package_shipping_mygls/locale/pl.po b/modules/stock_package_shipping_mygls/locale/pl.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/pl.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/pt.po b/modules/stock_package_shipping_mygls/locale/pt.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/pt.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/ro.po b/modules/stock_package_shipping_mygls/locale/ro.po
new file mode 100644
index 0000000000..0222cdc8f6
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/ro.po
@@ -0,0 +1,246 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr "Poziţia Printare"
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr "Servicii"
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr "SMS"
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr "Tip de Imprimanta"
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr "Număr Client"
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr "Companie"
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr "Țară"
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr "Parola"
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr "Server"
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr "Utilizator"
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+"Variabile care pot fi utilizate în textul SMS-ului:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr "Credenţiale MyGLS"
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr "Creare Expediere MyGLS pentru Colete"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr "Credenţiale MyGLS"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+"Pentru a valida expedierea \"%(shipment)s\" trebuie să adăugaţi o adresă de "
+"e-mail la parte \"%(party)s\"."
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+"Pentru a valida expedierea \"%(shipment)s\" trebuie adăugat un număr de "
+"telefon mobil la parte \"%(party)s\"."
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"Interogarea API MyGLS a eşuat cu următorul mesaj:\n"
+"%(message)s"
+
+#, fuzzy
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+"Pentru a valida expedierea \"%(shipment)s\"trebuie adăugat un număr de "
+"telefon mobil la parte \"%(party)s\"."
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"Nu se poate crea o eticheta pentru expedierea \"%(shipment)s\" pentru că are"
+" deja un număr de referinţa."
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+"Pentru a valida expedierea \"%(shipment)s\" trebuie sa fie setat un cod de "
+"ţara la adresă al destinatarului."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+"Pentru a valida expedierea \"%(shipment)s\" trebuie sa fie setat un cod de "
+"ţara la adresa al depozitului \"%(warehouse)s\"."
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+"Pentru a valida expedierea \"%(shipment)s\" trebuie setata o adresa la "
+"depozit \"%(warehouse)s\"."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr "Credenţiale MyGLS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr "Serviciul Exclusiv Destinatarului"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr "Serviciul Contact"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr "Serviciul de Schimb"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr "Serviciul Expres (T9)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr "Serviciul Expres (T10)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr "Serviciul Expres (T12)"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr "Serviciul Livrare Flexibila"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr "Serviciul Livrare Flexibila cu SMS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr "Serviciul Ridicare & Retur"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr "Serviciul Ridicare & Expediere"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr "Avertizare în prealabil prin SMS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr "Serviciul SMS"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr "Serviciul Sămbata"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr "Serviciul cu garanţie livrării în 24 Ore"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr "Serviciul În Aşteptare"
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr "Serviciul Gândeşte Verde"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr "MyGLS"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr "Croaţia"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr "Cehia"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr "Ungaria"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr "România"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr "Slovacia"
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr "Slovenia"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr "Producţie"
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr "Testare"
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr "Informaţii Credenţiale"
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr "MyGLS"
diff --git a/modules/stock_package_shipping_mygls/locale/ru.po b/modules/stock_package_shipping_mygls/locale/ru.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/ru.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/sl.po b/modules/stock_package_shipping_mygls/locale/sl.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/sl.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/tr.po b/modules/stock_package_shipping_mygls/locale/tr.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/tr.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/uk.po b/modules/stock_package_shipping_mygls/locale/uk.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/uk.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/locale/zh_CN.po b/modules/stock_package_shipping_mygls/locale/zh_CN.po
new file mode 100644
index 0000000000..578cf3e7b5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/locale/zh_CN.po
@@ -0,0 +1,225 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,mygls_print_position:"
+msgid "Print Position"
+msgstr ""
+
+msgctxt "field:carrier,mygls_services:"
+msgid "Services"
+msgstr ""
+
+msgctxt "field:carrier,mygls_sms:"
+msgid "SMS"
+msgstr ""
+
+msgctxt "field:carrier,mygls_type_of_printer:"
+msgid "Type of Printer"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,client_number:"
+msgid "Client Number"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,country:"
+msgid "Country"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,password:"
+msgid "Password"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,server:"
+msgid "Server"
+msgstr ""
+
+msgctxt "field:carrier.credential.mygls,username:"
+msgid "Username"
+msgstr ""
+
+msgctxt "field:stock.package,mygls_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "help:carrier,mygls_sms:"
+msgid ""
+"Variables that can be used in the text of the SMS:\n"
+"ParcelNr#, #COD#, #PickupDate#, #From_Name#, #ClientRef#"
+msgstr ""
+
+msgctxt "model:carrier.credential.mygls,name:"
+msgid "MyGLS Credential"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_mygls_wizard"
+msgid "Create MyGLS Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_email_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add an email for address "
+"\"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a mobile number for "
+"address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_mygls_api_error"
+msgid ""
+"MyGLS API call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_phone_mobile_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must add a phone or mobile number "
+"for address \"%(address)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipping_to_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"destination address."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_country_code_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set a country code to the "
+"address of warehouse \"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_warehouse_address_required"
+msgid ""
+"To validate shipment \"%(shipment)s\" you must set an address on warehouse "
+"\"%(warehouse)s\"."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "MyGLS Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Addressee Only Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Contact Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Exchange Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T09)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T10)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Express service (T12)"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible Delivery Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Flexible delivery Sms Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Return Services"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Pick & Ship Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS pre-advice"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "SMS service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Saturday service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Service guaranteed delivery shipment in 24 Hours"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Stand By Service"
+msgstr ""
+
+msgctxt "selection:carrier,mygls_services:"
+msgid "Think Green Service"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "MyGLS"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Croatia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Czechia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Hungary"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Romania"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovakia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,country:"
+msgid "Slovenia"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Production"
+msgstr ""
+
+msgctxt "selection:carrier.credential.mygls,server:"
+msgid "Testing"
+msgstr ""
+
+msgctxt "view:carrier.credential.mygls:"
+msgid "Credential Information"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "MyGLS"
+msgstr ""
diff --git a/modules/stock_package_shipping_mygls/message.xml b/modules/stock_package_shipping_mygls/message.xml
new file mode 100644
index 0000000000..dae1288fb7
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/message.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+ To validate shipment "%(shipment)s" you must set an address on warehouse "%(warehouse)s".
+
+
+ To validate shipment "%(shipment)s" you must set a country code to the address of warehouse "%(warehouse)s".
+
+
+ To validate shipment "%(shipment)s" you must set a country code to the destination address.
+
+
+ To validate shipment "%(shipment)s" you must add a phone or mobile number for address "%(address)s".
+
+
+ To validate shipment "%(shipment)s" you must add an email for address "%(address)s".
+
+
+ To validate shipment "%(shipment)s" you must add a mobile number for address "%(address)s".
+
+
+ You cannot create a shipping label for shipment "%(shipment)s" because it already has a reference number.
+
+
+ MyGLS API call failed with the following error message:
+%(message)s
+
+
+
diff --git a/modules/stock_package_shipping_mygls/setup.py b/modules/stock_package_shipping_mygls/setup.py
new file mode 100755
index 0000000000..022d45d3fa
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/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 find_packages, setup
+
+
+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_stock_package_shipping_mygls'
+
+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 = ['zeep', 'PyPDF2']
+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_sale'),
+ get_require_version('trytond_sale_shipment_cost'),
+ ]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version)
+ )
+
+setup(name=name,
+ version=version,
+ description='MyGLS connector for the Tryton application platform',
+ 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-stock-package-shipping-mygls'),
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": (
+ 'https://hg.tryton.org/modules/stock_package_shipping_mygls'),
+ },
+ keywords='tryton stock package shipping gls mygls',
+ package_dir={'trytond.modules.stock_package_shipping_mygls': '.'},
+ packages=(
+ ['trytond.modules.stock_package_shipping_mygls']
+ + ['trytond.modules.stock_package_shipping_mygls.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_package_shipping_mygls': (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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_package_shipping_mygls = trytond.modules.stock_package_shipping_mygls
+ """, # noqa: E501
+ )
diff --git a/modules/stock_package_shipping_mygls/stock.py b/modules/stock_package_shipping_mygls/stock.py
new file mode 100644
index 0000000000..2c0692bbc3
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/stock.py
@@ -0,0 +1,273 @@
+# 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 io import BytesIO
+from itertools import zip_longest
+
+from PyPDF2 import PdfFileReader, PdfFileWriter
+
+from trytond.i18n import gettext
+from trytond.model import fields
+from trytond.model.exceptions import AccessError
+from trytond.modules.stock_package_shipping.exceptions import (
+ PackingValidationError)
+from trytond.pool import Pool, PoolMeta
+from trytond.transaction import Transaction
+from trytond.wizard import StateAction, StateTransition, Wizard
+
+from .api import get_client, get_request
+from .exceptions import MyGLSError
+
+
+class Package(metaclass=PoolMeta):
+ __name__ = 'stock.package'
+
+ mygls_shipping_id = fields.Integer("ID", readonly=True)
+
+ @classmethod
+ def copy(cls, packages, default=None):
+ default = {} if default is None else default.copy()
+ default.setdefault('mygls_shipping_id')
+ return super().copy(packages, default=default)
+
+
+class ShippingMyGLSMixin:
+ __slots__ = ()
+
+ def get_mygls_credential(self):
+ pool = Pool()
+ Credential = pool.get('carrier.credential.mygls')
+
+ pattern = self._get_mygls_credential_pattern()
+ for credential in Credential.search([]):
+ if credential.match(pattern):
+ return credential
+
+ def _get_mygls_credential_pattern(self):
+ return {
+ 'company': self.company.id,
+ 'country': self.shipping_warehouse.address.country.code.lower(),
+ }
+
+ def validate_packing_mygls(self, usage=None):
+ warehouse = self.shipping_warehouse
+ if not warehouse.address:
+ raise PackingValidationError(
+ gettext('stock_package_shipping_mygls'
+ '.msg_warehouse_address_required',
+ shipment=self.rec_name,
+ warehouse=warehouse.rec_name))
+ if not warehouse.address.country or not warehouse.address.country.code:
+ raise PackingValidationError(
+ gettext('stock_package_shipping_mygls'
+ '.msg_warehouse_address_country_code_required',
+ shipment=self.rec_name,
+ warehouse=warehouse.rec_name))
+ shipping_to_address = self.shipping_to_address
+ if (not shipping_to_address.country
+ or not shipping_to_address.country.code):
+ raise PackingValidationError(
+ gettext('stock_package_shipping_mygls'
+ '.msg_shipping_to_address_country_code_required',
+ shipping=self.rec_name))
+ if (self.carrier.mygls_services
+ and 'CS1' in self.carrier.mygls_services):
+ if not shipping_to_address.contact_mechanism_get(
+ {'phone', 'mobile'}, usage=usage):
+ raise PackingValidationError(
+ gettext('stock_package_shipping_mygls'
+ '.msg_phone_mobile_required',
+ shipment=self.rec_name,
+ address=shipping_to_address.rec_name))
+ if (self.carrier.mygls_services
+ and 'FDS' in self.carrier.mygls_services):
+ if not shipping_to_address.contact_mechanism_get(
+ 'email', usage=usage):
+ raise PackingValidationError(
+ gettext('stock_package_shipping_mygls'
+ '.msg_email_required',
+ shipment=self.rec_name,
+ address=shipping_to_address.rec_name))
+ if (self.carrier.mygls_services
+ and ('FSS' in self.carrier.mygls_services
+ or 'SM1' in self.carrier.mygls_services
+ or 'SM2' in self.carrier.mygls_services)):
+ if not shipping_to_address.contact_mechanism_get(
+ 'mobile', usage=usage):
+ raise PackingValidationError(
+ gettext('stock_package_shipping_mygls'
+ '.msg_mobile_required',
+ shipment=self.rec_name,
+ address=shipping_to_address.rec_name))
+
+
+class ShipmentOut(ShippingMyGLSMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out'
+
+
+class ShipmentInReturn(ShippingMyGLSMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in.return'
+
+
+class ShipmentCreateShipping(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.create_shipping'
+
+ mygls = StateAction(
+ 'stock_package_shipping_mygls.act_create_shipping_mygls_wizard')
+
+ def transition_start(self):
+ next_state = super().transition_start()
+ if self.record.carrier.shipping_service == 'mygls':
+ next_state = 'mygls'
+ return next_state
+
+ def do_mygls(self, action):
+ ctx = Transaction().context
+ return action, {
+ 'model': ctx['active_model'],
+ 'id': ctx['active_id'],
+ 'ids': [ctx['active_id']],
+ }
+
+
+class ShipmentCreateShippingMyGLS(Wizard):
+ "Create MyGLS Shipping"
+ __name__ = 'stock.shipment.create_shipping.mygls'
+
+ start = StateTransition()
+
+ def transition_start(self):
+ pool = Pool()
+ Package = pool.get('stock.package')
+
+ shipment = self.record
+ if shipment.reference:
+ raise AccessError(
+ gettext('stock_package_shipping_mygls'
+ '.msg_shipment_has_reference_number',
+ shipment=shipment.rec_name))
+
+ credential = shipment.get_mygls_credential()
+ client = get_client(credential, 'ParcelService')
+ carrier = shipment.carrier
+ packages = shipment.root_packages
+
+ parcel = self.get_parcel(shipment, packages, credential)
+
+ response = client.service.PrintLabels(**get_request(
+ credential, 'printLabelsRequest',
+ ParcelList=[{'Parcel': parcel}],
+ TypeOfPrinter=carrier.mygls_type_of_printer,
+ PrintPosition=carrier.mygls_print_position))
+
+ if response.PrintLabelsErrorList:
+ message = "\n".join(
+ e.ErrorDescription
+ for e in response.PrintLabelsErrorList.ErrorInfo)
+ raise MyGLSError(
+ gettext('stock_package_shipping_mygls.msg_mygls_api_error',
+ message=message))
+
+ labels = []
+ reader = PdfFileReader(BytesIO(response.Labels))
+ for i in range(reader.getNumPages()):
+ pdf = PdfFileWriter()
+ label = BytesIO()
+ pdf.addPage(reader.getPage(i))
+ pdf.write(label)
+ if carrier.mygls_type_of_printer in {'A4_2x2', 'A4_4x1'}:
+ if carrier.mygls_type_of_printer == 'A4_2x2':
+ gap = carrier.mygls_print_position - 1
+ else:
+ gap = 0
+ max_label = ((i + 1) * 4) - gap
+ n = 4
+ if i == 0:
+ n -= gap
+ if max_label > len(packages):
+ n -= max_label - len(packages)
+ labels.extend([label] * n)
+ else:
+ labels.append(label)
+ labels_info = response.PrintLabelsInfoList.PrintLabelsInfo
+
+ for package, label, info in zip_longest(
+ packages, labels, labels_info):
+ package.mygls_shipping_id = info.ParcelId
+ package.shipping_label = fields.Binary.cast(label.getvalue())
+ package.shipping_label_mimetype = carrier.shipping_label_mimetype
+ package.shipping_reference = info.ParcelNumber
+ if not shipment.reference:
+ shipment.reference = info.ParcelNumber
+ Package.save(packages)
+ shipment.save()
+
+ return 'end'
+
+ def get_parcel(self, shipment, packages, credential):
+ services = []
+ if shipment.carrier.mygls_services:
+ for code in shipment.carrier.mygls_services:
+ services.append({'Service': self.get_service(code, shipment)})
+ return {
+ 'ClientNumber': credential.client_number,
+ 'ClientReference': shipment.number,
+ 'Count': len(packages),
+ 'Content': shipment.shipping_description,
+ 'PickupAddress': self.get_address(
+ shipment.company.party,
+ shipment.shipping_warehouse.address),
+ 'DeliveryAddress': self.get_address(
+ shipment.shipping_to,
+ shipment.shipping_to_address),
+ 'ServiceList': services,
+ }
+
+ def get_address(self, party, address, usage=None):
+ phone = address.contact_mechanism_get({'phone', 'mobile'}, usage=usage)
+ email = address.contact_mechanism_get('email', usage=usage)
+ return {
+ 'Name': address.party_full_name,
+ 'Street': ' '.join((address.street or '').splitlines()),
+ 'City': address.city,
+ 'ZipCode': address.postal_code,
+ 'CountryIsoCode': address.country.code,
+ 'ContactName': party.full_name,
+ 'ContactPhone': phone.value if phone else None,
+ 'ContactEmail': email.value if email else None,
+ }
+
+ def get_service(self, code, shipment, usage=None):
+ pool = Pool()
+ Carrier = pool.get('carrier')
+ service = {'Code': code}
+ shipping_to_address = shipment.shipping_to_address
+ if code == 'AOS':
+ service['AOSParameter'] = shipment.shipping_to.full_name,
+ elif code == 'CS1':
+ phone = shipping_to_address.contact_mechanism_get(
+ {'phone', 'mobile'}, usage=usage)
+ service['CS1Parameter'] = phone.value
+ elif code == 'FDS':
+ email = shipping_to_address.contact_mechanism_get(
+ 'email', usage=usage)
+ service['FDSParameter'] = email.value
+ elif code == 'FSS':
+ mobile = shipping_to_address.contact_mechanism_get(
+ 'mobile', usage=usage)
+ service['FSSParameter'] = mobile.value
+ elif code == 'SM1':
+ if shipment.shipping_to.lang:
+ lang_code = shipment.shipping_to.lang.code
+ else:
+ lang_code = None
+ with Transaction().set_context(language=lang_code):
+ carrier = Carrier(shipment.carrier.id)
+ mobile = shipping_to_address.contact_mechanism_get(
+ 'mobile', usage=usage)
+ service['SM1Parameter'] = '|'.join([
+ mobile.value, carrier.mygls_sms])
+ elif code == 'SM2':
+ mobile = shipping_to_address.contact_mechanism_get(
+ 'mobile', usage=usage)
+ service['SM1Parameter'] = mobile.value
+ return service
diff --git a/modules/stock_package_shipping_mygls/stock.xml b/modules/stock_package_shipping_mygls/stock.xml
new file mode 100644
index 0000000000..2328b92839
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/stock.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+ Create MyGLS Shipping for Packages
+ stock.shipment.create_shipping.mygls
+
+
+
diff --git a/modules/stock_package_shipping_mygls/tests/__init__.py b/modules/stock_package_shipping_mygls/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_package_shipping_mygls/tests/scenario_stock_package_shipping_mygls.rst b/modules/stock_package_shipping_mygls/tests/scenario_stock_package_shipping_mygls.rst
new file mode 100644
index 0000000000..7c64c25e3a
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/tests/scenario_stock_package_shipping_mygls.rst
@@ -0,0 +1,206 @@
+=====================================
+Stock Package Shipping MyGLS Scenario
+=====================================
+
+Imports::
+
+ >>> import os
+ >>> 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 modules::
+
+ >>> config = activate_modules(
+ ... ['stock_package_shipping_mygls', 'sale', 'sale_shipment_cost'])
+
+ >>> Address = Model.get('party.address')
+ >>> Carrier = Model.get('carrier')
+ >>> CarrierSelection = Model.get('carrier.selection')
+ >>> Country = Model.get('country.country')
+ >>> Credential = Model.get('carrier.credential.mygls')
+ >>> Inventory = Model.get('stock.inventory')
+ >>> Location = Model.get('stock.location')
+ >>> Party = Model.get('party.party')
+ >>> ProductCategory = Model.get('product.category')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> ProductUom = Model.get('product.uom')
+ >>> Sale = Model.get('sale.sale')
+
+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 countries::
+
+ >>> hungary= Country(code='HU', name="Hungary")
+ >>> hungary.save()
+
+Create parties::
+
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+ >>> customer_address = customer.addresses.new()
+ >>> customer_address.street = "Európa u., 2"
+ >>> customer_address.postal_code = "2351"
+ >>> customer_address.city = "Alsónémedi"
+ >>> customer_address.country = hungary
+ >>> customer_address.save()
+ >>> customer_phone = customer.contact_mechanisms.new()
+ >>> customer_phone.type = 'phone'
+ >>> customer_phone.value = "+36701234567"
+ >>> customer_phone.save()
+
+Set the warehouse address::
+
+ >>> warehouse, = Location.find([('type', '=', 'warehouse')])
+ >>> company_address = Address()
+ >>> company_address.party = company.party
+ >>> company_address.street = "Európa u., 2"
+ >>> company_address.postal_code = "2351"
+ >>> company_address.city = "Alsónémedi"
+ >>> company_address.country = hungary
+ >>> company_address.save()
+ >>> company_phone = company.party.contact_mechanisms.new()
+ >>> company_phone.type = 'phone'
+ >>> company_phone.value = "+36701234567"
+ >>> company_phone.save()
+ >>> warehouse.address = company_address
+ >>> warehouse.save()
+
+Create account 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 product::
+
+ >>> unit, = ProductUom.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.salable = True
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+Create an Inventory::
+
+ >>> storage, = Location.find([
+ ... ('code', '=', 'STO'),
+ ... ])
+ >>> inventory = Inventory()
+ >>> inventory.location = storage
+ >>> inventory_line = inventory.lines.new(product=product)
+ >>> inventory_line.quantity = 100.0
+ >>> inventory_line.expected_quantity = 0.0
+ >>> inventory.click('confirm')
+ >>> inventory.state
+ 'done'
+
+Create Package Type::
+
+ >>> PackageType = Model.get('stock.package.type')
+ >>> box = PackageType(name='Box')
+ >>> box.save()
+
+Create a MyGLS carrier::
+
+ >>> credential = Credential()
+ >>> credential.company = company
+ >>> credential.server = 'testing'
+ >>> credential.country = 'hu'
+ >>> credential.username = os.getenv('MYGLS_USERNAME')
+ >>> credential.password = os.getenv('MYGLS_PASSWORD')
+ >>> credential.client_number = int(os.getenv('MYGLS_CLIENT_NUMBER'))
+ >>> credential.save()
+
+ >>> template = ProductTemplate()
+ >>> template.name = "GLS"
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.salable = True
+ >>> template.list_price = Decimal(20)
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> carrier_product, = template.products
+
+ >>> gls = Party(name="GLS")
+ >>> gls.save()
+
+ >>> carrier = Carrier()
+ >>> carrier.party = gls
+ >>> carrier.carrier_product = carrier_product
+ >>> carrier.shipping_service = 'mygls'
+ >>> carrier.mygls_type_of_printer = 'A4_2x2'
+ >>> carrier.mygls_print_position = 3
+ >>> carrier.mygls_services = ['CS1', 'TGS']
+ >>> carrier.save()
+
+Create a sale and thus a shipment::
+
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.shipment_address = customer_address
+ >>> sale.invoice_method = 'order'
+ >>> sale.carrier = carrier
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = product
+ >>> sale_line.quantity = 1.0
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = product
+ >>> sale_line.quantity = 1.0
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.click('process')
+
+Create the packages and ship the shipment::
+
+ >>> shipment, = sale.shipments
+ >>> shipment.click('assign_force')
+ >>> shipment.click('pick')
+ >>> pack = shipment.packages.new(type=box)
+ >>> pack_moves = pack.moves.find([])
+ >>> pack.moves.append(pack_moves[0])
+ >>> pack = shipment.packages.new(type=box)
+ >>> pack.moves.append(pack_moves[1])
+ >>> shipment.click('pack')
+
+ >>> create_shipping = Wizard('stock.shipment.create_shipping', [shipment])
+ >>> shipment.reload()
+ >>> bool(shipment.reference)
+ True
+ >>> pack, _ = shipment.root_packages
+ >>> pack.shipping_label is not None
+ True
+ >>> pack.shipping_label_mimetype
+ 'application/pdf'
+ >>> pack.mygls_shipping_id is not None
+ True
+ >>> bool(pack.shipping_reference)
+ True
diff --git a/modules/stock_package_shipping_mygls/tests/test_module.py b/modules/stock_package_shipping_mygls/tests/test_module.py
new file mode 100644
index 0000000000..9791bdea82
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/tests/test_module.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.tests.test_tryton import ModuleTestCase
+
+
+class StockPackageShippingMyglsTestCase(ModuleTestCase):
+ 'Test Stock Package Shipping Mygls module'
+ module = 'stock_package_shipping_mygls'
+
+
+del ModuleTestCase
diff --git a/modules/stock_package_shipping_mygls/tests/test_scenario.py b/modules/stock_package_shipping_mygls/tests/test_scenario.py
new file mode 100644
index 0000000000..31fa2fd652
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/tests/test_scenario.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.
+
+import os
+
+from trytond.tests.test_tryton import load_doc_tests
+
+if (os.getenv('MYGLS_USERNAME')
+ and os.getenv('MYGLS_PASSWORD')
+ and os.getenv('MYGLS_CLIENT_NUMBER')):
+ def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock_package_shipping_mygls/tox.ini b/modules/stock_package_shipping_mygls/tox.ini
new file mode 100644
index 0000000000..44a40ee2bc
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_package_shipping_mygls/* -m unittest discover -s tests
+ coverage report --include=./**/stock_package_shipping_mygls/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_package_shipping_mygls/tryton.cfg b/modules/stock_package_shipping_mygls/tryton.cfg
new file mode 100644
index 0000000000..a9e3aaa951
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/tryton.cfg
@@ -0,0 +1,12 @@
+[tryton]
+version=6.7.0
+depends:
+ carrier
+ ir
+ stock
+ stock_package
+ stock_package_shipping
+xml:
+ carrier.xml
+ stock.xml
+ message.xml
diff --git a/modules/stock_package_shipping_mygls/view/carrier_form.xml b/modules/stock_package_shipping_mygls/view/carrier_form.xml
new file mode 100644
index 0000000000..ed91d9f8e8
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/view/carrier_form.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping_mygls/view/credential_form.xml b/modules/stock_package_shipping_mygls/view/credential_form.xml
new file mode 100644
index 0000000000..10fd3196a5
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/view/credential_form.xml
@@ -0,0 +1,24 @@
+
+
+
diff --git a/modules/stock_package_shipping_mygls/view/credential_list.xml b/modules/stock_package_shipping_mygls/view/credential_list.xml
new file mode 100644
index 0000000000..3c3d77a449
--- /dev/null
+++ b/modules/stock_package_shipping_mygls/view/credential_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping_sendcloud/.drone.yml b/modules/stock_package_shipping_sendcloud/.drone.yml
new file mode 100644
index 0000000000..20bb6fbdf9
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/.drone.yml
@@ -0,0 +1,79 @@
+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 SENDCLOUD_PUBLIC_KEY SENDCLOUD_SECRET_KEY
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ secrets: [ sendcloud_public_key, sendcloud_secret_key ]
+ 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/*
+ volumes:
+ - cache:/root/.cache
+ check_doc:
+ image: ${IMAGE}
+ commands:
+ - pip install sphinx
+ - python -m sphinx -T -E -W -n -b html doc _build/html
+ - python -m sphinx -T -E -W -n -b linkcheck doc _build
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_package_shipping_sendcloud/.flake8 b/modules/stock_package_shipping_sendcloud/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_package_shipping_sendcloud/.isort.cfg b/modules/stock_package_shipping_sendcloud/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_package_shipping_sendcloud/CHANGELOG b/modules/stock_package_shipping_sendcloud/CHANGELOG
new file mode 100644
index 0000000000..13acbbdca3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/CHANGELOG
@@ -0,0 +1,14 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Use contact mechanism from address
+
+Version 6.4.0 - 2022-05-02
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-01
+--------------------------
+* Initial release
diff --git a/modules/stock_package_shipping_sendcloud/COPYRIGHT b/modules/stock_package_shipping_sendcloud/COPYRIGHT
new file mode 100644
index 0000000000..852c531661
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2021-2022 B2CK
+Copyright (C) 2021-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/stock_package_shipping_sendcloud/LICENSE b/modules/stock_package_shipping_sendcloud/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/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/stock_package_shipping_sendcloud/MANIFEST.in b/modules/stock_package_shipping_sendcloud/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_package_shipping_sendcloud/README.rst b/modules/stock_package_shipping_sendcloud/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_package_shipping_sendcloud/__init__.py b/modules/stock_package_shipping_sendcloud/__init__.py
new file mode 100644
index 0000000000..e65de2745d
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/__init__.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 Pool
+
+from . import carrier, stock
+
+__all__ = ['register']
+
+
+def register():
+ Pool.register(
+ carrier.CredentialSendcloud,
+ carrier.SendcloudAddress,
+ carrier.SendcloudShippingMethod,
+ carrier.Carrier,
+ stock.Package,
+ stock.ShipmentOut,
+ stock.ShipmentInReturn,
+ module='stock_package_shipping_sendcloud', type_='model')
+ Pool.register(
+ stock.CreateShipping,
+ stock.CreateShippingSendcloud,
+ module='stock_package_shipping_sendcloud', type_='wizard')
+ Pool.register(
+ module='stock_package_shipping_sendcloud', type_='report')
diff --git a/modules/stock_package_shipping_sendcloud/carrier.py b/modules/stock_package_shipping_sendcloud/carrier.py
new file mode 100644
index 0000000000..8ceac6295e
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/carrier.py
@@ -0,0 +1,277 @@
+# 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 time
+from functools import wraps
+
+try:
+ from http import HTTPStatus
+except ImportError:
+ from http import client as HTTPStatus
+
+import requests
+
+from trytond.cache import Cache
+from trytond.config import config
+from trytond.i18n import gettext
+from trytond.model import (
+ MatchMixin, ModelSQL, ModelView, fields, sequence_ordered)
+from trytond.pool import PoolMeta
+from trytond.pyson import Eval
+
+from .exceptions import SendcloudError
+
+SENDCLOUD_API_URL = 'https://panel.sendcloud.sc/api/v2/'
+TIMEOUT = config.getfloat(
+ 'stock_package_shipping_sendcloud', 'requests_timeout', default=300)
+
+
+def sendcloud_api(func):
+ @wraps(func)
+ def wrapper(*args, **kwargs):
+ nb_tries, error_message = 0, ''
+ try:
+ while nb_tries < 5:
+ try:
+ return func(*args, **kwargs)
+ except requests.HTTPError as e:
+ if e.response.status_code == HTTPStatus.TOO_MANY_REQUESTS:
+ error_message = e.args[0]
+ nb_tries += 1
+ time.sleep(1)
+ raise
+ except requests.HTTPError as e:
+ error_message = e.args[0]
+ raise SendcloudError(
+ gettext('stock_package_shipping_sendcloud'
+ '.msg_sendcloud_webserver_error',
+ message=error_message))
+ return wrapper
+
+
+class CredentialSendcloud(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
+ "Sendcloud Credential"
+ __name__ = 'carrier.credential.sendcloud'
+
+ company = fields.Many2One('company.company', "Company")
+ public_key = fields.Char("Public Key", required=True, strip=False)
+ secret_key = fields.Char("Secret Key", required=True, strip=False)
+
+ addresses = fields.One2Many(
+ 'carrier.sendcloud.address', 'sendcloud', "Addresses",
+ states={
+ 'readonly': ~Eval('id') | (Eval('id', -1) < 0),
+ })
+ shipping_methods = fields.One2Many(
+ 'carrier.sendcloud.shipping_method', 'sendcloud', "Methods",
+ states={
+ 'readonly': ~Eval('id') | (Eval('id', -1) < 0),
+ })
+
+ _addresses_sender_cache = Cache(
+ 'carrier.credential.sendcloud.addresses_sender',
+ duration=config.getint(
+ 'stock_package_shipping_sendcloud', 'addresses_cache',
+ default=15 * 60),
+ context=False)
+ _shiping_methods_cache = Cache(
+ 'carrier.credential.sendcloud.shipping_methods',
+ duration=config.getint(
+ 'stock_package_shipping_sendcloud', 'shipping_methods_cache',
+ default=60 * 60))
+
+ @property
+ def auth(self):
+ return self.public_key, self.secret_key
+
+ @property
+ @sendcloud_api
+ def addresses_sender(self):
+ addresses = self._addresses_sender_cache.get(self.id)
+ if addresses is not None:
+ return addresses
+ response = requests.get(
+ SENDCLOUD_API_URL + 'user/addresses/sender',
+ auth=self.auth, timeout=TIMEOUT)
+ response.raise_for_status()
+ addresses = response.json()['sender_addresses']
+ self._addresses_sender_cache.set(self.id, addresses)
+ return addresses
+
+ def get_sender_address(self, shipment):
+ pattern = self._get_sender_address_pattern(shipment)
+ for address in self.addresses:
+ if address.match(pattern):
+ return int(address.address) if address.address else None
+
+ @classmethod
+ def _get_sender_address_pattern(cls, shipment):
+ return {
+ 'warehouse': shipment.shipping_warehouse.id,
+ }
+
+ @sendcloud_api
+ def get_shipping_methods(
+ self, sender_address=None, service_point=None, is_return=False):
+ key = (self.id, sender_address, service_point, is_return)
+ methods = self._shiping_methods_cache.get(key)
+ if methods is not None:
+ return methods
+ params = {}
+ if sender_address:
+ params['sender_address'] = sender_address
+ if service_point:
+ params['service_point'] = service_point
+ if is_return:
+ params['is_return'] = is_return
+ response = requests.get(
+ SENDCLOUD_API_URL + 'shipping_methods', params=params,
+ auth=self.auth, timeout=TIMEOUT)
+ response.raise_for_status()
+ methods = response.json()['shipping_methods']
+ self._shiping_methods_cache.set(key, methods)
+ return methods
+
+ def get_shipping_method(self, shipment):
+ pattern = self._get_shipping_method_pattern(shipment)
+ for method in self.shipping_methods:
+ if method.match(pattern):
+ if method.shipping_method:
+ return int(method.shipping_method)
+ else:
+ return None
+
+ @classmethod
+ def _get_shipping_method_pattern(cls, shipment):
+ return {
+ 'carrier': shipment.carrier.id if shipment.carrier else None,
+ }
+
+ @sendcloud_api
+ def get_parcel(self, id):
+ response = requests.get(
+ SENDCLOUD_API_URL + 'parcels/%s' % id,
+ auth=self.auth, timeout=TIMEOUT)
+ response.raise_for_status()
+ return response.json()['parcel']
+
+ @sendcloud_api
+ def create_parcels(self, parcels):
+ response = requests.post(
+ SENDCLOUD_API_URL + 'parcels', json={'parcels': parcels},
+ auth=self.auth, timeout=TIMEOUT)
+ if response.status_code == 400:
+ msg = response.json()['error']['message']
+ raise requests.HTTPError(msg, response=response)
+ response.raise_for_status()
+ return response.json()['parcels']
+
+ @sendcloud_api
+ def get_label(self, url):
+ response = requests.get(url, auth=self.auth, timeout=TIMEOUT)
+ response.raise_for_status()
+ return response.content
+
+
+class SendcloudAddress(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
+ "Sendcloud Address"
+ __name__ = 'carrier.sendcloud.address'
+
+ sendcloud = fields.Many2One(
+ 'carrier.credential.sendcloud', "Sendcloud", required=True)
+ warehouse = fields.Many2One(
+ 'stock.location', "Warehouse",
+ domain=[
+ ('type', '=', 'warehouse'),
+ ])
+ address = fields.Selection(
+ 'get_addresses', "Address",
+ help="Leave empty for the Sendcloud default.")
+
+ @fields.depends('sendcloud', '_parent_sendcloud.id')
+ def get_addresses(self):
+ addresses = [('', "")]
+ if (self.sendcloud
+ and self.sendcloud.id is not None
+ and self.sendcloud.id >= 0):
+ for address in self.sendcloud.addresses_sender:
+ addresses.append(
+ (str(address['id']), self._format_address(address)))
+ return addresses
+
+ @classmethod
+ def _format_address(cls, address):
+ return ', '.join(
+ filter(None, [
+ address.get('company_name'),
+ address.get('street'),
+ address.get('house_number'),
+ address.get('postal_code'),
+ address.get('city'),
+ address.get('country')]))
+
+
+class SendcloudShippingMethod(
+ sequence_ordered(), ModelSQL, ModelView, MatchMixin):
+ "Sendcloud Shipping Method"
+ __name__ = 'carrier.sendcloud.shipping_method'
+
+ sendcloud = fields.Many2One(
+ 'carrier.credential.sendcloud', "Sendcloud", required=True)
+ carrier = fields.Many2One(
+ 'carrier', "Carrier",
+ domain=[
+ ('shipping_service', '=', 'sendcloud'),
+ ])
+ shipping_method = fields.Selection(
+ 'get_shipping_methods', "Shipping Method")
+
+ @fields.depends('sendcloud', '_parent_sendcloud.id')
+ def get_shipping_methods(self):
+ methods = [(None, '')]
+ if (self.sendcloud
+ and self.sendcloud.id is not None
+ and self.sendcloud.id >= 0):
+ methods += [
+ (str(m['id']), m['name'])
+ for m in self.sendcloud.get_shipping_methods()]
+ return methods
+
+
+class Carrier(metaclass=PoolMeta):
+ __name__ = 'carrier'
+
+ sendcloud_format = fields.Selection([
+ ('normal 0', "A4 - Top left"),
+ ('normal 1', "A4 - Top right"),
+ ('normal 2', "A4 - Bottom left"),
+ ('normal 3', "A4 - Bottom right"),
+ ('label', "A6 - Full page"),
+ ], "Format",
+ states={
+ 'invisible': Eval('shipping_service') != 'sendcloud',
+ 'required': Eval('shipping_service') == 'sendcloud',
+ })
+
+ @classmethod
+ def __setup__(cls):
+ super().__setup__()
+ cls.shipping_service.selection.append(('sendcloud', "Sendcloud"))
+
+ @classmethod
+ def default_sendcloud_format(cls):
+ return 'label'
+
+ @classmethod
+ def view_attributes(cls):
+ return super(Carrier, cls).view_attributes() + [
+ ("/form/separator[@id='sendcloud']", 'states', {
+ 'invisible': Eval('shipping_service') != 'sendcloud',
+ }),
+ ]
+
+ @property
+ def shipping_label_mimetype(self):
+ mimetype = super().shipping_label_mimetype
+ if self.shipping_service == 'sendcloud':
+ mimetype = 'application/pdf'
+ return mimetype
diff --git a/modules/stock_package_shipping_sendcloud/carrier.xml b/modules/stock_package_shipping_sendcloud/carrier.xml
new file mode 100644
index 0000000000..e34e4c18c7
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/carrier.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+ carrier.credential.sendcloud
+ form
+ credential_form
+
+
+ carrier.credential.sendcloud
+ tree
+ credential_list
+
+
+
+ Sendcloud Credentials
+ carrier.credential.sendcloud
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ carrier.sendcloud.address
+ form
+ carrier_address_form
+
+
+ carrier.sendcloud.address
+ tree
+ carrier_address_list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ carrier.sendcloud.shipping_method
+ form
+ carrier_shipping_method_form
+
+
+ carrier.sendcloud.shipping_method
+ tree
+ carrier_shipping_method_list
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ carrier
+
+ carrier_form
+
+
+
diff --git a/modules/stock_package_shipping_sendcloud/doc/conf.py b/modules/stock_package_shipping_sendcloud/doc/conf.py
new file mode 100644
index 0000000000..8513b72dd2
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/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/stock_package_shipping_sendcloud/doc/configuration.rst b/modules/stock_package_shipping_sendcloud/doc/configuration.rst
new file mode 100644
index 0000000000..84e874d2cd
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/doc/configuration.rst
@@ -0,0 +1,37 @@
+*************
+Configuration
+*************
+
+The *Stock Package Shipping Sendcloud Module* uses values from settings in the
+``[stock_package_shipping_sendcloud]`` section of the :doc:`configuration file
+`.
+
+.. _config-stock_package_shipping_sendcloud.addresses_cache:
+
+``addresses_cache``
+===================
+
+The ``addresses_cache`` defines the duration in seconds the sender addresses
+are kept in the cache.
+
+The default value is: ``15 * 60``.
+
+.. _config-stock_package_shipping_sendcloud.shipping_methods_cache:
+
+``shipping_methods_cache``
+==========================
+
+The ``shipping_methods_cache`` defines the duration in seconds the shipping
+methods are kept in the cache.
+
+The default value is: ``60 * 60``.
+
+.. _config-stock_package_shipping_sendcloud.requests_timeout:
+
+``requests_timeout``
+====================
+
+The ``requests_timeout`` defines the time in seconds the module is waiting for
+a response from the Sendcloud server.
+
+The default value is: ``300``.
diff --git a/modules/stock_package_shipping_sendcloud/doc/design.rst b/modules/stock_package_shipping_sendcloud/doc/design.rst
new file mode 100644
index 0000000000..f95e3e346e
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/doc/design.rst
@@ -0,0 +1,41 @@
+******
+Design
+******
+
+The *Stock Package Shipping Sendcloud Module* introduces the following concepts:
+
+.. _model-carrier.credential.sendcloud:
+
+Sendcloud Credential
+====================
+
+This is used to store the credentials needed to connect to the Sendcloud API.
+It also defines the sender address for each warehouse and the shipping method
+for each carrier.
+
+.. note::
+
+ For carriers without a shipping method, the Sendcloud rules are applied.
+
+.. seealso::
+
+ The credentials can be accessed from the main menu item:
+
+ |Carrier --> Configuration --> Sendcloud Credentials|__
+
+ .. |Carrier --> Configuration --> Sendcloud Credentials| replace:: :menuselection:`Carrier --> Configuration --> Sendcloud Credentials`
+ __ https://demo.tryton.org/model/carrier.credential.sendcloud
+
+.. _model-carrier:
+
+Carrier
+=======
+
+When the *Stock Package Shipping Sendcloud Module* is activated, carriers gain
+some extra properties.
+These include a new shipping service "Sendcloud" and a label format.
+
+.. seealso::
+
+ The :doc:`Carrier ` concept is introduced by the
+ :doc:`Carrier Module `.
diff --git a/modules/stock_package_shipping_sendcloud/doc/index.rst b/modules/stock_package_shipping_sendcloud/doc/index.rst
new file mode 100644
index 0000000000..61f85951ed
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/doc/index.rst
@@ -0,0 +1,14 @@
+#######################################
+Stock Package Shipping Sendcloud Module
+#######################################
+
+The *Stock Package Shipping Sendcloud Module* allows package labels to be
+generated for shipments made by any of `Sendcloud's
+`_ supported carriers.
+
+.. toctree::
+ :maxdepth: 2
+
+ configuration
+ design
+ releases
diff --git a/modules/stock_package_shipping_sendcloud/doc/releases.rst b/modules/stock_package_shipping_sendcloud/doc/releases.rst
new file mode 100644
index 0000000000..21b13c4745
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/doc/releases.rst
@@ -0,0 +1,7 @@
+.. _releases-index:
+
+=============
+Release notes
+=============
+
+.. include:: ../CHANGELOG
diff --git a/modules/stock_package_shipping_sendcloud/exceptions.py b/modules/stock_package_shipping_sendcloud/exceptions.py
new file mode 100644
index 0000000000..718b43637b
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/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 SendcloudError(UserError):
+ pass
diff --git a/modules/stock_package_shipping_sendcloud/locale/bg.po b/modules/stock_package_shipping_sendcloud/locale/bg.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/bg.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/ca.po b/modules/stock_package_shipping_sendcloud/locale/ca.po
new file mode 100644
index 0000000000..1a5ea86d66
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/ca.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr "Format"
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr "Adreces"
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr "Clau pública"
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr "Clau secreta"
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr "Mètodes"
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr "Adreça"
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr "Magatzem"
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr "Transportista"
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr "Mètode d'enviament"
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr "URL de seguiment"
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr "Deixar buit per al valor per defecte de Sendcloud."
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr "Credencial Sendcloud"
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr "Adreça Sendcloud"
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr "Mètode d'enviament Sendcloud"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr "Crear enviament Sendcloud pels paquets"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Credencials Sendcloud"
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"La trucada del servei web Sendcloud ha fallat amb el següent missatge d'error:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"No podeu crear una etiqueta d'enviament per l'albarà \"%(shipment)s\" perquè"
+" ja té un número de referència."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Credencials Sendcloud"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr "A4 - A baix a l'esquerra"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr "A4 - A baix a la dreta"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr "A4 - A dalt a l'esquerra"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr "A4 - A dalt a la dreta"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr "A6 - Pàgina completa"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
diff --git a/modules/stock_package_shipping_sendcloud/locale/cs.po b/modules/stock_package_shipping_sendcloud/locale/cs.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/cs.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/de.po b/modules/stock_package_shipping_sendcloud/locale/de.po
new file mode 100644
index 0000000000..dd9dc530a5
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/de.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr "Format"
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr "Adressen"
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr "Unternehmen"
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr "Öffentlicher Schlüssel"
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr "Geheimer Schlüssel"
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr "Methoden"
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr "Adresse"
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr "Logistikstandort"
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr "Versanddienstleister"
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr "Versandart"
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr "Tracking-URL"
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr "Leer lassen für Sendcloud Standard."
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr "Sendcloud Anmeldedaten"
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr "Sendcloud Adresse"
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr "Sendcloud Versandart"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr "Sendcloud Versandauftrag für Pakete erstellen"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Sendcloud Anmeldedaten"
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"Beim Aufruf des Sendcloud Webservice ist folgender Fehler aufgetreten:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"Es kann kein Versandetikett für die Lieferung \"%(shipment)s\" erstellt "
+"werden, weil bereits eine Referenznummer vorhanden ist."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Sendcloud Anmeldedaten"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr "A4 - Unten links"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr "A4 - Unten rechts"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr "A4 - Oben links"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr "A4 - Oben rechts"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr "A6 - Ganze Seite"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
diff --git a/modules/stock_package_shipping_sendcloud/locale/es.po b/modules/stock_package_shipping_sendcloud/locale/es.po
new file mode 100644
index 0000000000..217a78c4ae
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/es.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr "Formato"
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr "Direcciones"
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr "Empresa"
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr "Clave pública"
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr "Clave secreta"
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr "Métodos"
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr "Dirección"
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr "Almacén"
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr "Transportista"
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr "Método de envío"
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr "URL Seguimiento"
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr "Dejar vacío para el valor por defecto de Sendcloud."
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr "Credencial Sendcloud"
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr "Dirección Sendcloud"
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr "Método de envío Sendcloud"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr "Crear envío Sendcloud para paquetes"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Credenciales Sendcloud"
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"La llamada al servicio web de Sendcloud ha fallado con el siguiente mensaje de error:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"No puedes crear una etiqueta de envío para el albarán \"%(shipment)s\" "
+"porque ya tiene un número de referencia."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Credenciales Sendcloud"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr "A4 - Abajo a la izquierda"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr "A4 - Abajo a la derecha"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr "A4 - Arriba a la izquierda"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr "A4 - Arriba a la derecha"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr "A6 - Página completa"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
diff --git a/modules/stock_package_shipping_sendcloud/locale/es_419.po b/modules/stock_package_shipping_sendcloud/locale/es_419.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/es_419.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/et.po b/modules/stock_package_shipping_sendcloud/locale/et.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/et.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/fa.po b/modules/stock_package_shipping_sendcloud/locale/fa.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/fa.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/fi.po b/modules/stock_package_shipping_sendcloud/locale/fi.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/fi.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/fr.po b/modules/stock_package_shipping_sendcloud/locale/fr.po
new file mode 100644
index 0000000000..ad3bf36ce6
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/fr.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr "Format"
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr "Adresses"
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr "Société"
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr "Clé publique"
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr "Clé secrète"
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr "Méthodes"
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr "Adresse"
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr "Entrepôt"
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr "Transporteur"
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr "Méthode d'expédition"
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr "URL de suivi"
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr "Laissez vide pour la valeur par défaut de Sendcloud."
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr "Identifiant Sendcloud"
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr "Adresse Sendcloud"
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr "Méthode de livraison Sendcloud"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr "Créer la livraison Sendcloud pour les emballages"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Identifiants Sendcloud"
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"L'appel au service web de Sendcloud a échoué avec le message d'erreur suivant :\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"Vous ne pouvez pas créer d'étiquette de livraison pour l'expédition "
+"« %(shipment)s » car elle a déjà un numéro de référence."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Identifiants Sendcloud"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr "A4 - En bas à gauche"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr "A4 - En bas à droite"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr "A4 - En haut à gauche"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr "A4 - En haut à droite"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr "A6 - Pleine page"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
diff --git a/modules/stock_package_shipping_sendcloud/locale/hu.po b/modules/stock_package_shipping_sendcloud/locale/hu.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/hu.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/id.po b/modules/stock_package_shipping_sendcloud/locale/id.po
new file mode 100644
index 0000000000..c68b4416ff
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/id.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr "Perusahaan"
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr "Alamat"
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/it.po b/modules/stock_package_shipping_sendcloud/locale/it.po
new file mode 100644
index 0000000000..55a16d860e
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/it.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr "Formato"
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr "Indirizzi"
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr "Azienda"
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr "Chiave pubblica"
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr "Chiave segreta"
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr "Metodi"
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr "Indirizzo"
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr "Magazzino"
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr "Vettore"
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr "Metodo di spedizione"
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr "URL di tracciamento"
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr "Lascia vuoto per l'impostazione predefinita di Sendcloud."
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr "Credenziali Sendcloud"
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr "Indirizzo Sendcloud"
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr "Metodo di spedizione Sendcloud"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr "Crea spedizione Sendcloud per i pacchi"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Credenziali Sendcloud"
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"La chiamata al servizio web Sendcloud non è fallita con il seguente messaggio di errore:\n"
+"%(message)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"Non puoi creare un'etichetta di spedizione per la spedizione "
+"\"%(shipment)s\" perché ha già un numero di riferimento."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Credenziali Sendcloud"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr "A4 - In basso a sinistra"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr "A4 - In basso a destra"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr "A4 - In alto a sinistra"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr "A4 - In alto a destra"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr "A6 - Pagina intera"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
diff --git a/modules/stock_package_shipping_sendcloud/locale/lo.po b/modules/stock_package_shipping_sendcloud/locale/lo.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/lo.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/lt.po b/modules/stock_package_shipping_sendcloud/locale/lt.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/lt.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/nl.po b/modules/stock_package_shipping_sendcloud/locale/nl.po
new file mode 100644
index 0000000000..9962b9e83b
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/nl.po
@@ -0,0 +1,131 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr "Formaat"
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr "Adressen"
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr "Bedrijf"
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr "Publieke sleutel"
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr "Geheime sleutel"
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr "Methodes"
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr "Adres"
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr "Magazijn"
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr "Transporteur"
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr "Verzendwijze"
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr "Tracking-URL"
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr "Laat leeg voor de Sendcloud-standaard."
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr "Sendcloud-referentie"
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr "Sendcloud-adres"
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr "Sendcloud Verzendmethode"
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr "Creëer Sendcloud-verzending voor pakketten"
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Sendcloud-referentie"
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+"Bij het oproepen van de Sendcloud webservice is volgende fout opgetreden:\n"
+"%(bericht)s"
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"U kunt geen verzendlabel maken voor verzending \"%(shipment)s\", omdat deze "
+"al een referentienummer heeft."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr "Sendcloud-referentie"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr "A4 - Linksonder"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr "A4 - Rechtsonder"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr "A4 - Linksboven"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr "A4 - Rechtsboven"
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr "A6 - Volledige pagina"
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr "Sendcloud"
diff --git a/modules/stock_package_shipping_sendcloud/locale/pl.po b/modules/stock_package_shipping_sendcloud/locale/pl.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/pl.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/pt.po b/modules/stock_package_shipping_sendcloud/locale/pt.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/pt.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/ro.po b/modules/stock_package_shipping_sendcloud/locale/ro.po
new file mode 100644
index 0000000000..0211ac305c
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/ro.po
@@ -0,0 +1,129 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+"Nu se poate crea o eticheta pentru expedierea \"%(shipment)s\" pentru că are"
+" deja un număr de referinţa."
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/ru.po b/modules/stock_package_shipping_sendcloud/locale/ru.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/ru.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/sl.po b/modules/stock_package_shipping_sendcloud/locale/sl.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/sl.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/tr.po b/modules/stock_package_shipping_sendcloud/locale/tr.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/tr.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/uk.po b/modules/stock_package_shipping_sendcloud/locale/uk.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/uk.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/locale/zh_CN.po b/modules/stock_package_shipping_sendcloud/locale/zh_CN.po
new file mode 100644
index 0000000000..48b66554c3
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/locale/zh_CN.po
@@ -0,0 +1,127 @@
+#
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "field:carrier,sendcloud_format:"
+msgid "Format"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,addresses:"
+msgid "Addresses"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,company:"
+msgid "Company"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,public_key:"
+msgid "Public Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,secret_key:"
+msgid "Secret Key"
+msgstr ""
+
+msgctxt "field:carrier.credential.sendcloud,shipping_methods:"
+msgid "Methods"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,address:"
+msgid "Address"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.address,warehouse:"
+msgid "Warehouse"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,carrier:"
+msgid "Carrier"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,sendcloud:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "field:carrier.sendcloud.shipping_method,shipping_method:"
+msgid "Shipping Method"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:stock.package,sendcloud_shipping_tracking_url:"
+msgid "Tracking URL"
+msgstr ""
+
+msgctxt "help:carrier.sendcloud.address,address:"
+msgid "Leave empty for the Sendcloud default."
+msgstr ""
+
+msgctxt "model:carrier.credential.sendcloud,name:"
+msgid "Sendcloud Credential"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.address,name:"
+msgid "Sendcloud Address"
+msgstr ""
+
+msgctxt "model:carrier.sendcloud.shipping_method,name:"
+msgid "Sendcloud Shipping Method"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_create_shipping_wizard"
+msgid "Create Sendcloud Shipping for Packages"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_sendcloud_webserver_error"
+msgid ""
+"Sendcloud webservice call failed with the following error message:\n"
+"%(message)s"
+msgstr ""
+
+msgctxt "model:ir.message,text:msg_shipment_has_reference_number"
+msgid ""
+"You cannot create a shipping label for shipment \"%(shipment)s\" because it "
+"already has a reference number."
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_credential_form"
+msgid "Sendcloud Credentials"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Bottom right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top left"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A4 - Top right"
+msgstr ""
+
+msgctxt "selection:carrier,sendcloud_format:"
+msgid "A6 - Full page"
+msgstr ""
+
+msgctxt "selection:carrier,shipping_service:"
+msgid "Sendcloud"
+msgstr ""
+
+msgctxt "view:carrier:"
+msgid "Sendcloud"
+msgstr ""
diff --git a/modules/stock_package_shipping_sendcloud/message.xml b/modules/stock_package_shipping_sendcloud/message.xml
new file mode 100644
index 0000000000..38bc7cb35a
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/message.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+ Sendcloud webservice call failed with the following error message:
+%(message)s
+
+
+ You cannot create a shipping label for shipment "%(shipment)s" because it already has a reference number.
+
+
+
diff --git a/modules/stock_package_shipping_sendcloud/setup.py b/modules/stock_package_shipping_sendcloud/setup.py
new file mode 100755
index 0000000000..248f3424b4
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/setup.py
@@ -0,0 +1,163 @@
+#!/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 find_packages, setup
+
+
+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_stock_package_shipping_sendcloud'
+
+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 = ['requests']
+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_sale'),
+ get_require_version('trytond_sale_shipment_cost'),
+ ]
+dependency_links = []
+if minor_version % 2:
+ dependency_links.append(
+ 'https://trydevpi.tryton.org/?local_version='
+ + '.'.join(local_version)
+ )
+
+setup(name=name,
+ version=version,
+ description='Sendcloud connector for the Tryton application platform',
+ 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-stock-package-shipping-sendcloud'),
+ "Forum": 'https://www.tryton.org/forum',
+ "Source Code": (
+ 'https://hg.tryton.org/modules/stock_package_shipping_sendcloud'),
+ },
+ keywords='tryton stock package shipping sendcloud',
+ package_dir={'trytond.modules.stock_package_shipping_sendcloud': '.'},
+ packages=(
+ ['trytond.modules.stock_package_shipping_sendcloud']
+ + ['trytond.modules.stock_package_shipping_sendcloud.%s' % p
+ for p in find_packages()]
+ ),
+ package_data={
+ 'trytond.modules.stock_package_shipping_sendcloud': (
+ 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',
+ 'Natural Language :: Ukrainian',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: Implementation :: CPython',
+ 'Topic :: Office/Business',
+ ],
+ license='GPL-3',
+ python_requires='>=3.7',
+ install_requires=requires,
+ extras_require={
+ 'test': tests_require,
+ },
+ dependency_links=dependency_links,
+ zip_safe=False,
+ entry_points="""
+ [trytond.modules]
+ stock_package_shipping_sendcloud = trytond.modules.stock_package_shipping_sendcloud
+ """, # noqa: E501
+ )
diff --git a/modules/stock_package_shipping_sendcloud/stock.py b/modules/stock_package_shipping_sendcloud/stock.py
new file mode 100644
index 0000000000..64c95a4710
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/stock.py
@@ -0,0 +1,185 @@
+# 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 zip_longest
+
+from trytond.i18n import gettext
+from trytond.model import fields
+from trytond.model.exceptions import AccessError
+from trytond.pool import Pool, PoolMeta
+from trytond.transaction import Transaction
+from trytond.wizard import StateAction, StateTransition, Wizard
+
+
+class Package(metaclass=PoolMeta):
+ __name__ = 'stock.package'
+
+ sendcloud_shipping_id = fields.Integer("ID", readonly=True)
+ sendcloud_shipping_tracking_url = fields.Char(
+ "Tracking URL", readonly=True)
+
+ def get_shipping_tracking_url(self, name):
+ url = super().get_shipping_tracking_url(name)
+ if (self.shipping_reference
+ and self.shipment
+ and self.shipment.id >= 0
+ and self.shipment.carrier
+ and self.shipment.carrier.shipping_service == 'sendcloud'):
+ url = self.sendcloud_shipping_tracking_url
+ return url
+
+ @classmethod
+ def copy(cls, packages, default=None):
+ if default is None:
+ default = {}
+ else:
+ default = default.copy()
+ default.setdefault('sendcloud_shipping_id')
+ default.setdefault('sendcloud_shipping_tracking_url')
+ return super().copy(packages, default=default)
+
+
+class ShippingSendcloudMixin:
+ __slots__ = ()
+
+ def get_sendcloud_credential(self):
+ pool = Pool()
+ SendcloudCredential = pool.get('carrier.credential.sendcloud')
+
+ pattern = self._get_sendcloud_credential_pattern()
+ for credential in SendcloudCredential.search([]):
+ if credential.match(pattern):
+ return credential
+
+ def _get_sendcloud_credential_pattern(self):
+ return {
+ 'company': self.company.id,
+ }
+
+ def validate_packing_sendcloud(self):
+ pass
+
+
+class ShipmentOut(ShippingSendcloudMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.out'
+
+
+class ShipmentInReturn(ShippingSendcloudMixin, metaclass=PoolMeta):
+ __name__ = 'stock.shipment.in.return'
+
+
+class CreateShipping(metaclass=PoolMeta):
+ __name__ = 'stock.shipment.create_shipping'
+
+ sendcloud = StateAction(
+ 'stock_package_shipping_sendcloud.act_create_shipping_wizard')
+
+ def transition_start(self):
+ next_state = super().transition_start()
+ if self.record.carrier.shipping_service == 'sendcloud':
+ next_state = 'sendcloud'
+ return next_state
+
+ def do_sendcloud(self, action):
+ ctx = Transaction().context
+ return action, {
+ 'model': ctx['active_model'],
+ 'id': ctx['active_id'],
+ 'ids': [ctx['active_id']],
+ }
+
+
+class CreateShippingSendcloud(Wizard):
+ "Create Sendcloud Shipping"
+ __name__ = 'stock.shipment.create_shipping.sendcloud'
+
+ start = StateTransition()
+
+ def transition_start(self):
+ pool = Pool()
+ Package = pool.get('stock.package')
+
+ shipment = self.record
+ if shipment.reference:
+ raise AccessError(
+ gettext('stock_package_shipping_sendcloud'
+ '.msg_shipment_has_reference_number',
+ shipment=shipment.rec_name))
+
+ credential = shipment.get_sendcloud_credential()
+ carrier = shipment.carrier
+ packages = shipment.root_packages
+
+ parcels = []
+ for package in packages:
+ parcels.append(self.get_parcel(shipment, package, credential))
+ parcels = credential.create_parcels(parcels)
+
+ for package, parcel in zip_longest(packages, parcels):
+ format_ = shipment.carrier.sendcloud_format.split()
+ label_url = parcel['label']
+ for key in format_:
+ try:
+ index = int(key)
+ except ValueError:
+ key += '_printer'
+ label_url = label_url[key]
+ else:
+ label_url = label_url[index]
+ package.sendcloud_shipping_id = parcel['id']
+ package.shipping_label = credential.get_label(label_url)
+ package.shipping_label_mimetype = carrier.shipping_label_mimetype
+ package.shipping_reference = parcel['tracking_number']
+ package.sendcloud_shipping_tracking_url = parcel['tracking_url']
+ if not shipment.reference:
+ shipment.reference = (
+ parcel['colli_tracking_number']
+ or parcel['tracking_number'])
+ Package.save(packages)
+ shipment.save()
+
+ return 'end'
+
+ def get_parcel(self, shipment, package, credential, usage=None):
+ pool = Pool()
+ UoM = pool.get('product.uom')
+ ModelData = pool.get('ir.model.data')
+
+ cm = UoM(ModelData.get_id('product', 'uom_centimeter'))
+ party = shipment.shipping_to
+ address = shipment.shipping_to_address
+ phone = address.contact_mechanism_get(
+ {'phone', 'mobile'}, usage=usage)
+ email = address.contact_mechanism_get('email', usage=usage)
+ street_lines = (address.street or '').splitlines()
+ parcel = {
+ 'name': address.party_full_name,
+ 'company_name': (
+ party.full_name if party.full_name != address.party_full_name
+ else None),
+ 'address': street_lines[0] if street_lines else '',
+ 'address_2': (
+ ' '.join(street_lines[1:]) if len(street_lines) > 1 else ''),
+ 'city': address.city,
+ 'postal_code': address.postal_code,
+ 'country': address.country.code if address.country else None,
+ 'country_state': (
+ address.subdivision.code.split('-', 1)[1]
+ if address.subdivision else None),
+ 'telephone': phone.value if phone else None,
+ 'email': email.value if email else None,
+ 'sender_address': credential.get_sender_address(shipment),
+ 'external_reference': '/'.join([shipment.number, package.code]),
+ 'quantity': 1,
+ 'order_number': shipment.number,
+ 'weight': package.total_weight,
+ 'length': UoM.compute_qty(package.length_uom, package.length, cm),
+ 'width': UoM.compute_qty(package.width_uom, package.width, cm),
+ 'height': UoM.compute_qty(package.height_uom, package.height, cm),
+ 'request_label': True,
+ }
+ shipping_method = credential.get_shipping_method(shipment)
+ if shipping_method:
+ parcel['shipment'] = {'id': shipping_method}
+ else:
+ parcel['apply_shipping_rules'] = True
+ return parcel
diff --git a/modules/stock_package_shipping_sendcloud/stock.xml b/modules/stock_package_shipping_sendcloud/stock.xml
new file mode 100644
index 0000000000..10b79641dc
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/stock.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+ Create Sendcloud Shipping for Packages
+ stock.shipment.create_shipping.sendcloud
+
+
+
diff --git a/modules/stock_package_shipping_sendcloud/tests/__init__.py b/modules/stock_package_shipping_sendcloud/tests/__init__.py
new file mode 100644
index 0000000000..4effdfa4a2
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/tests/__init__.py
@@ -0,0 +1,2 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
diff --git a/modules/stock_package_shipping_sendcloud/tests/scenario_stock_package_shipping_sendcloud.rst b/modules/stock_package_shipping_sendcloud/tests/scenario_stock_package_shipping_sendcloud.rst
new file mode 100644
index 0000000000..e7f956bb2a
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/tests/scenario_stock_package_shipping_sendcloud.rst
@@ -0,0 +1,232 @@
+=========================================
+Stock Package Shipping Sendcloud Scenario
+=========================================
+
+Imports::
+
+ >>> import os
+ >>> from decimal import Decimal
+ >>> from random import randint
+
+ >>> import requests
+
+ >>> 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)
+ >>> from trytond.modules.stock_package_shipping_sendcloud.carrier import (
+ ... SENDCLOUD_API_URL)
+
+Activate modules::
+
+ >>> config = activate_modules(
+ ... ['stock_package_shipping_sendcloud', 'sale', 'sale_shipment_cost'])
+
+ >>> Address = Model.get('party.address')
+ >>> Carrier = Model.get('carrier')
+ >>> CarrierAddress = Model.get('carrier.sendcloud.address')
+ >>> CarrierShippingMethod = Model.get('carrier.sendcloud.shipping_method')
+ >>> Country = Model.get('country.country')
+ >>> Credential = Model.get('carrier.credential.sendcloud')
+ >>> Location = Model.get('stock.location')
+ >>> Package = Model.get('stock.package')
+ >>> PackageType = Model.get('stock.package.type')
+ >>> Party = Model.get('party.party')
+ >>> ProductCategory = Model.get('product.category')
+ >>> ProductTemplate = Model.get('product.template')
+ >>> ProductUoM = Model.get('product.uom')
+ >>> Sale = Model.get('sale.sale')
+ >>> StockConfiguration = Model.get('stock.configuration')
+ >>> UoM = Model.get('product.uom')
+
+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)
+
+Set random sequence::
+
+ >>> stock_config = StockConfiguration(1)
+ >>> stock_config.shipment_out_sequence.number_next = randint(1, 10**6)
+ >>> stock_config.shipment_out_sequence.save()
+ >>> stock_config.package_sequence.number_next = randint(1, 10**6)
+ >>> stock_config.package_sequence.save()
+
+Create parties::
+
+ >>> belgium = Country(code='BE', name='Belgium')
+ >>> belgium.save()
+ >>> france = Country(code='FR', name='France')
+ >>> subdivision = france.subdivisions.new()
+ >>> subdivision.name = "Paris"
+ >>> subdivision.code = 'FR-75'
+ >>> subdivision.type = 'metropolitan department'
+ >>> france.save()
+ >>> customer = Party(name='Customer')
+ >>> customer.save()
+ >>> customer_address = customer.addresses.new()
+ >>> customer_address.street = 'Champs élysées'
+ >>> customer_address.postal_code = '75008'
+ >>> customer_address.city = 'Paris'
+ >>> customer_address.country = france
+ >>> customer_address.subdivision = france.subdivisions[0]
+ >>> customer_address.save()
+ >>> customer_phone = customer.contact_mechanisms.new()
+ >>> customer_phone.type = 'phone'
+ >>> customer_phone.value = '+33 93 842 8862'
+ >>> customer_phone.save()
+
+Set the warehouse address::
+
+ >>> warehouse, = Location.find([('type', '=', 'warehouse')])
+ >>> company_address = Address()
+ >>> company_address.party = company.party
+ >>> company_address.street = '2 rue de la Centrale'
+ >>> company_address.postal_code = '4000'
+ >>> company_address.city = 'Sclessin'
+ >>> company_address.country = belgium
+ >>> company_address.save()
+ >>> company_phone = company.party.contact_mechanisms.new()
+ >>> company_phone.type = 'phone'
+ >>> company_phone.value = '+32 4 2522122'
+ >>> company_phone.save()
+ >>> warehouse.address = company_address
+ >>> warehouse.save()
+
+Get some units::
+
+ >>> cm, = UoM.find([('symbol', '=', 'cm')])
+ >>> g, = UoM.find([('symbol', '=', 'g')])
+
+Create account 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 product::
+
+ >>> unit, = ProductUoM.find([('name', '=', 'Unit')])
+
+ >>> template = ProductTemplate()
+ >>> template.name = 'product'
+ >>> template.default_uom = unit
+ >>> template.type = 'goods'
+ >>> template.salable = True
+ >>> template.weight = 100
+ >>> template.weight_uom = g
+ >>> template.list_price = Decimal('10')
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> product, = template.products
+
+Create Package Type::
+
+ >>> box = PackageType(
+ ... name="Box",
+ ... length=10, length_uom=cm,
+ ... height=8, height_uom=cm,
+ ... width=1, width_uom=cm)
+ >>> box.save()
+
+Create a Sendcloud Carrier and the related credentials::
+
+ >>> credential = Credential()
+ >>> credential.company = company
+ >>> credential.public_key = os.getenv('SENDCLOUD_PUBLIC_KEY')
+ >>> credential.secret_key = os.getenv('SENDCLOUD_SECRET_KEY')
+ >>> credential.save()
+ >>> address = credential.addresses.new()
+ >>> address.warehouse = warehouse
+ >>> address.address = CarrierAddress.get_addresses(
+ ... {'id': address.id, 'sendcloud': {'id': credential.id}},
+ ... address._context)[-1][0]
+ >>> shipping_method = credential.shipping_methods.new()
+ >>> shipping_method.shipping_method, = [
+ ... m[0] for m in CarrierShippingMethod.get_shipping_methods(
+ ... {'id': shipping_method.id, 'sendcloud': {'id': credential.id}},
+ ... shipping_method._context)
+ ... if m[1] == "Unstamped letter"]
+ >>> credential.save()
+
+ >>> template = ProductTemplate()
+ >>> template.name = "Sendcloud"
+ >>> template.default_uom = unit
+ >>> template.type = 'service'
+ >>> template.salable = True
+ >>> template.list_price = Decimal(20)
+ >>> template.account_category = account_category
+ >>> template.save()
+ >>> carrier_product, = template.products
+
+ >>> sendcloud = Party(name="Sendcloud")
+ >>> sendcloud.save()
+
+ >>> carrier = Carrier()
+ >>> carrier.party = sendcloud
+ >>> carrier.carrier_product = carrier_product
+ >>> carrier.shipping_service = 'sendcloud'
+ >>> carrier.save()
+
+Create a sale and thus a shipment::
+
+ >>> sale = Sale()
+ >>> sale.party = customer
+ >>> sale.shipment_address = customer_address
+ >>> sale.invoice_method = 'order'
+ >>> sale.carrier = carrier
+ >>> sale_line = sale.lines.new()
+ >>> sale_line.product = product
+ >>> sale_line.quantity = 2.0
+ >>> sale.click('quote')
+ >>> sale.click('confirm')
+ >>> sale.click('process')
+
+Create the packages and ship the shipment::
+
+ >>> shipment, = sale.shipments
+ >>> shipment.click('assign_force')
+ >>> shipment.click('pick')
+ >>> pack = shipment.packages.new()
+ >>> pack.type = box
+ >>> pack_move, = pack.moves.find([])
+ >>> pack.moves.append(pack_move)
+ >>> shipment.click('pack')
+
+ >>> create_shipping = Wizard('stock.shipment.create_shipping', [shipment])
+ >>> shipment.reload()
+ >>> bool(shipment.reference)
+ True
+ >>> pack, = shipment.root_packages
+ >>> bool(pack.sendcloud_shipping_id)
+ True
+ >>> pack.shipping_label is not None
+ True
+ >>> pack.shipping_label_mimetype
+ 'application/pdf'
+ >>> pack.shipping_reference is not None
+ True
+ >>> pack.shipping_tracking_url.startswith('http')
+ True
+
+Clean up::
+
+ >>> _ = requests.post(SENDCLOUD_API_URL + 'parcels/%s/cancel' % pack.sendcloud_shipping_id,
+ ... auth=(credential.public_key, credential.secret_key))
diff --git a/modules/stock_package_shipping_sendcloud/tests/test_module.py b/modules/stock_package_shipping_sendcloud/tests/test_module.py
new file mode 100644
index 0000000000..dc25872f8c
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/tests/test_module.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.tests.test_tryton import ModuleTestCase
+
+
+class StockPackageShippingSendcloudTestCase(ModuleTestCase):
+ 'Test Stock Package Shipping Sendcloud module'
+ module = 'stock_package_shipping_sendcloud'
+
+
+del ModuleTestCase
diff --git a/modules/stock_package_shipping_sendcloud/tests/test_scenario.py b/modules/stock_package_shipping_sendcloud/tests/test_scenario.py
new file mode 100644
index 0000000000..a1a5c197f4
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/tests/test_scenario.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.
+
+import os
+
+from trytond.tests.test_tryton import load_doc_tests
+
+if (os.getenv('SENDCLOUD_PUBLIC_KEY')
+ and os.getenv('SENDCLOUD_SECRET_KEY')):
+ def load_tests(*args, **kwargs):
+ return load_doc_tests(__name__, __file__, *args, **kwargs)
diff --git a/modules/stock_package_shipping_sendcloud/tox.ini b/modules/stock_package_shipping_sendcloud/tox.ini
new file mode 100644
index 0000000000..5cb067a731
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = {py37,py38,py39,py310}-{sqlite,postgresql}
+
+[testenv]
+extras = test
+commands =
+ coverage run --include=./**/stock_package_shipping_sendcloud/* -m unittest discover -s tests
+ coverage report --include=./**/stock_package_shipping_sendcloud/* --omit=*/tests/*
+deps =
+ coverage
+ postgresql: psycopg2 >= 2.7.0
+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/stock_package_shipping_sendcloud/tryton.cfg b/modules/stock_package_shipping_sendcloud/tryton.cfg
new file mode 100644
index 0000000000..45755573e2
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/tryton.cfg
@@ -0,0 +1,16 @@
+[tryton]
+version=6.7.0
+depends:
+ carrier
+ company
+ ir
+ party
+ product
+ stock
+ stock_shipment_measurements
+ stock_package
+ stock_package_shipping
+xml:
+ carrier.xml
+ stock.xml
+ message.xml
diff --git a/modules/stock_package_shipping_sendcloud/view/carrier_address_form.xml b/modules/stock_package_shipping_sendcloud/view/carrier_address_form.xml
new file mode 100644
index 0000000000..4d069bfee5
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/view/carrier_address_form.xml
@@ -0,0 +1,14 @@
+
+
+
diff --git a/modules/stock_package_shipping_sendcloud/view/carrier_address_list.xml b/modules/stock_package_shipping_sendcloud/view/carrier_address_list.xml
new file mode 100644
index 0000000000..b6aa131065
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/view/carrier_address_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping_sendcloud/view/carrier_form.xml b/modules/stock_package_shipping_sendcloud/view/carrier_form.xml
new file mode 100644
index 0000000000..b3c02654bc
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/view/carrier_form.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping_sendcloud/view/carrier_shipping_method_form.xml b/modules/stock_package_shipping_sendcloud/view/carrier_shipping_method_form.xml
new file mode 100644
index 0000000000..76d121a722
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/view/carrier_shipping_method_form.xml
@@ -0,0 +1,14 @@
+
+
+
diff --git a/modules/stock_package_shipping_sendcloud/view/carrier_shipping_method_list.xml b/modules/stock_package_shipping_sendcloud/view/carrier_shipping_method_list.xml
new file mode 100644
index 0000000000..700ca8290a
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/view/carrier_shipping_method_list.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping_sendcloud/view/credential_form.xml b/modules/stock_package_shipping_sendcloud/view/credential_form.xml
new file mode 100644
index 0000000000..14b81cf805
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/view/credential_form.xml
@@ -0,0 +1,18 @@
+
+
+
diff --git a/modules/stock_package_shipping_sendcloud/view/credential_list.xml b/modules/stock_package_shipping_sendcloud/view/credential_list.xml
new file mode 100644
index 0000000000..b0563b8f28
--- /dev/null
+++ b/modules/stock_package_shipping_sendcloud/view/credential_list.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/modules/stock_package_shipping_ups/.drone.yml b/modules/stock_package_shipping_ups/.drone.yml
new file mode 100644
index 0000000000..2a43179527
--- /dev/null
+++ b/modules/stock_package_shipping_ups/.drone.yml
@@ -0,0 +1,71 @@
+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 UPS_USER_ID UPS_PASSWORD UPS_LICENSE UPS_ACCOUNT_NUMBER
+ - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/
+ secrets: [ ups_user_id, ups_password, ups_account_number, ups_license ]
+ 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/*
+ volumes:
+ - cache:/root/.cache
+
+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.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
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: sqlite
+ - IMAGE: python:3.10
+ TOXENV: py310
+ DATABASE: postgresql
diff --git a/modules/stock_package_shipping_ups/.flake8 b/modules/stock_package_shipping_ups/.flake8
new file mode 100644
index 0000000000..fa6b4f66d1
--- /dev/null
+++ b/modules/stock_package_shipping_ups/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+ignore=E123,E124,E126,E128,E741,W503
diff --git a/modules/stock_package_shipping_ups/.isort.cfg b/modules/stock_package_shipping_ups/.isort.cfg
new file mode 100644
index 0000000000..e1c6495da9
--- /dev/null
+++ b/modules/stock_package_shipping_ups/.isort.cfg
@@ -0,0 +1,3 @@
+[settings]
+multi_line_output=4
+known_first_party=trytond
diff --git a/modules/stock_package_shipping_ups/CHANGELOG b/modules/stock_package_shipping_ups/CHANGELOG
new file mode 100644
index 0000000000..bb7a7ec6d3
--- /dev/null
+++ b/modules/stock_package_shipping_ups/CHANGELOG
@@ -0,0 +1,47 @@
+Version 6.6.0 - 2022-10-31
+--------------------------
+* Bug fixes (see mercurial logs for details)
+* Use contact mechanism from address
+* Update service types
+
+Version 6.4.0 - 2022-05-02
+* Bug fixes (see mercurial logs for details)
+* Add notification service option
+* Add support for Python 3.10
+* Remove support for Python 3.6
+
+Version 6.2.0 - 2021-11-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
+* Bug fixes (see mercurial logs for details)
+* Use total weight of package
+
+Version 4.2.0 - 2016-11-28
+* Initial release
diff --git a/modules/stock_package_shipping_ups/COPYRIGHT b/modules/stock_package_shipping_ups/COPYRIGHT
new file mode 100644
index 0000000000..1a03f5236a
--- /dev/null
+++ b/modules/stock_package_shipping_ups/COPYRIGHT
@@ -0,0 +1,15 @@
+Copyright (C) 2016-2022 B2CK.
+Copyright (C) 2016-2022 Nicolas Évrard.
+
+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/stock_package_shipping_ups/LICENSE b/modules/stock_package_shipping_ups/LICENSE
new file mode 100644
index 0000000000..94a9ed024d
--- /dev/null
+++ b/modules/stock_package_shipping_ups/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/stock_package_shipping_ups/MANIFEST.in b/modules/stock_package_shipping_ups/MANIFEST.in
new file mode 100644
index 0000000000..f7e7aaa36b
--- /dev/null
+++ b/modules/stock_package_shipping_ups/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGELOG
+include COPYRIGHT
+include LICENSE
+include README.rst
+include icons/LICENSE
+graft doc
diff --git a/modules/stock_package_shipping_ups/README.rst b/modules/stock_package_shipping_ups/README.rst
new file mode 120000
index 0000000000..176d9c2695
--- /dev/null
+++ b/modules/stock_package_shipping_ups/README.rst
@@ -0,0 +1 @@
+doc/index.rst
\ No newline at end of file
diff --git a/modules/stock_package_shipping_ups/__init__.py b/modules/stock_package_shipping_ups/__init__.py
new file mode 100644
index 0000000000..9e8d4a2292
--- /dev/null
+++ b/modules/stock_package_shipping_ups/__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 carrier, stock
+
+
+def register():
+ Pool.register(
+ stock.PackageType,
+ stock.Package,
+ stock.ShipmentOut,
+ stock.ShipmentInReturn,
+ carrier.CredentialUPS,
+ carrier.Carrier,
+ module='stock_package_shipping_ups', type_='model')
+ Pool.register(
+ stock.CreateShipping,
+ stock.CreateShippingUPS,
+ module='stock_package_shipping_ups', type_='wizard')
diff --git a/modules/stock_package_shipping_ups/carrier.py b/modules/stock_package_shipping_ups/carrier.py
new file mode 100644
index 0000000000..713ed9c5bd
--- /dev/null
+++ b/modules/stock_package_shipping_ups/carrier.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.model import (
+ MatchMixin, ModelSQL, ModelView, fields, sequence_ordered)
+from trytond.pool import PoolMeta
+from trytond.pyson import Eval
+
+
+class CredentialUPS(sequence_ordered(), ModelSQL, ModelView, MatchMixin):
+ 'UPS Credential'
+ __name__ = 'carrier.credential.ups'
+
+ company = fields.Many2One('company.company', 'Company')
+ user_id = fields.Char('User ID', required=True)
+ password = fields.Char('Password', required=True)
+ license = fields.Char('License', required=True)
+ account_number = fields.Char('Account Number', required=True)
+ use_metric = fields.Boolean('Use Metric')
+ server = fields.Selection([
+ ('testing', 'Testing'),
+ ('production', 'Production'),
+ ], 'Server')
+
+ @classmethod
+ def default_use_metric(cls):
+ return True
+
+ @classmethod
+ def default_server(cls):
+ return 'testing'
+
+
+class Carrier(metaclass=PoolMeta):
+ __name__ = 'carrier'
+
+ ups_service_type = fields.Selection([
+ (None, ''),
+ ('01', 'Next Day Air'),
+ ('02', '2nd Day Air'),
+ ('03', 'Ground'),
+ ('07', 'Express'),
+ ('08', 'Expedited'),
+ ('11', 'UPS Standard'),
+ ('12', '3 Days Select'),
+ ('13', 'Next Day Air Saver'),
+ ('14', 'UPS Next Day Air Early'),
+ ('17', "UPS Worldwide Economy DDU"),
+ ('54', 'Express Plus'),
+ ('59', '2nd Day Air A.M.'),
+ ('65', 'UPS Saver'),
+ ('M2', 'First Class Mail'),
+ ('M3', 'Priority Mail'),
+ ('M4', 'Expedited Mail Innovations'),
+ ('M5', 'Priority Mail Innovations'),
+ ('M6', 'Economy Mail Innovations'),
+ ('M7', "Mail Innovations (MI) Returns"),
+ ('70', 'UPS Access Point Economy'),
+ ('71', "UPS Worldwide Express Freight Midday"),
+ ('72', "UPS Worldwide Economy DDP"),
+ ('74', "UPS Express 12:00"),
+ ('82', 'UPS Today Standard'),
+ ('83', 'UPS Today Dedicated Courier'),
+ ('84', 'UPS Today Intercity'),
+ ('85', 'UPS Today Express'),
+ ('86', 'UPS Today Express Saver'),
+ ('96', 'UPS Worldwide Express Freight'),
+ ], 'Service Type', sort=False, translate=False,
+ states={
+ 'required': Eval('shipping_service') == 'ups',
+ 'invisible': Eval('shipping_service') != 'ups',
+ })
+ ups_label_image_format = fields.Selection([
+ (None, ''),
+ ('EPL', 'EPL2'),
+ ('SPL', 'SPL'),
+ ('ZPL', 'ZPL'),
+ ('GIF', 'GIF'),
+ ('STARPL', 'Star Printer'),
+ ], 'Label Image Format', sort=False, translate=False,
+ states={
+ 'required': Eval('shipping_service') == 'ups',
+ 'invisible': Eval('shipping_service') != 'ups',
+ })
+ ups_label_height = fields.Selection([
+ (None, ''),
+ ('6', '6'),
+ ('8', '8'),
+ ], 'Label Height', sort=False, translate=False,
+ states={
+ 'required': ((Eval('shipping_service') == 'ups')
+ & (Eval('ups_label_image_format') != 'GIF')),
+ 'invisible': ((Eval('shipping_service') != 'ups')
+ | (Eval('ups_label_image_format') == 'GIF')),
+ })
+ ups_notifications = fields.MultiSelection([
+ ('5', "Quantum View In-transit"),
+ ('6', "Quantum View Shop"),
+ ('7', "Quantum View Exception"),
+ ('8', "Quantum View Delivery"),
+ ('2', "Return or Label Creation"),
+ ('012', "Alternate Delivery Location"),
+ ('013', "UPS Access Point Shipper"),
+ ], "Notifications", sort=False,
+ states={
+ 'invisible': Eval('shipping_service') != 'ups',
+ })
+
+ @classmethod
+ def __setup__(cls):
+ super(Carrier, cls).__setup__()
+ cls.shipping_service.selection.append(('ups', 'UPS'))
+
+ @classmethod
+ def view_attributes(cls):
+ return super(Carrier, cls).view_attributes() + [
+ ("/form/separator[@id='ups']", 'states', {
+ 'invisible': Eval('shipping_service') != 'ups',
+ }),
+ ]
+
+ @property
+ def shipping_label_mimetype(self):
+ mimetype = super().shipping_label_mimetype
+ if self.shipping_service == 'ups':
+ if self.ups_label_image_format == 'GIF':
+ mimetype = 'image/gif'
+ return mimetype
diff --git a/modules/stock_package_shipping_ups/carrier.xml b/modules/stock_package_shipping_ups/carrier.xml
new file mode 100644
index 0000000000..fe220da04e
--- /dev/null
+++ b/modules/stock_package_shipping_ups/carrier.xml
@@ -0,0 +1,66 @@
+
+
+
+